高可用Kubernetes集群kubeadm

备注

本文实践基于 kubeadm (单机部署版本)改进,运行环境是 私有云架构 ,同样安装部署 kubeadm 作为自举kubernetes集群工具,集合kubelet/kubectl构建集群

准备工作

z-k8s高可用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

网络

虚拟机运行环境是 Ubuntu Linux ,我对比了默认安装iptables规则:

sudo iptables -L

可以看到 INPOUTOUTPUT 链默认是空的,所以没有任何阻塞:

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防护墙服务 )

使用ufw配置kubernetes节点防火墙
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 包:

apt安装k8s仓库所需软件包
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
  • 下载Google云公钥:

安装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 仓库:

apt添加k8s仓库
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 ,然后将版本锁定:

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 Atlas ,详细步骤见 z-k8s高可用Kubernetes集群准备

参考