使用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 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的版本很奇特,详情参考官文。
初始命令
如果配置得当,直接执行如上命令是可以初始化成功的
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 root@VM1:/opt/cni/bin 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 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
下一步就是安装网络插件
上述结果中也可以看到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 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 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 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 helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ 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
安装的状态:
重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:
1 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
如果要重置 IPVS 表,则必须运行以下命令:
现在移除节点:
1 kubectl delete node <节点名称>
如果你想重新开始,只需运行 kubeadm init
或 kubeadm join
并加上适当的参数。
清理控制平面 你可以在控制平面主机上使用 kubeadm reset
来触发尽力而为的清理。
有关此子命令及其选项的更多信息,请参见 kubeadm reset
参考文档。