安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS Stream 9
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止swap分区
这里我准备了三台虚拟机:
主机 | IP |
---|---|
k8s-master | 10.211.55.7 |
k8s-node01 | 10.211.55.8 |
k8s-node02 | 10.211.55.9 |
准备环境(所有节点)
设置系统主机名
# 在10.211.55.7执行
hostnamectl set-hostname k8s-master
# 在10.211.55.8执行
hostnamectl set-hostname k8s-node01
# 在10.211.55.9执行
hostnamectl set-hostname k8s-node02
Host文件的相互解析
cat >> /etc/hosts << EOF
10.211.55.7 k8s-master
10.211.55.8 k8s-node01
10.211.55.9 k8s-node02
EOF
时间同步
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭selinux及swap
# 关闭selinux
setenforce 0 && sed -i 's/enforcing/disabled/' /etc/selinux/config
# 关闭swap
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
安装Docker、kubeadm、kubelet(所有节点)
安装Docker
请参考Docker的安装
配置 Docker 的 cgroup driver
为 systemd
systemd
是 Kubernetes 自带的 cgroup 管理器,但 Docker 的cgroup driver
默认是cgroupfs
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl restart docker
安装cri-dockerd
在 Kubernetes v1.24 及更早版本中,我们使用docker作为容器引擎在k8s上使用时,依赖一个dockershim的内置k8s组件;k8s v1.24发行版中将dockershim组件给移除了;取而代之的就是cri-dockerd (当然还有其它容器接口);简单讲CRI就是容器运行时接口(Container Runtime Interface, CRI),也就是说cri-dockerd就是以docker作为容器引擎而提供的容器运行时接口;即我们想要用docker作为k8s的容器运行引擎,我们需要先部署好cri-dockerd;用cri-dockerd来与kubelet交互,然后再由cri-dockerd和docker api交互,使我们在k8s能够正常使用docker作为容器引擎
下载安装包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8.arm64.tgz
安装二进制文件
tar zxvf cri-dockerd-0.3.8.arm64.tgz
cd cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
安装systemd服务文件
git clone https://github.com/Mirantis/cri-dockerd.git
cd cri-dockerd
install packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket
修改cri-docker.service
vim /etc/systemd/system/cri-docker.service
修改第10行,其中pause的版本应该对应要安装的k8s中pause的版本,如:1.29.0的k8s中的pause版本是3.9
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://
启动cri-dockerd
systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
添加kubernetes软件源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
安装kubeadm,kubelet和kubectl
# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 设置开机启动
systemctl enable --now kubelet
配置 cgroup 驱动程序
vim /etc/sysconfig/kubelet
删除原有内容,添加下面的内容
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
部署Kubernetes Master【master节点】
镜像准备
# 查看当前版本镜像
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
# 拉取镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock
如果拉取镜像时报以下错误,这是因为kubeadm发现了多个CRI,需要指定使用哪一个:Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v=5 or higher
初始化主节点
在 10.211.55.7 执行,也就是master节点,执行下面的命令:
kubeadm init --apiserver-advertise-address=10.211.55.7 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.29.0 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket unix:///var/run/cri-dockerd.sock
当我们出现下面的情况时,表示kubernetes的镜像已经安装成功
根据提示完成相应目录及配置文件的创建:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行完成后,我们使用下面命令,查看我们正在运行的节点
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 6m13s v1.29.0
能够看到,目前有一个master节点已经运行了,但是还处于未准备状态。
加入Kubernetes【Node节点】
下面我们需要到 node01 和 node02 服务器,执行下面的代码向集群添加新节点。
以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的,后面追加--cri-socket unix:///var/run/cri-dockerd.sock
kubeadm join 192.168.3.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:4746ed6ef7c224306d1689f284da56bd49fe7eaadfa1a75e2644185fd0a43109
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
kubeadm token create --print-join-command
当我们把两个节点都加入进来后,我们就可以去Master节点 执行下面命令查看情况
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 12m v1.29.0
k8s-node01 NotReady <none> 3m v1.29.0
k8s-node02 NotReady <none> 12s v1.29.0
部署CNI网络插件 calico
使用calico部署集群网络
按照官网安装步骤1安装
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
执行下面命令,如果容器状态为运行中,则代表该步骤执行完成
kubectl get pods -n tigera-operator
下载步骤2中的文件,修改文件的ip地址
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml
# 修改文件内容
vim custom-resources.yaml
修改为初始化主节点时--pod-network-cidr=10.244.0.0/16的值
cidr: 10.244.0.0/16
安装Calico
kubectl create -f custom-resources.yaml
执行下面命令,如果所有容器状态都为运行中,则代表安装完成
kubectl get pods -n calico-system
查看节点状态,节点应都为Ready状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 38m v1.29.0
k8s-node01 Ready <none> 35m v1.29.0
k8s-node02 Ready <none> 35m v1.29.0
测试kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
# 下载nginx 【会联网拉取nginx镜像】
kubectl create deployment nginx --image=nginx
# 查看状态
kubectl get pod
如果我们出现Running状态的时候,表示已经成功运行了
下面我们就需要将端口暴露出去,让其它外界能够访问:
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看一下对外的端口
kubectl get pod,svc
能够看到,我们已经成功暴露了 80 口 到 30205 上
我们到我们的宿主机浏览器上,访问如下地址:
http://10.211.55.7:30205/
发现我们的nginx已经成功启动了
评论区