【k8s】三、k8s集群的初始化

目录

前言

环境规划

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 kubelet kubectl

kubeadm是一个Kubernetes的部署工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤。提供kubeadm initkubeadm join两个操作命令,可以让我们快速部署一个Kubernetes集群。

kubeadmKubernetes集群全生命周期的管理工具,可用于实现集群的部署、升级、降级及拆除。kubeadm部署Kubernetes集群是将大部分资源以pod的方式运行,例如(kube-proxykube-controller-managerkube-schedulerkube-apiserverflannel)都是以pod方式运行。

kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署。接下来我们会经常与kubectl命令打交道的

安装kubeadm

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

【k8s】三、k8s集群的初始化_第1张图片

2. yum安装kubeadm kubelet kubectl

k8s部署工具的版本要跟我们要搭建的k8s集群的版本要相对应,此次我们安装的是1.24.3版本的,因此kubeadmkubeletkubectl的版本都要对应

yum install kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3 -y

【k8s】三、k8s集群的初始化_第2张图片

 启动kubelet

systemctl enable kubelet.service

master节点初始化

通过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 

这个过程有点久,请耐心等候。等候的时候,我们来一起看一下上面的命令参数代表了什么意思。

参数解析:

  • apiserver-advertise-address API 服务器所在的地址,这里就是master节点的IP
  • image-repository 配置拉取k8s镜像的容器仓库,我们配置的是阿里的一个镜像仓库
  • kubernetes-version 指定k8s的版本。
  • service-cidr 服务的虚拟 IP 地址另外指定 IP 地址段
  • pod-network-cidr pod节点网络可以使用的 IP 地址段

service-cidrpod-network-cidr的IP地址段设置是依据你service和pod的容量决定的。

咱们可以通过IP计算机算出网段的容量

https://tool.520101.com/wangluo/ipjisuan/

service网段的容量如下图所示:

【k8s】三、k8s集群的初始化_第3张图片

Pod网段如下图所示:

【k8s】三、k8s集群的初始化_第4张图片

经过一段时间之后,k8s的控制平面就已经安装完成。如下图所示:

【k8s】三、k8s集群的初始化_第5张图片

根据输出提示,

接下来我们配置一下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

node节点初始化加入集群

node1节点输入上面命令,加入集群

【k8s】三、k8s集群的初始化_第6张图片

node2节点输入上面命令,加入集群

【k8s】三、k8s集群的初始化_第7张图片

回到master节点,输入kubectl get nodes命令,此时我们可以看到有三个节点,

【k8s】三、k8s集群的初始化_第8张图片

细心的同学可能会发现,我们节点是有了,但是节点的状态都是NotReady。这是因为集群的网络还没有配好,问题不大,我们接着走。

集群网络初始化之flannel

初始化我们的集群网络,在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了。

【k8s】三、k8s集群的初始化_第9张图片

报错

kubeadm init 报错

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

 【k8s】三、k8s集群的初始化_第10张图片

 原因排查如下:

1. 可能是因为你的kubelet只在master节点上面安装。

通过systemctl status kubelet查看可以发现kubelet报错,当你只有一个节点的时候,就会报错。各位同学想复现此问题的话,可以就只在一台机子上安装kubelet

【k8s】三、k8s集群的初始化_第11张图片

 2. 引起上面的报错还会有另外一种可能,就是kubeadm拉不到镜像,此时我们要检查我们的containerd是否能够拉取到我们的k8s控制平面的镜像。检查我们的/etc/containerd/config.toml文件是否配置正确。

kubectl get nodes报错

使用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版本了。不过也是一样的。

写在后面

如果觉得有用的话,麻烦一键三连支持一下攻城狮白玉,并把本文分享给更多的小伙伴。你的简单支持,我的无限创作动力

你可能感兴趣的:(k8s,Linux运维,kubernetes,docker,容器)