高可用Kubernetes集群kubeadm
准备工作
构建Kubernetes云计算环境 准备就绪,现在具备服务器列表如下:
IP |
主机名 |
说明 |
---|---|---|
192.168.6.204 |
z-b-data-1 |
etcd+haproxy+keeplived |
192.168.6.205 |
z-b-data-2 |
etcd+haproxy+keeplived |
192.168.6.206 |
z-b-data-3 |
etcd+haproxy+keeplived |
192.168.6.101 |
z-k8s-m-1 |
管控节点1 |
192.168.6.102 |
z-k8s-m-2 |
管控节点2 |
192.168.6.103 |
z-k8s-m-3 |
管控节点3 |
192.168.6.111 |
z-k8s-n-1 |
工作节点1(sr-iov) |
192.168.6.112 |
z-k8s-n-2 |
工作节点2(sr-iov) |
192.168.6.113 |
z-k8s-n-3 |
工作节点3(vgpu) |
192.168.6.114 |
z-k8s-n-4 |
工作节点4(vgpu) |
192.168.6.115 |
z-k8s-n-5 |
工作节点5 |
关闭所有Kubernetes服务器上swap:
sudo swapoff -a sudo sed -i 's/\/swapfile/#\/swapfile/g' /etc/fstab
所有Kubernetes服务器部署 私有云docker环境 : 使用 Docker btrfs 存储驱动 ,详细过程见前文 z-k8s高可用Kubernetes集群准备 。完成后在所有节点上验证
docker ps
正常工作
网络
虚拟机运行环境是 Ubuntu Linux ,我对比了默认安装iptables规则:
sudo iptables -L
可以看到 INPOUT
和 OUTPUT
链默认是空的,所以没有任何阻塞:
Chain INPUT (policy ACCEPT)
target prot opt source destination
...
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
...
为了简化部署,特别是对于内部系统,可以忽略防火墙配置。
警告
Kubernetes系统极其复杂,不应该直接面对外部网络,而且在网络边缘应该部署强限制的防火墙进行防护。
备注
生产环境,特别是现在 零信任网络
,应该在每个服务器节点部署 iptables 安全规则。我可能后续再改进这方面部署
如果服务器启用防火墙,需要配置防火墙满足以下要求:
协议 |
方向 |
端口范围 |
用途 |
使用方 |
---|---|---|---|---|
TCP |
入 |
6443 |
Kubernetes API服务器 |
All |
TCP |
入 |
2379-2380 |
etcd服务器客户端访问API |
kube-apiserver/etcd |
TCP |
入 |
10250 |
Kubelet API |
自身/管控平台 |
TCP |
入 |
10251 |
kube-scheduler |
自身 |
TCP |
入 |
10252 |
kube-controller-manager |
自身 |
协议 |
方向 |
端口范围 |
用途 |
使用方 |
---|---|---|---|---|
TCP |
入 |
10250 |
Kubelet API |
自身/管控平台 |
TCP |
入 |
30000-32767 |
节点端口服务 |
All |
为了方便配置,采用 ufw 配置防火墙,配置方法如下: ( ufw防火墙服务 类似 RedHat Linux 平台的 firewalld防护墙服务 )
sudo apt update && sudo apt-upgrade -y
sudo apt install ufw -y
sudo ufw allow ssh
sudo ufw enable
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250:10252/tcp
sudo ufw allow 30000:32767/tcp
sudo ufw status
为防火墙部署,可以采用iptables增加允许访问的TCP端口到管控和工作节点:
实际上,在安装Kubernetes集群有一个最大的障碍是
GFW
,Google的软件仓库(完全屏蔽)以及GitHub仓库(半屏蔽)都需要搭建梯子才能正常访问,对于本文实践采用 Ubuntu Linux 体系,所以需要构建 APT无阻碍代理架构 ,就能够进行下一步安装。
容器运行时( 容器运行时(Container Runtimes) )
备注
这是非常关键的步骤,特别是Kubernetes最新版本 1.24 移除了Docker支持直接采用类似 containerd运行时(runtime) 这样的容器运行时,就要求容器运行时配置完整的CNI plugins才能自举Kubernetes的管控平面
详细步骤见: 安装containerd官方执行程序
执行 容器运行环境快速起步 为每个节点安装好容器运行时
安装kubeadm, kubelet 和 kubectl
在所有节点上需要安装以下软件包:
kubeadm
启动cluster的命令工具kubelet
运行在集群所有服务器节点的组件,用于启动pod和容器kubectl
和集群通讯的工具
备注
本文实践为 Ubuntu 20.04 ,采用 APT包管理 安装软件包
安装Kubernetes软件仓库需要的
apt
包:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
下载Google云公钥:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
备注
在运行一段时间K8s之后,有可能在更新软件包时候遇到报错:
...
Err:3 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05
原因是Google Cloud公钥过期失效,此时需要再次运行上述命令重新下载Google云公钥
添加Kubernetes
apt
仓库:
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt
更新并安装kubelet
,kubeadm
,kubectl
,然后将版本锁定:
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
容器运行时
对于Kubernetes运行的容器运行时需要按照 容器运行时(Container Runtimes) 进行调整。与时俱进,我现在改为采用 containerd运行时(runtime) 替代 Docker ,详细步骤见 z-k8s高可用Kubernetes集群准备