问题描述
我们将通过 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