使用kubeadm工具安装部署Kubernetes 1.26.2

时间:2021-09-01 01:07:11

系统环境

主机名

操作系统

IP地址

节点名称

k8s-master

CentOS Linux release 7.6.1810

192.168.2.213

管理节点

k8s-node001

CentOS Linux release 7.6.1810

192.168.2.214

工作节点

一、全局操作(所有机器执行)

1、关闭SELinux

禁用SELinux的目的是让容器可以读取主机文件系统

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i 's/SELINUXTYPE=targeted/#&/' /etc/selinux/config
setenforce 0
2、关闭firewalld防火墙

Kubernetes的master(管理主机)与node(工作节点)之间会有大量的网络通信,在一个安全的内部网络环境中建议关闭防火墙服务。

systemctl disable firewalld
systemctl stop firewalld
3、关闭swap分区
swapoff -a

永久关闭swap分区

sed -ri 's/.*swap.*/#&/' /etc/fstab

将swap那行注释掉

使用kubeadm工具安装部署Kubernetes 1.26.2

4、添加hosts
vim /etc/hosts
192.168.2.213 k8s-master
192.168.2.214 k8s-node001
5、部署docker环境

Kubernetes 1.24以上版本已经弃用docker,改为使用Containerd,可以不安装docker。但国内访问国外网站一直受到限制,我这里安装docker只是为了方便下载所需的镜像。

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
mkdir -p /data/docker
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://registry.docker-cn.com"],
"data-root": "/data/docker"
}
systemctl start docker.service
systemctl status docker.service
6、安装kubeadm、kubectl、kubelet
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet

二、部署master节点(仅master主机执行)

1、修改kubeadm的默认配置
kubeadm config print init-defaults  #输出 kubeadm init 命令默认参数的内容。
kubeadm config print join-defaults  #输出 kubeadm join 命令默认参数的内容。
kubeadm config migrate  #在新旧版本之间进行配置转换。
Kubeadm config images list  #列出所需的镜像列表
Kubeadm config images pull  #拉取镜像到本地

生成初始化参数配置文件

kubeadm config print init-defaults > init-config.yaml
vim init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.2.213  #修改成master节点的IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: /run/containerd/containerd.sock  #修改成containerd.sock文件所在路径
  imagePullPolicy: IfNotPresent
  name: k8s-master   #修改成master节点的主机名
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers  #使用阿里云的镜像地址
kind: ClusterConfiguration
kubernetesVersion: 1.26.2  #需要安装的k8s版本号
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"  #指定pod网段
  serviceSubnet: 10.96.0.0/16  #指定service网段
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

说明:

imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers#国内无法访问registry.k8s.io地址,所以这里改成阿里云镜像地址,否则初始化master节点会失败。

kubernetesVersion: 1.26.2  #版本号改成和镜像的版本号一致,否则初始化master节点会再次下载1.26.0的镜像。

2、下载kubernetes的相关镜像
kubeadm config images list

使用kubeadm工具安装部署Kubernetes 1.26.2

可以通过 kubeadm config images pull 命令下载镜像,但是内地应该访问不了dl.k8s.io,很大概率下载失效,所以使用docker pull下载。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0
docker pull coredns/coredns:1.9.3

K8s初奴化时会默认获取registry.k8s.io前缀的镜像,所以需要给镜像打个标签

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.2 registry.k8s.io/kube-controller-manager:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.2 registry.k8s.io/kube-apiserver:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.2 registry.k8s.io/kube-scheduler:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.2 registry.k8s.io/kube-proxy:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0 registry.k8s.io/etcd:3.5.6-0
docker tag coredns/coredns:1.9.3 registry.k8s.io/coredns/coredns:v1.9.3
3、初始化master节点
kubeadm init --config=init-config.yaml --upload-certs

使用kubeadm工具安装部署Kubernetes 1.26.2

报错了,按错误提示是要将/proc/sys/net/bridge/bridge-nf-call-iptables设置为1

echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl -p /etc/sysctl.d/k8s.conf

再次执行kubeadm init --config=init-config.yaml --upload-certs,又报错了

使用kubeadm工具安装部署Kubernetes 1.26.2

mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
systemctl restart containerd

再次执行kubeadm init --config=init-config.yaml --upload-certs,又又报错了

使用kubeadm工具安装部署Kubernetes 1.26.2

由于直接日志显示不完整,所以将日志写入到一个临时文件中,方便查看

journalctl -xeu kubelet > test.txt

使用kubeadm工具安装部署Kubernetes 1.26.2

很明显是pause的版本不对,我们下载的是3.9,应该要用3.6的,重新下载3.6版本的pause即可。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6

1.24以上版本已使用containerd替代Dockershim,所以这里还需要将pause镜像导入到CRI里。

docker save registry.k8s.io/pause:3.6 -o pause.tar
ctr -n k8s.io images import pause.tar
systemctl daemon-reload
systemctl restart kubelet

再次执行kubeadm init --config=init-config.yaml --upload-certs,又又又报错了

使用kubeadm工具安装部署Kubernetes 1.26.2

master初始化前需要停止kubelet

rm -fr /etc/kubernetes/manifests
systemctl stop kubelet

再次执行kubeadm init --config=init-config.yaml --upload-certs,终于成功了

使用kubeadm工具安装部署Kubernetes 1.26.2

出现如上图字样说明master节点初始化成功,按照提示执行以下命令

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bashrc

如果初始化master有问题,可将集群重置,再次初始化master

kubeadm reset
4、解决kube-proxy无法成功运行问题
kubectl get nodes

查看nodes状态,发现master节点是NotReady状态

使用kubeadm工具安装部署Kubernetes 1.26.2

kubectl get pod -n kube-system

查看pod状态,发现kube-proxy是CrashLoopBackOff状态,说明集群虽然初始化成功,但是却不正常。

使用kubeadm工具安装部署Kubernetes 1.26.2

查看kube-proxy日志

kubectl logs kube-proxy-qdx98 -n kube-system

使用kubeadm工具安装部署Kubernetes 1.26.2

通过报错信息可以看到kube-proxy无法识别SupportIPVSProxyMode这个字段,这是因为1.20以上版本启用ipvs配置的定义方式和之前的版本有所不同,以下是官方的定义方式:

kubeProxy:
  config:
mode: ipvs

查看我们的初始化配置文件init-config.yaml

kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

很明显是多了featureGates:和SupportIPVSProxyMode: true这两行,那么我们可以修改kube-proxy的启动配置,将这两行删除即可。

kubectl -o yaml get cm kube-proxy -n kube-system

查看kube-proxy配置项详情

使用kubeadm工具安装部署Kubernetes 1.26.2

kubectl edit cm kube-proxy -n kube-system

将featureGates:和SupportIPVSProxyMode: true这两行删除,保存退出,重启kube-proxy。

kubectl delete pod kube-proxy-qdx98 -n kube-system

使用kubeadm工具安装部署Kubernetes 1.26.2

三、工作节点加入集群(node节点执行)

输入kubeadm init成功之后提供的join命令,--ignore-preflight-errors=all参数可以打印错误详细信息。

kubeadm join 192.168.2.213:6443 --token 52b38s.4mln9k8lgd3w5hol --discovery-token-ca-cert-hash sha256:efb53b0ccdf3708a0265299f155b0356ed888175d5334025c33fcd6af0a2b141 --ignore-preflight-errors=all

注:该token 有效期为24小时。参数 –control-plane 就是加入控制节点,不带该参数就是加入工作节点。

如果token过期的话,也可以用如下命令生成:

kubeadm token create --print-join-command

使用kubeadm工具安装部署Kubernetes 1.26.2

果然还是报错了,查看kubelet的日志

journalctl -xeu kubelet -l

使用kubeadm工具安装部署Kubernetes 1.26.2

还是containerd的问题,删除它的config.toml文件即可

mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
systemctl restart containerd
systemctl stop kubelet

再次执行join命令

使用kubeadm工具安装部署Kubernetes 1.26.2

终于成功了,按照提示在master节点上查看node状态

使用kubeadm工具安装部署Kubernetes 1.26.2

四、安装网络插件Flannel(仅master安装)

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

检查pod网段配置是否与init-config.yaml一致,如果不一致,需要修改成init-config.yaml里配置的pod网段。

使用kubeadm工具安装部署Kubernetes 1.26.2

kubectl apply -f kube-flannel.yml

使用kubeadm工具安装部署Kubernetes 1.26.2

查看pod状态发现,有一个proxy没有启起来

使用kubeadm工具安装部署Kubernetes 1.26.2

查看node节点的kubelet日志,发现又有pause:3.6的报错

使用kubeadm工具安装部署Kubernetes 1.26.2

在node节点上执行

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
docker save registry.k8s.io/pause:3.6 -o pause.tar
ctr -n k8s.io images import pause.tar
systemctl daemon-reload
systemctl restart kubelet

此时在master节点上查看node和pod状态,都正常了。

使用kubeadm工具安装部署Kubernetes 1.26.2

再次查看node节点的kubelet日志,发现还有个错误

使用kubeadm工具安装部署Kubernetes 1.26.2

检查了一下node节点,确实是没有/etc/kubernetes/manifests目录,此问题不影响使用,但kubelet一直抛这个错误,很烦,还影响查看有用的日志信息。

手动创建/etc/kubernetes/manifests目录

mkdir/etc/kubernetes/manifests
systemctl restart kubelet

再次查看kubelet日志,OK,终于正常了。至此,k8s集群就部署成功了。

五、防火墙配置

如果要开启firewalld防火墙的话,可以参考以下配置

组件

默认端口号

API Server

8080(HTTP非安全端口号)

6443(HTTPS安全端口号)

Controller Manager

10257

Scheduler

10259

Kubelet

10250

10248(只读端口号)

etcd

2379(供客户端访问)

2380(供etcd集群内部节点之间访问)

2381(HTTPS端口号)

proxy

10249

10256