kubernetes-基于kubeadm部署集群

一、简介
kubeadm 是 Kubernetes 社区提供的集群构建工具,它负责构建一个最小化可用集群并执行启动等必要的基本步骤,简单来讲,kubeadm 是 Kubernetes 集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等。
kubeadm 的核心工具是 kubeadm init 和 kubeadm join,前者用于创建新的控制平面节点,后者则用于将节点快速连接到指定的控制平面,它们是创建 Kubernetes 集群最佳实践的“快速路径”。
kubeadm 遵循最佳实践的方式部署 Kubernetes 集群,它强制启用 RBAC,设定 Master 的各组件间以及 API Server 与 kubelet 之间进行认证和安全通信,并锁定了 kubelet API 等。
Kubernetes 集群可部署为 3 种运行模式。
1)独立组件模式:Master 各组件和 Node 各组件直接以守护进程方式运行于节点之上,以二进制程序部署的集群隶属于此种类型。

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

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-generic | host-10-16-217-204 | master | 10.16.217.204 | 4C8G |
| ubuntu 22.04/5.15.0-76-generic | host-10-16-217-248 | master | 10.16.217.248 | 4C8G |
| ubuntu 22.04/5.15.0-76-generic | host-10-16-217-197 | master | 10.16.217.197 | 4C8G |
| ubuntu 22.04/5.15.0-76-generic | host-10-16-217-141 | worker | 10.16.217.141 | 4C8G |
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
更多推荐



所有评论(0)