记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

使用 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/



转载请标明出处【使用 kubeadm 构建 Kubernetes v1.29 集群】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论