使用kubeadm部署 K8s集群(实践100%成功)
目录
2、添加 overlay 和 br_netfilter内核模块
1、安装规划
此环境下需要3台主机,主机地址和角色如下表所示:
|
主机名 |
IP地址 |
集群角色 |
|
k8smaster |
192.168.123.100 |
master |
|
k8swork1 |
192.168.123.101 |
k8swork1 |
|
k8swork2 |
192.168.123.129 |
k8swork2 |
- 配置主机名配置和主机名解析,每个机器上都需要执行
[root@DB1 ~]# more /etc/hosts
127.0.0.1 localhost
192.168.123.100 k8smaster
192.168.123.101 k8swork1
192.168.123.129 k8swork2
#对应机器执行
[root@DB1 ~]# hostnamectl set-hostname k8smaster &&bash
[root@DB1 ~]# hostnamectl set-hostname k8swork1 &&bash
[root@DB1 ~]# hostnamectl set-hostname k8swork2 &&bash
2、添加 overlay 和 br_netfilter内核模块
对于 kuberetes 集群,我们必须在所有节点上添加 overlay 和 br_netfilter 内核模块。
这两步的唯一目的: 让 Linux 内核支持 Kubernetes 必须的「容器网络」和「桥接流量转发」没有这两个模块,K8s 集群根本无法通信,Pod 之间、节点之间都会断网!
[root@k8smaster k8s]#tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
[root@master1 kernel]# modprobe overlay
[root@master1 kernel]# modprobe br_netfilter

3、开启IPVS支持
作用:为 K8s 开启 IPVS 高性能负载均衡,server模块
创建/etc/modules-load.d/ipvs.conf文件,3台机器都执行,内容如下:
[root@k8swork1 ~]# cat >/etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
nf_conntrack
EOF
重启系统,然后查看模块加载:
[root@master1 kernel]# reboot
[root@master1 kernel]# lsmod | grep ip_vs

4、关闭防火墙、selinux
K8s集群每个节点都需要关闭防火墙,执行如下操作:
[root@master1 kernel]# setenforce 0
[root@master1 kernel]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
[root@master1 kernel]# grubby --update-kernel ALL --argsselinux=0
接着,还需要关闭系统的交换分区,执行如下命令:
[root@master1 kernel]# swapoff -a
[root@master1 kernel]# cp /etc/fstab /etc/fstab.bak
[root@master1 kernel]# cat /etc/fstab.bak | grep -v swap > /etc/fstab
然后,还需要修改iptables设置,在/etc/sysctl.conf中添加如下内容:
vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
最后,执行如下命令,以使设置生效:
[root@master1 kernel]# sysctl -p
5、安装 Containerd与配置加速器
1. 安装依赖工具 安装 containerd / docker 必需的系统依赖,没有这些装不上容器引擎。
2. 添加阿里云 Docker 软件源
3. 查看 containerd 版本
[root@k8smaster ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@k8smaster ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8smaster ~]# yum list | grep containerd

![]()
可以选择安装一个版本,比如我这里安装最新版本: 安装 K8s 必须的容器引擎,用来启动、管理容器。
[root@k8smaster ~]# dnf install containerd.io -y

4.生成containerd配置文件: 配置 containerd 证书目录,为后续配置私有镜像仓库 / 加速做准备
[root@k8smaster ~]# mkdir -p /etc/containerd
[root@k8smaster ~]# containerd config default > /etc/containerd/config.toml
然后打开config.toml文件,找到如下内容:
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = " "
将config_path的值修改为如下:
config_path = "/etc/containerd/certs.d"

5.配置containerd镜像加速器
镜像加速器不配置,99% 会拉取镜像失败、集群起不来 ,docker.io 加速 → 拉取业务镜像(Docker Hub),registry.k8s.io 加速 → 拉取 K8s 官方核心镜像这是 最标准、最稳定、最适合国内环境 的 containerd 镜像加速配置
docker hub镜像加速
[root@k8smaster ~]# mkdir -p /etc/containerd/certs.d/docker.io
[root@k8smaster ~]# cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://hub.geekery.cn"]
capabilities = ["pull", "resolve"]
[host."https://docker.rainbond.cc"]
capabilities = ["pull", "resolve"]
EOF
registry.k8s.io镜像加速
[root@k8smaster ~]# mkdir -p /etc/containerd/certs.d/registry.k8s.io
[root@k8smaster ~]# tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"
[host."https://ghcr.geekery.cn"]
capabilities = ["pull", "resolve", "push"]
[host."https://k8s.chenby.cn"]
capabilities = ["pull", "resolve", "push"]
EOF

7、修改containerd配置文件
上面加速器配置完成后,其实就无需修改k8s任何配置文件了,但是考虑到加速器不稳定性,还是建议配置为国内镜像源
(1)替换配置文件
1. 把 K8s 镜像仓库替换为 阿里云国内源
2. 把 cgroup 驱动改为 systemd(K8s 强制要求)
[root@k8smaster ~]# sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
[root@k8smaster ~]# sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
(2)启动Containerd:
让刚才修改的镜像仓库、cgroup、加速器配置全部生效
[root@k8smaster ~]# systemctl daemon-reload && systemctl enable containerd && systemctl restart containerd

8、安装Kubeadm、kubelet、kubectl工具
- 配置 kubernetes.repo用阿里云国内源安装 K8s,速度快、不失败。
- 安装 kubelet、kubeadm、kubectl
kubelet:节点核心代理,运行在所有节点,管理 Podkubeadm:集群初始化工具(Only Master)kubectl:集群命令行工具(Only Master)- 开机自启 kubelet服务器重启后,K8s 能自动恢复。
在确保 Containerd安装完成后,系统基础环境配置也完成后,现在我们就可以来安装 Kubeadm、kubelet了,我这里是通过指定yum 源的方式来进行安装,使用阿里云的源进行安装:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=0
repo_gpgcheck=0
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
然后安装 kubeadm、kubelet、kubectl,可先查询可安装的版本,然后指定版本进行安装。我这里指定的版本是1.31.1

下面进行安装:
yum install -y kubelet kubeadm kubectl cri-tools --disableexcludes=kubernetes
然后将 kubelet设置成开机启动:
systemctl daemon-reload && systemctl enable kubelet && systemctl start kubelet
9、安装containerd命令行工具crictl
在安装kubelet等工具的时候已经自动安装了crictl,要使用这个命令,还需要做以下配置:
- 安装 kubelet 时会自动装上 crictl
- 必须创建 /etc/crictl.yaml 才能让命令连接 containerd
- 套接字路径必须正确,否则命令无法使用
使用crictl连接containerd,需要创建/etc/crictl.yaml,写入以下内容;
cat > /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
让 crictl 命令找到 containerd 的通信接口,这样才能用命令查看、管理 K8s 的容器和镜像。
这里注意runtime-endpoint 和image-endpoint必须与/etc/containerd/config.toml中对应项的配置保持一致。
验证
crictl ps
crictl images

10、初始化k8s集群
执行如下命令:
-
- 查看默认初始化配置
- 查看默认镜像(国外源,国内无法下载)
- 查看阿里云可用镜像
- 生成初始化配置文件,方便修改
[root@master ~]# kubeadm config print init-defaults
[root@master ~]# kubeadm config images list
[root@master ~]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
其中:
第一个命令用来查看安装k8s的相关信息,主要是安装源和版本。
第二条命令是查询需要的镜像,从输出可在,默认是从registry.k8s.io这个地址下载镜像,此地址国内无法访问,因此需要修改默认下载镜像的地址。
第三条命令是设置k8s镜像仓库为阿里云镜像站地址,查看一下需要下载的镜像在阿里云镜像站中是否都有。

接着,在 master 节点配置 kubeadm初始化文件,可以通过如下命令导出默认的初始化配置:
[root@master ~]# kubeadm config print init-defaults > kubeadm.yaml
然后根据我们自己的需求修改配置,这里修改的有advertiseAddress、criSocket、name、imageRepository、kubernetesVersion的值,同时,添加了kube-proxy的模式为ipvs,,并且,需要注意的是,由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd。需要改四个地方如下:

下面的版本信息需要查询一下
kubectl version


最后在生成的kubeadm.yaml文件最后,添加如下内容到文件最后:
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
在保证所需要的镜像都可以正常下载后,使用上面的配置文件进行初始化:
初始化集群:
root@k8smaster ~]# kubeadm init --config=kubeadm.yaml
如果出现如下报错,执行yum install -y conntrack即可
[ERROR FileExisting-conntrack]: conntrack not found in system path
[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
[root@DB1 ~]# yum install -y conntrack

如上所示初始化完成,根据提示,在master节点执行如下操作
mkdir -p $HOME/.kube
sudocp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudochown $(id -u):$(id -g) $HOME/.kube/config
为了使用更便捷,启用 kubectl命令的自动补全功能。

[root@master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
现在kubectl可以使用了
11、添加集群节点
初始化集群的操作是在master节点完成的,接下来,要将work节点加入到集群中,首先需要在每个node节点上执行基础配置工作,主要有关闭防火墙和selinux、禁用swap、配置主机名解析、启动网络桥接功能以及启动kubeket服务并设置开机自启,这些已经在前面介绍过,这里不再多说了。
下面介绍下如何添加nodes到集群中,执行如下命令:
[root@master ~]# kubeadm join 172.16.213.221:6443 --token bnefy8.d79yn6ylxlk7k8hr --discovery-token-ca-cert-hash sha256:eaa17f4b308e9406891f85f664c0d2c97a49bd9e963f64c9453b7042509e106c

如下显示则表示节点加入集群了

这里的–token来自前面kubeadminit输出提示,如果当时没有记录下来可以通过如下命令找回, token是有24小时有效期的:
[root@master ~]# kubeadm token create --ttl 0 --print-join-command
执行成功后运行 get nodes 命令
[root@k8smaster ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8smaster NotReady control-plane,master 29m v1.31.3
k8swork1 NotReady <none> 28m v1.31.3
k8swork1 NotReady <none> 28m v1.31.3
可以看到是,两个节点都是NotReady状态,这是因为还没有安装网络插件。

12、安装网络插件
接下来安装网络插件。网络插件可以选择calico和flannel,这里我们使用calico。
[root@k8smaster ~]# wget https://docs.projectcalico.org/manifests/calico.yaml
安装calico网络插件
[root@k8smaster ~]# kubectl apply -f calico.yaml
此插件的安装过程,需要下载三个镜像文件,下载完成,网络插件即可正常工作。等网络插件镜像下载完成以后,看到node的状态会变成ready,执行如下命令查看:
[root@k8smaster ~]# kubectl get node
如果发现某个节点还是处于NotReady状态,可以重启此节点的kubelet服务,然后此节点就会重新下载需要的镜像。
最后,执行如下命令,查看pod状态:
[root@master ~]# kubectl get pods -n kube-system
如果发现一直不能拉取,看我下述操作
1. 确认需要哪些镜像
# 查看所有拉取失败的镜像
kubectl get pods -n kube-system -o jsonpath=\
'{range .items[*]}{range .spec.initContainers[*]}{.image}{"\n"}{end}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' \
| sort -u | grep calico
2. 在每个节点拉取并打 tag
必须在 k8smaster、k8swork1、k8swork2 上都执行:
# 拉取(替换为实际版本号)
ctr -n k8s.io images pull docker.m.daocloud.io/calico/cni:v3.25.0
ctr -n k8s.io images pull docker.m.daocloud.io/calico/node:v3.25.0
ctr -n k8s.io images pull docker.m.daocloud.io/calico/kube-controllers:v3.25.0
# 打 tag 为原始名称
ctr -n k8s.io images tag docker.m.daocloud.io/calico/cni:v3.25.0 docker.io/calico/cni:v3.25.0
ctr -n k8s.io images tag docker.m.daocloud.io/calico/node:v3.25.0 docker.io/calico/node:v3.25.0
ctr -n k8s.io images tag docker.m.daocloud.io/calico/kube-controllers:v3.25.0 docker.io/calico/kube-controllers:v3.25.0
# 验证三个镜像都在
ctr -n k8s.io images ls | grep "docker.io/calico"
3. 重建 Pod
# 回到 master 执行
kubectl delete pod -n kube-system -l k8s-app=calico-node
kubectl delete pod -n kube-system -l k8s-app=calico-kube-controllers

拉取成功
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)