一、 服务器环境及初始化
1、架构分析
| 集群角色 | 主机名 | 操作系统 | IP地址 |
|---|---|---|---|
| master | k8s-master | OpenEuler24.03 | 192.168.137.115 |
| node | k8s-node1 | OpenEuler24.03 | 192.168.137.116 |
| node | k8s-node2 | OpenEuler24.03 | 192.168.137.117 |
2、初始化
所有节点都需要初始化!
2.1、清空Iptales默认规则及关闭防火墙
iptables -t nat -F iptables -t filter -F systemctl disable --now firewalld
2.2、关闭SELINUX
setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.3、关闭Swap交换空间
swapoff -a sed -i 's/.*swap.*/#&/' /etc/fstab
2.4、设置主机名
hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2
2.5、编写hosts文件
cat <<EOF > /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.137.115 k8s-master 192.168.137.116 k8s-node1 192.168.137.117 k8s-node2 EOF ###拷贝到node节点 scp /etc/hosts 192.168.137.116:/etc scp /etc/hosts 192.168.137.117:/etc
2.6、设置内核参数
注意:安装完成docker-ce并启动之后方可设置!
cat <<EOF >> /etc/sysctl.conf net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF modprobe br_netfilter sysctl net.bridge.bridge-nf-call-ip6tables=1 sysctl net.bridge.bridge-nf-call-iptables=1 sysctl -p
二、安装Docker环境
所有节点都需要安装!
1、安装Docker
1.1、配置阿里源
cat <<EOF >> /etc/yum.repos.d/docker-ce.repo [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/9/x86_64/stable/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg EOF
1.2、安装docker
yum install -y docker-ce-28.0.3
1.3、启动docker
cat <<EOF >>/etc/docker/daemon.json { "registry-mirrors": [ "https://0vmzj3q6.mirror.aliyuncs.com", "https://docker.m.daocloud.io", "https://mirror.baidubce.com", "https://dockerproxy.com", "https://mirror.iscas.ac.cn", "https://huecker.io", "https://dockerhub.timeweb.cloud", "https://noohub.ru", "https://vlgh0kqj.mirror.aliyuncs.com" ] } EOF systemctl daemon-reload systemctl enable --now docker
2、安装cri-docker
下载地址:https://github.com/Mirantis/cri-dockerd/releases
yum install -y libcgroup rpm -ivh cri-dockerd-0.3.8-3.el8.x86_64.rpm #或者 yum localinstall cri-dockerd-0.3.8-3.el8.x86_64.rpm
修改CRI启动脚本
vim /usr/lib/systemd/system/cri-docker.service ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
启动cri
systemctl daemon-reload systemctl enable --now cri-docker
三、安装kubeadm和kubectl
所有节点都需要安装!
1、配置yum源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key EOF
2、安装
yum install -y kubelet kubeadm kubectl
3、设置kubectl开机自启动
systemctl enable kubelet && systemctl start kubelet
4、启动kubeadm和kubectl命令补齐功能
source <(kubeadm completion bash) source <(kubectl completion bash) echo -e "source <(kubeadm completion bash)\nsource <(kubectl completion bash)" >> /root/.bashrc source /root/.bashrc
四、部署Master节点
在k8s-master节点执行下述命令:
kubeadm init --apiserver-advertise-address=192.168.137.115 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.15 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --cri-socket=unix:///var/run/cri-dockerd.sock
命令解析:
--apiserver-advertise-address:指定 API Server 监听的 IP 地址。如果没有设置,则将使用默认的网络接口。
--image-repository:指定镜像仓库地址。默认值为"registry.k8s.io",但该仓库在中国无法访问,因此这里指定阿里云仓库。
--kubernetes-version:指定 Kubernetes 版本。
--pod-network-cidr:指定 Pod 网络的 CIDR 地址范围。
--service-cidr:指定 Service 网络的 CIDR 地址范围。
--cri-socket:指定 kubelet 连接容器运行时的 UNIX 套接字文件。
执行命令后,kubeadm 会执行一系列任务,具体如下:
[preflight]:该阶段执行一系列检查,验证当前系统环境是否满足 Kubernetes 的安装要求,包括: CPU 和内存是否满足最低要求。 网络是否正常。 操作系统版本是否满足要求。 容器运行时是否可以连接。 内核参数是否正确配置。 下载所需的容器镜像。 [certs]:生成 Kubernetes 组件所需的 HTTPS 证书和密钥,并将其存储到“/etc/ kubernetes/pki”目录中。 [kubeconfig]:生成 kubeconfig 文件,其中包含 API Server 地址、客户端证书等信息,并将其存储在“/etc/kubernetes”目录中。 [kubelet-start]:生成 kubelet 配置文件“/var/lib/kubelet/config.yaml”并启动 kubelet服务。 [control-plane]:为 kube-apiserver、kube-controller-manager 和 kube-scheduler 创建静态 Pod 资源文件,并将其存储到“/etc/kubernetes/manifests”目录中。 [etcd]:为 etcd 创建静态 Pod 资源文件,并将其存储在“/etc/kubernetes/manifests”目录中。 [wait-control-plane]:等待 kubelet 从目录“/etc/kubernetes/manifest”中以静态 Pod的形式启动 Master 组件。 [apiclient]:检查 Master 组件是否健康。 [upload-config]:将 kubeadm 配置存储在 ConfigMap 对象中。 [kubelet]:将 kubelet 配置存储在 ConfigMap 对象中。 [upload-certs]:提示用户跳过证书上传。 [mark-control-plane]:给 Master 节点添加标签和污点。 [bootstrap-token]:生成引导令牌,供 Node 节点在加入集群时使用。 [kubelet-finalize]:更新 kubelet 配置文件(/etc/kubernetes/kubelet.conf)。 [addons]:安装 CoreDNS 和 kube-proxy 插件。
出问题后,集群还原
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
注意保存证书文件
每个人的证书是不一致的,注意查看自己的证书。
kubeadm join 192.168.137.115:6443 --token lc8z1k.j8lnrixca1e61cgp \ --discovery-token-ca-cert-hash sha256:662fecb08139e912c204c079902a8ed310f460ed6971d6537406d8740eb316b7
配置管理集群文件
mkdir -p $HOME/.kube cd /root/.kube cp /etc/kubernetes/admin.conf ./config ###查看集群状态 kubectl get nodes
五、部署node节点
分别在k8s-node1和k8s-node2中执行:
kubeadm join 192.168.137.115:6443 --token yfpfev.qcwe566xkv0v646b \ --discovery-token-ca-cert-hash sha256:17288e006a6f1c0a8c4ac6b1311c1f3792edc93179d3fc84a0efb4a10ffc19fa --cri-socket=unix:///var/run/cri-dockerd.sock
查看集群状态:
[root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 2d16h v1.28.15 k8s-node1 NotReady <none> 2d16h v1.28.15 k8s-node2 NotReady <none> 2m14s v1.28.15
目前看到的是NotReady状态,是由于没有安装网络插件的原因。ROLES角色一栏显示"none",可以通过一下命令修改角色名称:
kubectl label node k8s-master node-role.kubernetes.io/master=master kubectl label node k8s-node1 node-role.kubernetes.io/worker=worker kubectl label node k8s-node2 node-role.kubernetes.io/worker=worker
六、部署网络插件
calico组件的相关镜像,目前在国内无法下载。需要在master主机先创建calico的相关资源,然后查看所需镜像,最后通过外网服务器进行下载。具体的操作流程如下:
提交资源清单:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/tigera-operator.yaml [root@k8s-master ~]# kubectl create -f tigera-operator.yaml wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/custom-resources.yaml ##编辑网络信息 vim custom-resources.yaml apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - blockSize: 26 cidr: 10.244.0.0/16 # 修改此值,与“kubeadm init”命令中指定的 Pod 网络CIDR 地址范围保持一致 encapsulation: VXLANCrossSubnet natOutgoing: Enabled nodeSelector: all() ... [root@k8s-master ~]# kubectl create -f custom-resources.yaml
资源提交后,使用下述命令列出所需的镜像文件:
[root@k8s-master ~]# kubectl -n calico-system describe pod | grep "Image:" | sort | uniq Image: docker.io/calico/cni:v3.26.0 Image: docker.io/calico/csi:v3.26.0 Image: docker.io/calico/kube-controllers:v3.26.0 Image: docker.io/calico/node-driver-registrar:v3.26.0 Image: docker.io/calico/node:v3.26.0 Image: docker.io/calico/pod2daemon-flexvol:v3.26.0 Image: docker.io/calico/typha:v3.26.0 [root@k8s-master ~]# kubectl -n calico-apiserver describe pod calico-apiserver-894947d4b-bqc7x | grep -i 'image:' Image: docker.io/calico/apiserver:v3.26.0 kubectl -n calico-system delete pod calico-node-8spwx #重启 calico-node pod(触发重新拉取):