在这里插入图片描述

一、简介

kubeadm 是 Kubernetes 社区提供的集群构建工具,它负责构建一个最小化可用集群并执行启动等必要的基本步骤,简单来讲,kubeadm 是 Kubernetes 集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等。

kubeadm 的核心工具是 kubeadm init 和 kubeadm join,前者用于创建新的控制平面节点,后者则用于将节点快速连接到指定的控制平面,它们是创建 Kubernetes 集群最佳实践的“快速路径”。

kubeadm 遵循最佳实践的方式部署 Kubernetes 集群,它强制启用 RBAC,设定 Master 的各组件间以及 API Server 与 kubelet 之间进行认证和安全通信,并锁定了 kubelet API 等。

Kubernetes 集群可部署为 3 种运行模式。

1)独立组件模式:Master 各组件和 Node 各组件直接以守护进程方式运行于节点之上,以二进制程序部署的集群隶属于此种类型。

img

2)静态 Pod 模式:控制平面的各组件以静态 Pod 对象形式运行在 Master 主机之上,而 Node 主机上的 kubelet 和 Docker 运行为系统级守护进程,kube-proxy 托管于集群上的 DaemonSet 控制器。

img

3)自托管(self-hosted)模式:类似于第二种模式,但控制平面的各组件运行为 Pod 对象(非静态),并且这些 Pod 对象同样托管运行在集群之上,且同样受控于 DaemonSet 类型的控制器。

使用 kubeadm 部署的 Kubernetes 集群可运行为第二种或第三种模式,默认为静态 Pod 对象模式,当需要使用自托管模式时,可使用 kubeadm init 命令的–features-gates=selfHosting 选项激活。

kubeadm 拉起一个 Kubernetes 集群主要需要两个步骤:先在第一个 Master 主机上运行 kubeadm init 命令初始化控制平面,待其完成后,在其他主机上运行 kubeadm join 命令逐一加入控制平面,进而成为集群成员。

二、部署

准备三台机器 , 这些机器可以科学上网。

操作系统hostname角色IP配置
ubuntu 22.04/5.15.0-76-generichost-10-16-217-204master10.16.217.2044C8G
ubuntu 22.04/5.15.0-76-generichost-10-16-217-248master10.16.217.2484C8G
ubuntu 22.04/5.15.0-76-generichost-10-16-217-197master10.16.217.1974C8G
ubuntu 22.04/5.15.0-76-generichost-10-16-217-141worker10.16.217.1414C8G
2.1 操作系统初始化

所有服务器都需要初始化

2.1.1. 关闭swap
#swapoff -a
2.1.2. 内核参数
# 设置加载br_netfilter模块
#cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

#modprobe overlay
#modprobe br_netfilter

# 开启bridge-nf-call-iptables ,设置所需的 sysctl 参数,参数在重新启动后保持不变
#cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
#sysctl --system
2.2 安装容器运行时

这里使用containerd,docker有版权限制长期看containerd更合适。

需要为所有服务器安装

2.2.1 安装必须包
#apt update
#apt install apt-transport-https ca-certificates curl software-properties-common
2.2.2 导入docker源
#curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list

#apt update
2.2.3 安装containerd
#apt install containerd.io
#mkdir -p /etc/containerd
#containerd config default | tee /etc/containerd/config.toml

修改CgroupDriver为systemd

k8s官方推荐使用systemd类型的CgroupDriver。

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
#systemctl start containerd
#systemctl enable containerd
2.3 安装kubeadm、kubelet

需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

导入kubernetes 1.34的source

#curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
#echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
#apt-get update
#apt-get install -y kubelet kubeadm kubectl
#apt-mark hold kubelet kubeadm kubectl
#systemctl enable kubelet

加master的时候会自动启动kubelet,所以不需要启动

2.4 镜像准备

由于k8s内置镜像下载都需要科学上网才能拉取的下来,所有可以自己电脑使用科学上网拉取到本地或者使用阿里云镜像

基础的kubernetes镜像需要如下

# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.34.2
registry.k8s.io/kube-controller-manager:v1.34.2
registry.k8s.io/kube-scheduler:v1.34.2
registry.k8s.io/kube-proxy:v1.34.2
registry.k8s.io/coredns/coredns:v1.12.1
registry.k8s.io/pause:3.10.1
registry.k8s.io/etcd:3.6.5-0

这里选择使用国内阿里云镜像

#kubeadm config images pull --kubernetes-version 1.34.2 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.34.2
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.34.2
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.34.2
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.34.2
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.12.1
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10.1
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.6.5-0
2.5 安装控制面
2.5.1 配置负载均衡

由于有3台master,apiserver生产环境下肯定需要高可用,所以可以通过外部负载均衡实现apiserver的高可用。本文这里选择在每台master节点上面安装个nginx,负载均衡到3台master节点,这样master各自连 127.0.0.1 即可实现对apiserver的高可用了。

#apt install nginx
# cat >> /etc/nginx/nginx.conf <<EOF
> stream {
>     upstream backend {
>         server 10.16.217.204:6443    max_fails=2 fail_timeout=3s;
>         server 10.16.217.248:6443    max_fails=2 fail_timeout=3s;
>         server 10.16.217.197:6443    max_fails=2 fail_timeout=3s;
>     }
> 
>     server {
>         listen 127.0.0.1:8443;
>         proxy_connect_timeout 1s;
>         proxy_pass backend;
>     }
> }
> EOF
#nginx -t
#systemctl restart nginx 
#systemctl enable nginx
2.5.2 安装master

在第一台master host-10-16-217-204 上面执行init,这里的pod-network-cidr需要注意,calico默认的cidr是192.168.0.0/16,flannel默认的是 10.244.0.0/16, 所以如果不会更改cni 的网段的话,建议这里默认。

#kubeadm init \
--kubernetes-version 1.34.2 \
--control-plane-endpoint "127.0.0.1:8443" \
--image-repository registry.aliyuncs.com/google_containers \
--upload-certs \
--service-cidr=172.16.0.0/12 \
--pod-network-cidr=192.168.0.0/16

得到如下输出结果

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes running the following command on each as root:

  kubeadm join 127.0.0.1:8443 --token xrd5l2.5qiiwu9iw180rw7t \
        --discovery-token-ca-cert-hash sha256:3e86a86c875d2d14820b91e4723a483a357b66b69b90b2ec8e14f4f472e707c7 \
        --control-plane --certificate-key 9aac85eb034fa52ea92d6ad6e346586332b590f7d7415823f16b75f2c7b00bdc

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 127.0.0.1:8443 --token xrd5l2.5qiiwu9iw180rw7t \
        --discovery-token-ca-cert-hash sha256:3e86a86c875d2d14820b91e4723a483a357b66b69b90b2ec8e14f4f472e707c7  

部署参数说明:

  • –control-plane-endpoint:指定控制面(kube-apiserver)的IP或DNS域名地址。
  • –apiserver-advertise-address:kube-apiserver的IP地址。
  • –pod-network-cidr:pod network范围,控制面会自动给每个节点分配CIDR。
  • –service-cidr:service的IP范围,default “10.96.0.0/12”。
  • –kubernetes-version:指定k8s的版本。
  • –image-repository:指定k8s镜像仓库地址。
  • –upload-certs :标志用来将在所有控制平面实例之间的共享证书上传到集群。
  • –node-name:hostname-override,作为节点名称。

添加其他master

#kubeadm join 127.0.0.1:8443 --token xrd5l2.5qiiwu9iw180rw7t         --discovery-token-ca-cert-hash sha256:3e86a86c875d2d14820b91e4723a483a357b66b69b90b2ec8e14f4f472e707c7         --control-plane --certificate-key 9aac85eb034fa52ea92d6ad6e346586332b590f7d7415823f16b75f2c7b00bdc

保存kubeconfig

#mkdir -p $HOME/.kube
#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get nodes
NAME                 STATUS     ROLES           AGE     VERSION
host-10-16-217-197   NotReady   control-plane   5m58s   v1.34.2
host-10-16-217-204   NotReady   control-plane   9m47s   v1.34.2
host-10-16-217-248   NotReady   control-plane   6m35s   v1.34.2
2.5.3 安装calico cni

这里选择使用calico

#kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml

# kubectl get pods -A
NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-6c77f9c4cc-xck7f     1/1     Running   0          46m
kube-system   calico-node-6srrk                            1/1     Running   0          46m
kube-system   calico-node-jg7g5                            1/1     Running   0          46m
kube-system   calico-node-w5jxk                            1/1     Running   0          46m
kube-system   coredns-7cc97dffdd-t975j                     1/1     Running   0          47m
kube-system   coredns-7cc97dffdd-wvqsc                     1/1     Running   0          47m
kube-system   etcd-host-10-16-217-197                      1/1     Running   1          46m
kube-system   etcd-host-10-16-217-204                      1/1     Running   2          47m
kube-system   etcd-host-10-16-217-248                      1/1     Running   1          46m
kube-system   kube-apiserver-host-10-16-217-197            1/1     Running   1          46m
kube-system   kube-apiserver-host-10-16-217-204            1/1     Running   2          47m
kube-system   kube-apiserver-host-10-16-217-248            1/1     Running   1          46m
kube-system   kube-controller-manager-host-10-16-217-197   1/1     Running   0          46m
kube-system   kube-controller-manager-host-10-16-217-204   1/1     Running   0          47m
kube-system   kube-controller-manager-host-10-16-217-248   1/1     Running   0          46m
kube-system   kube-proxy-hm28f                             1/1     Running   0          46m
kube-system   kube-proxy-krddm                             1/1     Running   0          46m
kube-system   kube-proxy-m9vts                             1/1     Running   0          47m
kube-system   kube-scheduler-host-10-16-217-197            1/1     Running   1          46m
kube-system   kube-scheduler-host-10-16-217-204            1/1     Running   2          47m
kube-system   kube-scheduler-host-10-16-217-248            1/1     Running   1          46m
2.5.4 添加worker节点
#kubeadm join 127.0.0.1:8443 --token xrd5l2.5qiiwu9iw180rw7t \
        --discovery-token-ca-cert-hash sha256:3e86a86c875d2d14820b91e4723a483a357b66b69b90b2ec8e14f4f472e707c7 

最终状态

# kubectl get nodes  
NAME                 STATUS   ROLES           AGE   VERSION
host-10-16-217-141   Ready    <none>          67s   v1.34.2
host-10-16-217-197   Ready    control-plane   48m   v1.34.2
host-10-16-217-204   Ready    control-plane   49m   v1.34.2
host-10-16-217-248   Ready    control-plane   49m   v1.34.2
辅助工具

先重置master

#kubeadm reset -f

再重置worker

#kubeadm reset -f

清理CNI网络配置

rm -rf /etc/cni/net.d/*
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /var/lib/etcd
ip link delete cni0
ip link delete flannel.1

清理iptables规则

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P FORWARD ACCEPT

参考:

https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

https://imroc.cc/kubernetes/appendix/faq/why-enable-bridge-nf-call-iptables/

https://blog.csdn.net/Linbling/article/details/139186967

https://www.cnblogs.com/boradviews/articles/19084033

更多推荐