目录
前言
环境规划
kubeadm kubelet kubectl
安装kubeadm
master节点初始化
node节点初始化加入集群
集群网络初始化之flannel
报错
kubeadm init 报错
kubectl get nodes报错
总结
写在后面
通过前面两篇文章的铺垫,
【k8s】一、基础实验环境准备
【k8s】二、containerd的安装
我们已经把搭建k8s集群所需的基础环境都构建好了,接下来,我们来对k8s进行部署,初始化一个属于我们自己的k8s集群。我们此次安装的k8s版本是1.24.3
。
k8s的安装有多种方式,本次教程我们采用其中最简单的一种方式,通过kubeadm来进行安装。
在【k8s】一、基础实验环境准备中已经将本次实验所有节点的网络规划好了
机器 |
IP地址 |
物理机 |
192.168.137.99 |
k8s-master |
192.168.137.200 |
k8s-node1 |
192.168.137.201 |
k8s-node2 |
192.168.137.202 |
kubeadm
是一个Kubernetes
的部署工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤。提供kubeadm init
和 kubeadm join
两个操作命令,可以让我们快速部署一个Kubernetes集群。
kubeadm
是Kubernetes
集群全生命周期的管理工具,可用于实现集群的部署、升级、降级及拆除。kubeadm
部署Kubernetes
集群是将大部分资源以pod
的方式运行,例如(kube-proxy
、kube-controller-manager
、kube-scheduler
、kube-apiserver
、flannel
)都是以pod
方式运行。
kubectl
是Kubernetes集群的命令行工具,通过kubectl
能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署。接下来我们会经常与kubectl
命令打交道的
master节点和所有node节点都需要执行本步骤安装。其中kubectl可以在node节点上面不安装,但是初学者的话,都安装也无妨。
1. 添加k8s的阿里云yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2. yum安装kubeadm
kubelet
kubectl
k8s部署工具的版本要跟我们要搭建的k8s集群的版本要相对应,此次我们安装的是1.24.3版本的,因此kubeadm
、kubelet
、kubectl
的版本都要对应
yum install kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3 -y
启动kubelet
systemctl enable kubelet.service
通过kubeadm init
命令,我们可以快速对master节点进行初始化。
执行如下命令:
kubeadm init --apiserver-advertise-address=192.168.137.200 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.24.3 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
这个过程有点久,请耐心等候。等候的时候,我们来一起看一下上面的命令参数代表了什么意思。
参数解析:
service-cidr
和pod-network-cidr
的IP地址段设置是依据你service和pod的容量决定的。
咱们可以通过IP计算机算出网段的容量
https://tool.520101.com/wangluo/ipjisuan/
service网段的容量如下图所示:
Pod网段如下图所示:
经过一段时间之后,k8s的控制平面就已经安装完成。如下图所示:
根据输出提示,
接下来我们配置一下master节点
mkdir -p $HOME/.kube && \
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && \
sudo chown $(id -u):$(id -g) $HOME/.kube/config
同样的根据 kubeadm init
之后的提示,我们知道Node节点加入集群的命令如下:
kubeadm join 192.168.137.200:6443 --token fm17us.mptry3ijamo9avr2 \
--discovery-token-ca-cert-hash sha256:b87cda5b45265db24b29260060fe8e537abb5547604d865a957dc7a026eb36a6
node1节点输入上面命令,加入集群
node2节点输入上面命令,加入集群
回到master节点,输入kubectl get nodes命令,此时我们可以看到有三个节点,
细心的同学可能会发现,我们节点是有了,但是节点的状态都是NotReady。这是因为集群的网络还没有配好,问题不大,我们接着走。
初始化我们的集群网络,在master节点执行如下命令
curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml && \
kubectl apply -f kube-flannel.yml
上面的命令,第一个是下载flannel的配置文件,第二个命令是通过kubectl进行安装
接着静静等待即可,我们可以通过命令kubectl get pod -n kube-flannel
查看flannel的Pod启动情况,等到flannel的pod的状态变为Running时,这时,我们用kubeclt get nodes
命令就会发现,所有节点的状态都变为Ready
了。
kubeadm init
时报错如下,
[kubelet-check] Initial timeout of 40s passed.
Unfortunately, an error has occurred:
timed out waiting for the condition
This error is likely caused by:
- The kubelet is not running
- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)
If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
- 'systemctl status kubelet'
- 'journalctl -xeu kubelet'
Additionally, a control plane component may have crashed or exited when started by the container runtime.
To troubleshoot, list all containers using your preferred container runtimes CLI.
Here is one example how you may list all running Kubernetes containers by using crictl:
- 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock ps -a | grep kube | grep -v pause'
Once you have found the failing container, you can inspect its logs with:
- 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock logs CONTAINERID'
error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster
To see the stack trace of this error execute with --v=5 or higher
原因排查如下:
1. 可能是因为你的kubelet只在master节点上面安装。
通过systemctl status kubelet
查看可以发现kubelet报错,当你只有一个节点的时候,就会报错。各位同学想复现此问题的话,可以就只在一台机子上安装kubelet
2. 引起上面的报错还会有另外一种可能,就是kubeadm拉不到镜像,此时我们要检查我们的containerd是否能够拉取到我们的k8s控制平面的镜像。检查我们的/etc/containerd/config.toml
文件是否配置正确。
使用kubectl命令时报错如下
The connection to the server localhost:8080 was refused - did you specify the right host or port?
这是因为在kubeadm init之后,没有正确配置master节点
基于前面两篇文章的环境铺垫,本文介绍了如何通过kubeadm进行k8s集群的部署。先是简单介绍了kubeadm、kubelet、kubectl的安装。接着就是master节点和node节点的安装以及初始化,经过这三篇文章,一个属于我们自己的k8s集群就已经完全搭建起来了。接下来咱们就可以开心的进行k8s的操作实验了。
题外话,这篇文章鸽了有点久,本来是想一口气写完的,结果还是拖拖拖了。
在我计划写这个教程的时候,1.24.3
是最新的版本。今天整理完这篇博客时,上去官网一看,发现已经更新到了1.25
版本了。不过也是一样的。
如果觉得有用的话,麻烦一键三连支持一下攻城狮白玉,并把本文分享给更多的小伙伴。你的简单支持,我的无限创作动力