安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统: Rocky Linux 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
修改内核参数
cat > /etc/sysctl.conf << EOF
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p
加载内核模块
cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
nf_conntrack
EOF
# 加载模块
cat /etc/modules-load.d/{ipvs,k8s}.conf | xargs -n 1 modprobe
# 校验
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 -e br_netfilter -e nf_conntrack -e overlay
安装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
添加kubernetes软件源(注意修改为自己需要的版本号)
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.ustc.edu.cn/kubernetes/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
EOF
安装kubeadm,kubelet和kubectl
# 安装kubelet、kubeadm、kubectl
yum install -y kubelet kubeadm kubectl
配置 cgroup 驱动程序
vim /etc/sysconfig/kubelet
删除原有内容,添加下面的内容
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
安装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://ghfast.top/github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd-0.3.21.amd64.tgz
# 安装二进制文件
tar zxvf cri-dockerd-0.3.21.amd64.tgz
cd cri-dockerd
mkdir -p /usr/local/bin
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
安装systemd服务文件
rm -rf cri-dockerd
git clone https://ghfast.top/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.34.2的k8s中的pause版本是3.10.1
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1 --container-runtime-endpoint fd://
可以使用下面命令查看当前版本pause版本
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
启动cri-dockerd
systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
部署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.34.2 \
--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.34.2
能够看到,目前有一个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.34.2
k8s-node01 NotReady <none> 3m v1.34.2
k8s-node02 NotReady <none> 12s v1.34.2
部署CNI网络插件 calico
使用calico部署集群网络

下载步骤1文件修改镜像仓库
wget https://ghfast.top/raw.githubusercontent.com/projectcalico/calico/v3.31.2/manifests/tigera-operator.yaml
# 修改文件内容
vim tigera-operator.yaml
找到这一行image: quay.io/tigera/operator,修改仓库地址
image: quay.m.ixdev.cn/tigera/operator......
安装Tigera Operator 和自定义资源定义
kubectl create -f tigera-operator.yaml
执行下面命令,如果容器状态为运行中,则代表该步骤执行完成
kubectl get pods -n tigera-operator
下载步骤2中的文件,修改文件的ip地址,配置镜像仓库
wget https://ghfast.top/raw.githubusercontent.com/projectcalico/calico/v3.31.2/manifests/custom-resources.yaml
# 修改文件内容
vim custom-resources.yaml
在spec:下,添加下面一行, 指定镜像仓库
registry: quay.m.ixdev.cn
修改为初始化主节点时--pod-network-cidr=10.244.0.0/16的值
cidr: 10.244.0.0/16
修改完文件内容:
...... apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: registry: quay.m.ixdev.cn # Configures Calico networking. calicoNetwork: ipPools: - name: default-ipv4-ippool blockSize: 26 cidr: 10.244.0.0/16 encapsulation: VXLANCrossSubnet natOutgoing: Enabled nodeSelector: all() ......
安装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.34.2
k8s-node01 Ready <none> 35m v1.34.2
k8s-node02 Ready <none> 35m v1.34.2
设置开机启动(所有节点)
systemctl enable --now kubelet
测试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已经成功启动了

补充
开启IPVS 模式
查看当前kube-proxy的代理模式
# 返回ipvs代表ipvs模式已开启
curl localhost:10249/proxyMode

所有节点安装ipset及ipvsadm
yum install ipset ipvsadm -y
修改kube-proxy模式为ipvs
# 把 mode: "" 改为mode: "ipvs" 保存退出即可
kubectl edit cm kube-proxy -n kube-system
删除之前的proxy pod
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
查看proxy运行状态
[root@k8s-master ~]# kubectl get pod -n kube-system | grep kube-proxy
kube-proxy-9487j 1/1 Running 0 33m
kube-proxy-fkdd9 1/1 Running 0 33m
kube-proxy-kfp4c 1/1 Running 0 33m


评论区