kubeadm部署cluster

使用kubeadm创建集群

目标

  • 安装一个单控制平面的集群
  • 安装Pod network组件,使得Pod可以互通

初始化master节点

根据官方文档我打算直接初始化拉起来了,极客时间的文档使用的是老版本的kubeadmAPI,无法运行

直接init的安装前检查报错了,没有Container Runtimes,这样的话,Pod无法在物理机上运行

查看文档发现,在Kubernetes的1.24的release以及之后去除了Dockershim的组件

注意需要先安装Container Runtime,可以参考另一篇文章。

将kubelet配置为systemd的cgroup驱动

1
2
3
4
5
6
7
8
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

使用如下命令

1
kubeadm init --config kubeadm-config.yaml

在版本 1.22 及更高版本中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm 会将它设置为默认值 systemd

需注意1.28的版本很奇特,详情参考官文。

初始命令

1
kubeadm init <args>

如果配置得当,直接执行如上命令是可以初始化成功的

init后面可以加参数
  • (推荐)可以指定--control-plane-endpoint控制平台的共享端点,这样master节点就是高可用了,控制平台终端节点可以是DNS name或者lb的IP地址。
  • 可以增加一个Pod的network插件传输给init,如果你想使用第三方的话,使用--pod-network-cidr指定
  • (可选)kubeadm会自己检测container runtime,使用不同的可以使用--cri-socket指定

运行成功的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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/

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

kubeadm join 10.12.0.4:6443 --token dfsey5.ghjnq907xf9cbhnq \
--discovery-token-ca-cert-hash sha256:88939ae1ddb78f8a710c28fcbe6445c743d15eca2a606f2ab62f30154cbc492b

上述输出信息写了,作为普通用户和root用户执行的不同指令,包含了证书以及密码啥啥的,很关键。

kubeadm init 生成的 kubeconfig 文件 admin.conf 包含一个带有 Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin 的证书。 kubeadm:cluster-admins 组被绑定到内置的 cluster-admin ClusterRole 上。 不要与任何人共享 admin.conf 文件。

kubeadm init 生成另一个 kubeconfig 文件 super-admin.conf, 其中包含带有 Subject: O = system:masters, CN = kubernetes-super-admin 的证书。 system:masters 是一个紧急访问、超级用户组,可以绕过授权层(例如 RBAC)。 不要与任何人共享 super-admin.conf 文件,建议将其移动到安全位置。

有关如何使用 kubeadm kubeconfig user 为其他用户生成 kubeconfig 文件,请参阅为其他用户生成 kubeconfig 文件

记录 kubeadm init 输出的 kubeadm join 命令。 你需要此命令将节点加入集群

令牌用于控制平面节点和加入节点之间的相互身份验证。 这里包含的令牌是密钥。确保它的安全, 因为拥有此令牌的任何人都可以将经过身份验证的节点添加到你的集群中。 可以使用 kubeadm token 命令列出,创建和删除这些令牌。 请参阅 kubeadm 参考指南

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
kubectl get pods --all-namespaces
# 获取所有pod的状态

root@VM1:/opt/cni/bin# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-76f75df574-kjqkb 0/1 Pending 0 57m
kube-system coredns-76f75df574-qptsc 0/1 Pending 0 57m
kube-system etcd-vm1 1/1 Running 0 57m
kube-system kube-apiserver-vm1 1/1 Running 0 57m
kube-system kube-controller-manager-vm1 1/1 Running 0 57m
kube-system kube-proxy-fsrd2 1/1 Running 0 57m
kube-system kube-scheduler-vm1 1/1 Running 0 57m

kubectl get nodes
# 查看当前节点状态

root@VM1:/opt/cni/bin# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm1 NotReady control-plane 64m v1.29.3

kubectl describe node
# 查看当前节点的详细信息

container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
# 可以看到节点notready的原因

下一步就是安装网络插件

上述结果中也可以看到Coredns处于pending状态,即调度失败,是合理的,应为节点的网络插件还没安装。

网络插件安装

找了半天不知安装什么网络插件,但是卡阿劳德极客时间安装的Weave已经不更了,在官方列表最后一个点进去看到一个复活版,不是太懂网络插件,先这样了。

官方非详尽列表

重生版Weave

1
kubectl apply -f https://reweave.azurewebsites.net/k8s/v1.29/net.yaml

官方文档说可以直接改版本号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@VM1:/opt/cni/bin# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-76f75df574-kjqkb 0/1 Pending 0 131m
coredns-76f75df574-qptsc 0/1 Pending 0 131m
etcd-vm1 1/1 Running 0 131m
kube-apiserver-vm1 1/1 Running 0 131m
kube-controller-manager-vm1 1/1 Running 0 131m
kube-proxy-fsrd2 1/1 Running 0 131m
kube-scheduler-vm1 1/1 Running 0 131m
weave-net-75ffl 0/2 Init:0/1 0 9s
root@VM1:/opt/cni/bin# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-76f75df574-kjqkb 1/1 Running 0 131m
coredns-76f75df574-qptsc 1/1 Running 0 131m
etcd-vm1 1/1 Running 0 132m
kube-apiserver-vm1 1/1 Running 0 131m
kube-controller-manager-vm1 1/1 Running 0 131m
kube-proxy-fsrd2 1/1 Running 0 131m
kube-scheduler-vm1 1/1 Running 0 131m
weave-net-75ffl 2/2 Running 1 (31s ago) 41s

可以看到weave启动之后就全部进入running状态了。

weave-net-75ffl就是容器网络插件在节点上的控制组件

Kubernetes 支持容器网络插件,使用的是一个名叫 CNI 的通用接口,它也是当前容器网络的事实标准,市面上的所有容器网络开源项目都可以通过 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等,它们的部署方式也都是类似的“一键部署”。

至此,Kubernetes 的 Master (现已更名为control-plane节点)节点就部署完成了。如果你只需要一个单节点的 Kubernetes,现在你就可以使用了。不过,在默认情况下,Kubernetes 的 Master 节点是不能运行用户 Pod 的,所以还需要额外做一个小操作。

重新启动后的导入环境变量

1
2
# 重新启动之后,需要再次导入环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf

部署Kubernetes的worker节点

需要在节点上安装kubeadm,kubelet,kubectl以及CRI,

接着直接运行join命令即可

1
2
kubeadm join 10.12.0.4:6443 --token dfsey5.ghjnq907xf9cbhnq \
--discovery-token-ca-cert-hash sha256:88939ae1ddb78f8a710c28fcbe6445c743d15eca2a606f2ab62f30154cbc492b

直接运行试了一下,还是要安装container runtime,然后安装完CRI是可以成功加入的,目前还不确定需要安装CNI是否。

在Control Plane上查看kubectl get node

1
2
3
4
root@VM1:/opt/cni/bin# kubectl get node
NAME STATUS ROLES AGE VERSION
vm1 Ready control-plane 153m v1.29.3
vm2 Ready <none> 91s v1.29.3

可以发现其实新加入的节点没有role。

Web可视化插件

1
2
3
4
5
6
snap install helm --classic

# Add kubernetes-dashboard repository
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
# Deploy a Helm Release named "kubernetes-dashboard" using the kubernetes-dashboard chart
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

然后运行结果为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Release "kubernetes-dashboard" does not exist. Installing it now.
NAME: kubernetes-dashboard
LAST DEPLOYED: Thu Apr 11 09:45:58 2024
NAMESPACE: kubernetes-dashboard
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*************************************************************************************************
*** PLEASE BE PATIENT: Kubernetes Dashboard may need a few minutes to get up and become ready ***
*************************************************************************************************

Congratulations! You have just installed Kubernetes Dashboard in your cluster.

To access Dashboard run:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443

NOTE: In case port-forward command does not work, make sure that kong service name is correct.
Check the services in Kubernetes Dashboard namespace using:
kubectl -n kubernetes-dashboard get svc

Dashboard will be available at:
https://localhost:8443

清理

如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。 你可以使用 kubectl config delete-cluster 删除对集群的本地引用。

但是,如果要更干净地取消配置集群, 则应首先清空节点并确保该节点为空, 然后取消配置该节点。

移除节点

使用适当的凭据与控制平面节点通信,运行:

1
kubectl drain <节点名称> --delete-emptydir-data --force --ignore-daemonsets

在移除节点之前,请重置 kubeadm 安装的状态:

1
kubeadm reset

重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:

1
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

如果要重置 IPVS 表,则必须运行以下命令:

1
ipvsadm -C

现在移除节点:

1
kubectl delete node <节点名称>

如果你想重新开始,只需运行 kubeadm initkubeadm join 并加上适当的参数。

清理控制平面

你可以在控制平面主机上使用 kubeadm reset 来触发尽力而为的清理。

有关此子命令及其选项的更多信息,请参见 kubeadm reset 参考文档。


kubeadm部署cluster
https://steammilk.com/2024/04/10/2024-all/k8s-kubeadm-cluster/
作者
蒸奶泡
发布于
2024年4月10日
更新于
2025年1月8日
许可协议