Kubernetes (k8s) 集群包含用于运行容器应用程序的主节点和工作节点。主节点作为控制计划,工作节点为实际工作提供环境。
必备条件
- Minimal Installed Debian 11
- 2 CPU / vCPU
- 2 GB RAM
- 20 GB free disk space
- Sudo User with Admin rights
- Stable Internet Connectivity
实验准备
在演示中,我使用三个 Debian 11 系统,详细信息如下
- Master Node (k8s-master) – 192.168.1.236
- Worker Node 1 (k8s-worker1) – 192.168.1.237
- Worker Node 2 (k8s-worker2) – 192.168.1.238
(1) 设置主机名并更新 /etc/hosts文件
使用 hostnamectl 命令在主节点和工作者节点上设置主机名。
$ sudo hostnamectl set-hostname "k8s-master" // Run on master node
$ sudo hostnamectl set-hostname "k8s-worker1" // Run on 1st worker node
$ sudo hostnamectl set-hostname "k8s-worker2" // Run on 2nd worker node
在所有节点上的 /ect/hosts 文件中添加以下内容
192.168.1.236 k8s-master
192.168.1.237 k8s-worker1
192.168.1.238 k8s-worker2
(2) 在所有节点上禁用 Swap
为了让 kubelet 能够顺利工作,建议禁用 swap。在主节点和工作节点上运行以下命令关闭交换。
$ sudo swapoff -a
$ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
(3) 配置 Kubernetes 集群防火墙规则
如果您的 debian 系统上启用了系统防火墙,那么在主节点和工作节点上分别允许以下端口。
在主节点上执行
$ sudo ufw allow 6443/tcp
$ sudo ufw allow 2379/tcp
$ sudo ufw allow 2380/tcp
$ sudo ufw allow 10250/tcp
$ sudo ufw allow 10251/tcp
$ sudo ufw allow 10252/tcp
$ sudo ufw allow 10255/tcp
$ sudo ufw reload
在工作节点上执行
$ sudo ufw allow 10250/tcp
$ sudo ufw allow 30000:32767/tcp
$ sudo ufw reload
注意:如果您的 Debian 11 系统上禁用了防火墙,那么您可以跳过此步骤。
(4) 在所有节点安装 Containerd 运行时
Containerd 是行业标准的容器运行时,我们必须在所有的主节点和工作节点上安装 Containerd。
在安装 containerd 之前,需要在所有节点上设置以下内核参数。
$ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
$ sudo modprobe overlay
$ sudo modprobe br_netfilter
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
为了使上述更改生效,请运行
$ sudo sysctl --system
在所有节点上运行以下 apt 命令,安装 containerd。
$ sudo apt update
$ sudo apt -y install containerd
配置 containerd,使其与 Kubernetes 一起工作,在所有节点上运行下面的命令
$ containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
在所有节点上执行以下操作:
编辑 /etc/containerd/config.toml, 找到 [plugins.”io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options] ,添加 SystemdCgroup = true
$ sudo vi /etc/containerd/config.toml
保存并关闭该文件
在所有节点上重新启动 containerd 服务
$ sudo systemctl restart containerd
$ sudo systemctl enable containerd
(5) 启用 Kubernetes Apt 存储库
在所有节点上启用 Kubernetes apt 存储库,运行
$ sudo apt install gnupg gnupg2 curl software-properties-common -y
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/cgoogle.gpg
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
(6) 在所有节点上安装 kubelet,kubectl 和 kubeadm
在所有节点上运行以下 apt 命令,安装 Kubernetes 集群组件,如 kubelet、kubectl 和 Kubeadm。
$ sudo apt update
$ sudo apt install kubelet kubeadm kubectl -y
$ sudo apt-mark hold kubelet kubeadm kubectl
(7) 使用 Kubeadm 创建 Kubernetes 集群
现在,我们准备好创建 Kubernetes 集群了,只在主节点上运行以下命令
$ sudo kubeadm init --control-plane-endpoint=k8s-master
以上输出说明控制平面初始化成功。在输出中,我们有用于普通用户与集群交互的的命令,也有将任何工作节点加入该集群的命令。
要开始与集群交互,请在主节点上运行以下命令
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行以下 kubectl 命令获取节点和集群信息
$ kubectl get nodes
$ kubectl cluster-info
使用 Kubeadm Join 命令将两个工作节点加入集群。
注意:从 kubeadm init 命令的输出中复制确切的命令。在我的例子中,复制的命令是:
$ sudo kubeadm join k8s-master:6443 --token ta622t.enl212euq7z87mgj \
--discovery-token-ca-cert-hash sha256:2be58f54458d0e788c96b8841f811069019161f9a3dd8502a38c773e5c6ead17
Worker Node 1 输出如下
Worker Node 2 输出如下
在主节点上执行以下命令检查节点状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 23m v1.25.0
k8s-worker1 NotReady <none> 9m27s v1.25.0
k8s-worker2 NotReady <none> 2m19s v1.25.0
$
为了使节点状态就绪,我们必须安装 POD 网络插件,如 Calico 或 flannel。
(8) 安装 Calico Pod 网络插件
在主节点上,运行以下命令安装 calico
$ kubectl apply -f https://projectcalico.docs.tigera.io/manifests/calico.yaml
允许操作系统防火墙中的 Calico 端口,在所有节点的 ufw 命令下运行
$ sudo ufw allow 179/tcp
$ sudo ufw allow 4789/udp
$ sudo ufw allow 51820/udp
$ sudo ufw allow 51821/udp
$ sudo ufw allow 4789/udp
$ sudo ufw reload
验证 Calico pods 的状态,运行
$ kubectl get pods -n kube-system
现在再次检查节点状态
上面的输出表明主节点和工作节点处于就绪状态,这个集群已经为工作负载做好了准备。
(9) 测试 Kubernetes 集群安装
为了测试 Kubernetes 集群安装,让我们尝试通过部署部署基于 nginx 的应用程序。运行下面的命令
$ kubectl create deployment nginx-app --image=nginx --replicas 2
$ kubectl expose deployment nginx-app --name=nginx-web-svc --type NodePort --port 80 --target-port 80
$ kubectl describe svc nginx-web-svc
以上命令的输出
尝试使用下面的 curl 命令访问基于 nginx 的应用程序。
注意:在 curl 命令中,我们可以使用任何一个工作节点的主机名。
$ curl http://k8s-worker1:30036
以上命令的输出表明我们能够访问基于 nginx 的应用程序。