「Kubernetes」- 集群部署;集群版本:1.20;部署工具:kubeadm;高可用:kube-vip;

  CREATED BY JENKINSBOT

问题描述

我们将通过 kubeadm 命令创建的 Kubernetes 1.20 高可用集群,并使用 kube-vip 作为负载均衡器。

该笔记将记录:部署 Kubernetes Cluster 的方法,以及注意事项、常见问题的解决办法。

解决方案

根据官方 Bootstrapping clusters with kubeadm 文档的指引,我们得以实施该部署过程。

该部署过程及内容并非依照官方文档顺序来记录,而是依照实际部署过程来记录,即我们遵循「先记录,后实施」的原则;

环境概述

每台主机仅有一张网卡;
192.168.10.70 VIP
192.168.10.71 eth0 k8s70-cp01
192.168.10.72 eth0 k8s70-cp02
192.168.10.73 eth0 k8s70-cp03

补充说明:
1)对于某些特殊主机配置(比如 Master * 3 的网卡名各不相同)未包含在该笔记说明中。

第一步、配置节点环境

进行主机检查

在部署集群之前,需要准备工作和环境检查:
1)兼容的 Linux 主机;我们使用 Ubuntu 20.04 TLS 发行版;
2)最少 2vCPU 2gMEM 资源;
3)集群中所有机器间的网络互联(公共或专用网络都可以),以及正确的网络配置;
4)每个节点 [hostname、mac address、product_uuid] 要唯一;
5)机器上的某些端口不能别占用,且要允许访问:6443;
6)禁用 SWAP 分区:

# 3)集群中所有机器间的网络互联(公共或专用网络都可以),以及正确的网络配置;

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
systemctl restart systemd-modules-load.service

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

# 4)每个节点 [hostname、mac address、product_uuid] 要唯一;

ip link
hostname
cat /sys/class/dmi/id/product_uuid

# 5)机器上的某些端口不能别占用,且要允许访问:6443;

nc -v -z 127.0.0.1 6443
systemctl stop ufw.service && systemctl disable ufw.service

# 6)禁用 SWAP 分区:

sed -i -E 's%(^[^#].+\sswap\s.+)%# \1%g' /etc/fstab
swapoff -a

部署容器环境

我们选择的容器环境,及其配置:
1)我们采用 Docker 作为容器运行环境(kubeadm 会根据 Unix Domain Socket 路径来自动探测主机提供容器环境);
2)采用 systemd 作为 cgroup manager 以简化问题(而未使用 cgroupfs 作为 cgroup manager);

安装 Docker 环境:Installing Docker on Ubuntu
修改 Docker 配置:

cat > /etc/docker/daemon.json <<EOF
{
  "live-restore": true,
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

systemctl start docker
systemctl enable docker
systemctl reload docker
systemctl restart docker

# 07/02/2022 现在我们更倾向于 containerd 环境,如果需要使用 containerd.io 容器环境,参考 containerd 笔记;

安装服务组件

# 安装依赖
apt-get update \
    && apt-get install -y apt-transport-https ca-certificates curl

# 导入密钥
# 尽管下载 apt-key.gpg 存在困难,但是应该尽量从官方站点下载(请勿随意使用第三方密钥)
# 我们直接利用 Ubuntu Key Server 来添加;
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071 8B57C5C2836F4BEB
cat > /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update

# 安装工具
# 查看可用版本:apt-cache madison kubeadm | grep 1.20 | head -n 1
apt-get install -y kubelet=1.20.15-00 kubeadm=1.20.15-00 kubectl=1.20.15-00    
apt-mark hold kubelet kubeadm kubectl                                           # 禁止更新

# 其他工具
apt-get install nfs-common

第二步、部署控制平面

control-plane (k8s70-cp01)

# ----------------------------------------------------------------------------- # 创建 kube-vip 配置 

export VIP=192.168.10.70
export INTERFACE=eth0
export KVVERSION=v0.4.0

alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$KVVERSION"

kube-vip manifest pod               \
    --interface $INTERFACE          \
    --address $VIP                  \
    --controlplane                  \
    --services                      \
    --arp                           \
    --leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml

# ----------------------------------------------------------------------------- # 创建 control-plane 节点 

kubeadm init                                                            \
    --control-plane-endpoint "192.168.10.70"                            \
    --apiserver-advertise-address "192.168.10.71"                       \
    --apiserver-bind-port 6443                                          \
    --upload-certs                                                      \
    --image-repository "registry.aliyuncs.com/google_containers"        \
    --v=10

control-plane (others)

在 k8s70-cp02 与 k8s70-cp03 中,执行如下命令:

# ----------------------------------------------------------------------------- # 1)根据生成的命令来添加其他控制平面

kubeadm join 192.168.10.70:6443 --token ouxoah...   \
    --discovery-token-ca-cert-hash sha256:41f232... \
    --control-plane --certificate-key c49af7...

# ----------------------------------------------------------------------------- # 2)创建 kube-vip 配置

...                                                                             # 再次执行 kube-vip.yaml 创建命令

第三步、部署网络插件

我们使用 Calico 网络插件。

依赖检查:
我们的 Node 为 Ubuntu 20.04 LTS 版本,根据官方 System requirements 文档进行检查,配置已经满足 Calico 的要求,所以无需进行额外的配置。

部署插件:

curl https://docs.projectcalico.org/archive/v3.21/manifests/calico.yaml -O
kubectl apply -f calico.yaml

第四步、添加工作节点

kubeadm join 192.168.10.70:6443 --token ouxoah.4skcbtrj3qsnip9z \
    --discovery-token-ca-cert-hash sha256:41f232f49692c14e9e5fb1053fd7efd8306e46236072da8bdb45fc2157bb2edf

参考文献

Container runtimes | Kubernetes
containers – Kubernetes internet access with two network interfaces – Stack Overflow