一步步教你如何搭建K8S集群

news2024/11/19 6:32:27

一、环境配置

三台CentOS7虚拟机,默认配置,内存2GB、处理器2核心。

先更新下系统

1 sudo yum update
2 sudo yum upgrade

二、安装并启动 docker

1 yum -y install wget
2 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo
3 yum -y install docker-ce
4 systemctl enable docker
5 systemctl start docker

三、安装 kubeadm

1、配置阿里源

官网这种带 google 的一看就会被墙,我们直接使用阿里的源:

复制代码

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

复制代码

设置完源后再更新一下:

sudo yum update

2、禁用 SELinux

将 SELinux 设置为 permissive 模式,相当于将其禁用

1 sudo setenforce 0
2 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

3、关闭防火墙

1  systemctl stop firewalld
2  systemctl disable firewalld

4、关闭 swap

swapoff -a

5、安装并启用 kubelet

1 sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
2 sudo systemctl enable --now kubelet

四、部署主节点

1、查看 kubeadm 版本信息

kubeadm config print init-defaults
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.27.0

其中 apiVersion 和 kubernetesVersion 需要和下面编写的 kubeadm.yml 保持一致。

2、编写 kubeadm.yaml

复制代码

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.27.0
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
  extraArgs:
    runtime-config: "api/all=true"
etcd:
  local:
    dataDir: /data/k8s/etcd

复制代码

3、运行 kubelet.service

systemctl enable kubelet.service

4、启动容器运行时

1 rm -rf /etc/containerd/config.toml
2 systemctl restart containerd

5、使网桥支持 ip6

复制代码

1 cd /etc/sysctl.d/
2 vi k8s-sysctl.conf
3 #添加如下文本
4 net.bridge.bridge-nf-call-ip6tables = 1
5 net.bridge.bridge-nf-call-iptables = 1
6 #使其生效
7 sysctl -p k8s-sysctl.con

复制代码

6、部署 master

kubeadm init --config kubeadm.yaml

五、ERROR

虽然上面 4~5 等步骤解决了一些警告,以及报错,但最终步骤8还是跑不起来,将版本换到 1.23.xx 再试试

1、卸载安装的 kubeadm

sudo yum remove kubelet kubeadm kubectl

2、重新安装指定版本 kubeadm

yum install kubelet-1.23.17 kubeadm-1.23.17  kubectl-1.23.17 kubernetes-cni

3、启用 kubelet

sudo systemctl enable --now kubelet

4、查看 kubeadm 版本信息

5、修改 kubeadm.yaml 版本为 1.23.0

6、部署 master

六、ERROR

降低版本后又出现如下报错:

复制代码

[init] Using Kubernetes version: v1.23.0
[preflight] Running pre-flight checks
    [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 24.0.2. Latest validated version: 20.10
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
    [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
    [ERROR Port-10250]: Port 10250 is in use
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

复制代码

1、首先需要将 24.0.2 版本的 Docker 降级为 20.10 的版本

访问 Docker 版本 可查看 docker-ce 版本:

yum downgrade --setopt=obsoletes=0 -y docker-ce-20.10.24 docker-ce-selinux-20.10.24 containerd.io

2、重置 kubeadm

kubeadm reset

3、部署 master

7、ERROR

呕、变着花样报错:

复制代码

Unfortunately, an error has occurred:
        timed out waiting for the condition

    This error is likely caused by:
        - The kubelet is not running
        - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

    If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
        - 'systemctl status kubelet'
        - 'journalctl -xeu kubelet'

    Additionally, a control plane component may have crashed or exited when started by the container runtime.
    To troubleshoot, list all containers using your preferred container runtimes CLI.

    Here is one example how you may list all Kubernetes containers running in docker:
        - 'docker ps -a | grep kube | grep -v pause'
        Once you have found the failing container, you can inspect its logs with:
        - 'docker logs CONTAINERID'

复制代码

1、先看一下 kubelet 是否在运行

systemctl status kubelet

2、输入如下命令查看报错日志

journalctl -xefu kubelet 

复制代码

May 28 23:23:50 localhost.localdomain kubelet[19052]: E0528 23:23:50.235324   19052 server.go:302] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""
May 28 23:23:50 localhost.localdomain systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE
May 28 23:23:50 localhost.localdomain systemd[1]: Unit kubelet.service entered failed state.
May 28 23:23:50 localhost.localdomain systemd[1]: kubelet.service failed.

复制代码

3、Google或百度下报错原因

kubelet cgroup driver: \“systemd\“ is different from docker cgroup driver: \“cgroupfs\“

上面说是 Docker 和 kubelet 的 cgroup driver 不一样,kubelet 的是 systemd,docker 的是 cgroupfs。

3.1 将 docker 的改成 systemd:

复制代码

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://gmkz82n7.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]  
}
EOF

复制代码

registry-mirrors 是为了配置镜像加速器,exec-opts 才是将 docker 的 cgroup driver 改成 systemd。

镜像加速器地址可以在阿里云官网搜容器镜像服务,然后找到镜像加速器。

3.2 重启 docker:

1 sudo systemctl daemon-reload
2 sudo systemctl restart docker

3.3 查看 docker 的 cgroup

docker info

3.4 重置 kubeadm

kubeadm reset

3.5 部署 master

八、主节点部署成功标志

上图说了要启动集群需要执行的命令:

1 mkdir -p $HOME/.kube
2 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3 sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

最后,你应该部署一个 pod 网络附加组件,可参考 weaveworks网站 进行部署:

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

检查部署状态:

kubectl get pods -n kube-system

从失败到成功大概可能要个五分钟左右吧。

九、部署工作节点

1、重复步骤 一 ~ 三,安装 kubeadmin。

提醒:

  • Docker 不要安装太高版本,或者可按步骤先安装后降级
  • Docker 的 cgroup driver 驱动需要改成 systemd
  • kubeadm 不要默认安装最新版,要安装指定版本
  • 禁用 SELinux,禁用 swap
  • 关闭防火墙

2、加入节点

kubeadm join 192.168.33.133:6443 --token rodccq.t8fooat0paxcof56 \
    --discovery-token-ca-cert-hash sha256:64e91a185d8929b23c987683ffae359e62b09fb94e035322d511addbd065fb02

十、ERROR

说是 token 过期了,不过我主节点出现这个 token 到部署 WorkNode 不过一小时。

那么重新生成一下 Token 看看:

kubeadm token create --print-join-command

出现如下命令:

kubeadm join 192.168.33.133:6443 --token vz24u8.4h5vuriszbns3cfi --discovery-token-ca-cert-hash sha256:64e91a185d8929b23c987683ffae359e62b09fb94e035322d511addbd065fb02

在 WorkNode 上执行一下上面命令,过了几分钟后,还是出现同样报错。

网上搜到说本地时间错误同样会导致证书过期报错,检查一下两台机器的本地时间

date

发现确实不对,同步时间命令,两台机器都执行一下:

1 sudo yum install ntpdate
2 ntpdate ntp1.aliyun.com

MasterNode 重新生成下 token,WorkNode 执行加入节点命令。

很遗憾的是我的虚拟机上的主节点突然宕机了,并且之后换了一个 IP,然后我又立马给它起起来了。

然后再 MasterNode 重新生成下 token,WorkNode 执行加入节点命令。

继续报错,如果你们的没有像我一样突然发生宕机,可能不会出现这样的问题:

You must delete the existing Node or change the name of this new joining

然后我就给新加入的节点重命名主机名:

hostnamectl set-hostname node01

再重新加入,然后又报了一个错:

[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists

这需要重置一下 kubeadm:

kubeadm reset

再再重新加入,终于成功了:

接着我们运行一下查看节点的命令:(注意,需要在有 control-plane 组件的节点查看,目前只有主节点有)

kubectl get nodes

那我们在主节点上运行看看:

这个命令我在主节点上执行了三次,第一次是工作节点还没加入前,第二次是工作节点加入后,可以看到 node01 状态是 NotReady,过了几分钟后,我又执行了一次,node01 的状态变成了 Ready。

最后我们再按照加入子节点的步骤,再加入一台机器:

 一个主节点、两个工作节点 K8S 集群搭建完成。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity中Shader需要了解的点与向量

文章目录 前言一、点和向量的区别二、向量加法减法1、向量加法2、向量减法(可以把向量减法转化为向量加法) 三、向量的模四、标量![在这里插入图片描述](https://img-blog.csdnimg.cn/03df81df3cdf47989a11605d5f5e7da5.png)1、向量与标量的乘法 前言 Unity中Shader了解使用的…

3个变化3秒区别MT4和MT5

自从mt5上市以来&#xff0c;很多投资者无法快速区别MT4和MT5&#xff0c;其实很简单&#xff0c;通过3个变化anzo capital昂首资本3秒一眼区别。 外观区别 很难从视觉上定义MT4和MT5的区别。在新的平台版本中&#xff0c;开发者专注于平台功能的升级&#xff0c;几乎没有改变…

node 解决多版本配置 error:03000086:digital 引起的问题 已解决

在日常后端工作中&#xff0c;难免会安装前端的项目&#xff0c;今天有旧项目需要维护&#xff0c;但是 提示 node版本过高&#xff0c;或者不是长维护版本&#xff0c;部分分享说&#xff0c;加 opensll 过滤能解决&#xff0c;但是 还是不行&#xff0c;索性来这个 底朝天的找…

阿里云服务器共享型和企业级独享有什么区别?

阿里云ECS云服务器共享型和企业级有什么区别&#xff1f;企业级就是独享型&#xff0c;共享型和企业级云的主要区别CPU调度模式&#xff0c;共享型是非绑定CPU调度模式&#xff0c;企业级是固定CPU调度模式&#xff0c;共享型云服务器在高负载时计算性能可能出现波动不稳定&…

XC1336 高侧过压保护器 30V过压保护IC 可做OVP、高压开关

XC1336是一个高压30V过电压保护器&#xff08;OVP&#xff09;&#xff0c;其电阻较低&#xff0c;只需改变外部连接。它可以用作OVP设备或高压开关。 XC1336由一个电荷泵、一个可配置的功率MOSFET、一个电压参考、一个栅极驱动器和一些逻辑和保护模块组成。 XC1336可以对输入浪…

Linux发行版X华为鲲鹏openEuler

前言 作为硬件和软件之间的桥梁&#xff0c;我接触的最多的就是Windows和Centos&#xff0c;还记得最初的鸟哥的Linux私房菜&#xff0c;而Centos即将停止维护更新&#xff08;Centos7维护到2024&#xff09;&#xff0c;对于个人学习来说没有任何影响&#xff0c;但是对于企业…

算法通过村第十关-快排|白银笔记|快排实战

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 文章目录 前言数组第K大总结 前言 这是快排中的经典算法题&#xff0c;但是很多…

C语言 Cortex-A7核 SPI 实验

1 实验目的 1、数码管显示相同的值0000 1111 2222 .... 9999 2、数码管不同的值1234 2 代码 include/spi.h #ifndef __SPI_H__ #define __SPI_H__ #includ…

ROS2 从头开始​​:第 2 部分 - 包、发布者和订阅者

一、说明 在这篇文章中,我们将重点关注 ROS 2 包、发布者和订阅者。具体来说,我们将涵盖以下主题:1. 什么是 ROS 2 包以及为什么它很重要?2.如何使用ros2 pkg create命令创建ROS 2包? 3. 如何使用该rclcpp库在ROS 2中创建发布者和订阅者? 让我们开始吧! 二、套…

世界第一ERP厂商SAP,推出类ChatGPT产品—Joule

9月27日&#xff0c;世界排名第一ERP厂商SAP在官网宣布&#xff0c;推出生成式AI助手Joule&#xff0c;并将其集成在采购、供应链、销售、人力资源、营销、数据分析等产品矩阵中&#xff0c;帮助客户实现降本增效。 据悉&#xff0c;Joule是一款功能类似ChatGPT的产品&#xf…

HONEYWELL 05704-A-0144 端子模块

HONEYWELL 05704-A-0144 端子模块用于连接电缆、导线或连接器&#xff0c;以便将电信号或电源引出到不同的部件或设备中。这些模块在各种工业和电子应用中都有广泛的用途&#xff0c;通常具有以下特点&#xff1a; 连接性&#xff1a;HONEYWELL 05704-A-0144 端子模块提供可靠的…

[C++ 网络协议] I/O流分离所带来的半关闭问题

1.问题和解决方法 根据所学内容&#xff0c;I/O流分离现如今有如下2种方法&#xff1a; 1.调用进程fork函数&#xff0c;分离出子进程&#xff0c;主进程和子进程分别进行输入流的读和输出流的写。 2.用FILE指针按读模式和写模式将输入流和输出流进行区分。 第一种方法&#…

【word密码】为什么word设置只读模式之后,还能编辑?

Word文档设置了只读模式&#xff0c;是可以编辑的&#xff0c;但是当我们进行保存的时候就会发现&#xff0c;word提示需要重命名并选择新路径才能够保存。 这种操作&#xff0c;即使可以编辑文字&#xff0c;但是原文件是不会受到影响的&#xff0c;编辑之后的word文件会保存到…

外汇天眼:Patrick Wonsey挪用340万美元!涉嫌外汇和二元期权欺诈

美国衍生品市场监管机构商品期货交易委员会&#xff08;CFTC&#xff09;宣布&#xff0c;已在佛罗里达州中区地区法院对佛罗里达州里维尤(Riverview)的Patrick Wonsey提起民事执法诉讼。 诉状指控Wonsey涉嫌欺诈和挪用资金&#xff0c;与一项涉及杠杆或保证金的零售外汇&…

变电站无人值守方案:提升效率与增强安全性

随着信息技术、人工智能、大数据的发展进步&#xff0c;电力行业正逐步向智能化转型。其中&#xff0c;无人值守变电站成为了现代电力系统的明显趋势。这种新型的运营模式不仅提高了效率&#xff0c;还极大地增强了电力系统的安全性。 无人值守变电站的核心概念是在没有人类现场…

探索UML类图:软件建模的关键概念和Visual Paradigm的优势

引言&#xff1a; 在软件开发领域&#xff0c;UML&#xff08;统一建模语言&#xff09;是一种广泛使用的建模语言&#xff0c;用于可视化和描述软件系统的结构和行为。其中&#xff0c;UML类图是最常用的一种图表类型之一&#xff0c;用于表示系统中的类、对象和它们之间的关系…

SI3262—高度集成的低功耗SOC芯片

Si3262是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等…

【力扣每日一题】2023.9.27 餐厅过滤器

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目挺长&#xff0c;估计中等难度是给在了阅读理解上。 简单来说就是给我们一堆餐厅的信息&#xff0c;每个餐厅拥有五个属性&#xff…

大采购3.0荣膺中国软件行业协会“2023年度优秀软件产品”

近日&#xff0c;中国软件行业协会公布“2023年度优秀软件产品”名单&#xff0c;北京筑龙潜心打造的基于云原生、微服务、中台化的B-PaaS云私一体化采购供应链平台--大采购3.0荣膺“2023年度优秀软件产品”。本次获奖&#xff0c;充分表明北京筑龙在采购供应链领域数字化转型成…

【node】发送邮件及附件简要使用说明

Nodemailer是一个用于Node.js应用程序的模块&#xff0c;可以轻松发送电子邮件。该项目始于2010年&#xff0c;当时没有合理的选项来发送电子邮件消息&#xff0c;如今它是大多数Node.js用户默认选择的解决方案。 一、环境配置 安装模块&#xff1a;nodemailer npm i nodema…