使用 kubeadm 构建 Kubernetes v1.29 集群
使用 kubeadm 构建 Kubernetes v1.29 集群
如何使用 kubeadm 设置三节点 Kubernetes v1.29 集群
介绍
- kubeadm 是用于创建 Kubernetes 集群的工具
- 它通过引导控制平面、加入节点等来自动创建 Kubernetes 集群
- 遵循 Kubernetes 发布周期
- 由 Kubernetes 社区维护的开源工具
先决条件
- 为控制平面 node-1 和 node-2 创建三个 Ubuntu 22.04 LTS 实例
- 每个实例的最低规格为 2 个 CPU 和 2 GB RAM
- 必须在实例之间启用联网
- 实例之间必须允许使用所需的端口
- 必须在实例上禁用交换
初始配置
在控制平面、节点 1 和节点 2 上设置唯一的主机名 设置主机名
后,从当前会话注销并重新登录以反映更改
# control-plane
sudo hostnamectl set-hostname control-plane
# node-1
sudo hostnamectl set-hostname node-1
# node-2
sudo hostnamectl set-hostname node-2
更新控制平面、节点 1 和节点 2 上的主机文件,以启用通过主机名进行通信
# control-plane, node-1 and node-2
sudo vi /etc/hosts
172.31.81.34 control-plane
172.31.81.93 node-1
172.31.90.71 node-2
在控制平面、节点 1 和节点 2 上禁用交换,如果 fstab 文件中存在交换条目,则注释掉该行
从 v1.22 开始支持 swap,从 v1.28 开始,swap 仅对 cgroup v2 支持。kubelet 的 NodeSwap 功能门卡是 beta 版,但默认禁用。如果 kubelet 未正确配置为使用 swap,则必须禁用 swap。
# control-plane, node-1 and node-2
sudo swapoff -a
sudo vi /etc/fstab
# comment out swap entry
要在控制平面 node-1 和 node-2 上将 containerd 设置为容器运行时,首先需要加载一些内核模块并修改系统设置
# control-plane, node-1 and node-2
cat << EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# control-plane, node-1 and node-2
cat << EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
安装
加载内核模块并修改系统设置后,现在我们可以在控制平面、节点 1 和节点 2 上安装 containerd 运行时
# control-plane, node-1 and node-2
sudo apt update
sudo apt install -y containerd
安装包后,在控制平面、node-1 和 node-2 上为 containerd 生成默认配置文件
# control-plane, node-1 and node-2
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
在 containerd 配置文件中将 SystemdCgroup 值更改为 true,然后重新启动服务
# control-plane, node-1 and node-2
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
我们需要在控制平面 node-1 和 node-2 上安装一些必备软件包,以配置 Kubernetes 软件包存储库
# control-plane, node-1 and node-2
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpg
在控制平面、node-1 和 node-2 上下载 Kubernetes 软件包存储库的公共签名密钥
# control-plane, node-1 and node-2
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
在控制平面 node-1 和 node-2 上添加相应的 Kubernetes apt 存储库
# control-plane, node-1 and node-2
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
安装 kubeadm、kubelet 和 kubectl 工具,并在控制平面、node-1 和 node-2 上保存它们的包版本
# control-plane, node-1 and node-2
sudo apt update
sudo apt install -y kubeadm=1.29.0-1.1 kubelet=1.29.0-1.1 kubectl=1.29.0-1.1
sudo apt-mark hold kubeadm kubelet kubectl
在控制平面上使用 kubeadm 初始化集群
# control-plane
sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version 1.29.0
安装完成后,在控制平面上设置对集群的访问权限
# control-plane
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
通过列出节点来验证我们的集群状态
但是我们的节点处于 NotReady 状态,因为我们尚未设置网络
# control-plane
kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-plane NotReady control-plane 45s v1.29.0
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
control-plane NotReady control-plane 52s v1.29.0 172.31.81.34 <none> Ubuntu 22.04.3 LTS 6.2.0-1012-aws containerd://1.7.2
将 Calico 网络插件安装到集群并验证节点的状态
# control-plane
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml
# control-plane
kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7c968b5878-x5trl 1/1 Running 0 46s
calico-node-grrf4 1/1 Running 0 46s
coredns-76f75df574-cdcj2 1/1 Running 0 4m19s
coredns-76f75df574-z4gxg 1/1 Running 0 4m19s
etcd-control-plane 1/1 Running 0 4m32s
kube-apiserver-control-plane 1/1 Running 0 4m34s
kube-controller-manager-control-plane 1/1 Running 0 4m32s
kube-proxy-78gqq 1/1 Running 0 4m19s
kube-scheduler-control-plane 1/1 Running 0 4m32s
kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-plane Ready control-plane 4m53s v1.29.0
启用网络后,将我们的工作负载节点加入集群 使用 kubeadm 从控制平面
获取 join 命令
# control-plane
kubeadm token create --print-join-command
从控制平面检索到 join 命令后,在 node-1 和 node-2 中执行它
# node-1 and node-2
sudo kubeadm join 172.31.81.34:6443 --token kvzidi.g65h3s8psp2h3dc6 --discovery-token-ca-cert-hash sha256:56c208595372c1073b47fa47e8de65922812a6ec322d938bd5ac64d8966c1f27
验证我们的集群和所有节点是否都处于就绪状态
# control-plane
kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-plane Ready control-plane 7m50s v1.29.0
node-1 Ready <none> 76s v1.29.0
node-2 Ready <none> 79s v1.29.0
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
control-plane Ready control-plane 8m12s v1.29.0 172.31.81.34 <none> Ubuntu 22.04.3 LTS 6.2.0-1012-aws containerd://1.7.2
node-1 Ready <none> 98s v1.29.0 172.31.81.93 <none> Ubuntu 22.04.3 LTS 6.2.0-1012-aws containerd://1.7.2
node-2 Ready <none> 101s v1.29.0 172.31.90.71 <none> Ubuntu 22.04.3 LTS 6.2.0-1012-aws containerd://1.7.2
应用程序部署
部署一个 Nginx Pod,将其公开为 ClusterIP 并验证其状态
# control-plane
kubectl run nginx --image=nginx --port=80 --expose
service/nginx created
pod/nginx created
kubectl get pods nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 34s 192.168.247.1 node-2 <none> <none>
kubectl get svc nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.102.86.253 <none> 80/TCP 56s
使用控制平面中的端口转发访问 Nginx 默认页面
# control-plane
kubectl port-forward svc/nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
curl -i http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.25.3
这就是现在的全部内容
参考
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- 点赞
- 收藏
- 关注作者
评论(0)