openeuler下安装部署k8s集群
如果系统中已经安装了Docker,请确保在安装containerd之前卸载Docker,否则可能会引发冲突。containerd要求使用1.6.22-15或更高版本,如果下载的版本过低请运行以下命令升级成1.6.22-15版本,或自行升级。最后,还需配置containerd镜像加速器,/etc/containerd/config.toml找到。执行如下命令,配置crictl使用containerd
一、环境说明
主机名、IP、操作系统版本如下表所示:
|
主机名 |
IP地址 |
操作系统 |
|
k8s-master |
192.168.123.135 |
Openeuler2403-sp1 |
|
k8s-node1 |
192.168.123.136 |
Openeuler2403-sp1 |
|
k8s-node2 |
192.168.123.137 |
Openeuler2403-sp1 |
进行下面操作之前,先更新openeuler的安装源,推荐使用华为云仓库,修改/etc/yum.repos.d/openEuler.repo文件,修改后内容如下:
[OS]
name=OS
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/OS/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/OS&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/OS/$basearch/RPM-GPG-KEY-openEuler
[everything]
name=everything
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/everything/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/everything&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/everything/$basearch/RPM-GPG-KEY-openEuler
[EPOL]
name=EPOL
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/EPOL/main/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/EPOL/main&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/OS/$basearch/RPM-GPG-KEY-openEuler
[debuginfo]
name=debuginfo
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/debuginfo/$basearch/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever/debuginfo&arch=$basearch
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/debuginfo/$basearch/RPM-GPG-KEY-openEuler
[source]
name=source
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/source/
metalink=https://repo.huaweicloud.com/metalink?repo=$releasever&arch=source
metadata_expire=1h
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/source/RPM-GPG-KEY-openEuler
[openEuler-update]
name=openEuler-update
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/update/$basearch/
enabled=1
gpgcheck=0
[update-source]
name=update-source
baseurl=http://repo.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP1/update/source/
enabled=1
gpgcheck=0
二、主机配置
下面操作需要在每个主机都执行一遍。这里以k8s-master主机为例。
1、修改主机名并配置hosts文件
[root@k8s-master ~]# hostnamectl set-hostname k8s-master
[root@k8s-node1 ~]# hostnamectl set-hostname k8s-node1
[root@k8s-node2 ~]# hostnamectl set-hostname k8s-node2
将IP与主机名写入到/etc/hosts文件内。
[root@k8s-master ~]# more /etc/hosts
127.0.0.1 localhost
192.168.123.135 k8s-master
192.168.123.136 k8s-node1
192.168.123.137 k8s-node2
2、开启流量转发
启用桥接网络上的IPv6和IPv4流量,通过iptables进行过滤,并启动IP转发,运行内核转发IPv4包,确保跨界点的Pod间通信:
[root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf
要让br_netfilter模块开机自动加载,需要创建/etc/modules-load.d/br_netfilter.conf文件,内容如下:
br_netfilter
这样,br_netfilter模块就会开机自启动了。
最后,还要将/etc/sysctl.d/k8s.conf开机自动给执行,在/etc/rc.local中写入下面内容:
sysctl -p /etc/sysctl.d/k8s.conf
还要修改/etc/rc.local权限为可执行:
[root@k8s-master ~]# chmod 755 /etc/rc.local
配置完成后,重启服务器,模块会自动加载,k8s.conf中的参数也会自动运行。
注意,在openeuler系统中,由于/etc/sysctl.conf中也定义了net.ipv4.ip_forward参数,所以,在/etc/sysctl.conf中,找到‘net.ipv4.ip_forward=0’行,然后删除,上面的配置才能生效。
sed -i '/net.ipv4.ip_forward=0/d' /etc/sysctl.conf
[root@k8s-master ~]# yum install -y containerd
[root@k8s-master ~]# yum install -y kubernetes*
[root@k8s-master ~]# yum install -y cri-tools
如果系统中已经安装了Docker,请确保在安装containerd之前卸载Docker,否则可能会引发冲突。containerd要求使用1.6.22-15或更高版本,如果下载的版本过低请运行以下命令升级成1.6.22-15版本,或自行升级。
[root@k8s-master ~]# wget --no-check-certificate https://repo.openeuler.org/openEuler-24.03-LTS/update/x86_64/Packages/containerd-1.6.22-15.oe2403.x86_64.rpm
[root@k8s-master ~]# rpm -Uvh containerd-1.6.22-15.oe2403.x86_64.rpm


2、下载cni组件
[root@k8s-master ~]# mkdir -p /opt/cni/bin
[root@k8s-master ~]# cd /opt/cni/bin
[root@k8s-master ~]# wget --no-check-certificate https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
[root@k8s-master ~]# tar -xzvf cni-plugins-linux-amd64-v1.5.1.tgz

四、配置containerd
下面操作需要在每个主机都执行一遍。这里以k8s-master主机为例。首先生成containerd 配置文件:
[root@k8s-master ~]# containerd_conf="/etc/containerd/config.toml"
[root@k8s-master ~]# mkdir -p /etc/containerd
[root@k8s-master ~]# containerd config default > "${containerd_conf}"
下面开始修改/etc/containerd/config.toml文件,主要修改的地方有几个:
首先,配置pause_image,找到sandbox镜像地址,将
sandbox_image = "registry.k8s.io/pause:3.9"
修改为:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

然后,将cgroup驱动指定为systemd:,可执行如下命令直接修改:
sed -i "/SystemdCgroup/s/=.*/= true/" "${containerd_conf}"
接着,关闭"registry.k8s.io"镜像源证书验证:
sed -i '/plugins."io.containerd.grpc.v1.cri".registry.configs/a\[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.k8s.io".tls]\n insecure_skip_verify = true' /etc/containerd/config.toml
最后,还需配置containerd镜像加速器,/etc/containerd/config.toml找到
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
#需要找到上面这一行,并添加下面2行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io", "https://docker.1ms.run"]

containerd配置文件修改完成后,重启containerd服务:
systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd
修改vim kubeletConfig.yaml文件

五、配置crictl使用containerd作为容器运行时
执行如下命令,配置crictl使用containerd,每个集群节点都要操作一遍。
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
会生成配置文件/etc/crictl.yaml。
六、配置kubelet使用systemd作为cgroup驱动
执行如下命令,需要每个集群节点操作一遍:
systemctl enable kubelet.service
echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' >> /etc/sysconfig/kubelet
七、使用Kubeadm创建集群
1、配置集群信息
使用如下命令生成集群配置文件,只需要在master节点生成一个即可。
[root@k8s-master ~]# kubeadm config print init-defaults --component-configs KubeletConfiguration >> kubeletConfig.yaml
在kubeletConfig.yaml文件中,需要配置节点名称、广播地址(advertiseAddress)以及Pod网络的CIDR。
注意是advertiseAddress、name、 imageRepository、kubernetesVersion、 serviceSubnet、podSubnet几个参数选项。
其中:
- advertiseAddress是k8s集群master节点的IP地址
- name是k8s集群master节点的主机名
- imageRepository是k8s组件下载镜像的地址,这里必须修改为国内可直接下载的镜像,默认registry.k8s.io无法下载镜像,可修改为阿里云镜像地址registry.aliyuncs.com/google_containers
- kubernetesVersion是指定安装的k8s版本,根据安装环境选择即可
- serviceSubnet指定service网络地址段,可保持默认
- podSubnet指定pod网络地址段。可保持默认
2、初始化部署集群
在master节点执行如下命令:
[root@k8s-master ~]# kubeadm init --config kubeletConfig.yaml
如下则表示初始化成功

初始化成功后,指定kubectl使用的配置文件:
[root@k8s-master ~]# mkdir -p "$HOME"/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
[root@k8s-master ~]# chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
最后,执行kubeadm join 将其他节点k8s-node1、k8s-node2加入集群,以k8s-node1为例:
[root@k8s-node1 ~]# kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
如下则表示node节点加入成功

加入后可以在k8s-master通过以下命令查看工作节点的状态:
[root@k8s-master ~]# kubectl get nodes
如果节点状态显示为not ready,是因为网络插件未成功部署。所以,接下来还需要安装网络插件。

八、部署网络插件
本教程中使用calico作为cni插件,以下介绍calico下载和部署。 以下使用地址下载calico资源文件:
https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
使用kubectl apply部署网络插件calico.yaml。
[root@k8s-master ~]# kubectl apply -f calico.yaml
再次执行,发现每个节点均处于Ready状态。
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 23h v1.29.1
k8s-node1 Ready <none> 23h v1.29.1
k8s-node2 Ready <none> 23h v1.29.1
若无法拉取查看下述操作
标准处理流程
第一步:确认问题
# 查看节点状态
kubectl get nodes
# 查看 Pod 状态
kubectl get pods -n kube-system
# 查看具体报错
kubectl describe pod <pod名> -n kube-system | grep -A10 "Events:"
# 查看系统日志
tail -20 /var/log/messages | grep error
第二步:测试可用镜像源
curl -I https://docker.m.daocloud.io/v2/
curl -I https://docker.1ms.run/v2/
# 返回 401 说明可用,超时或报错说明不可用
第三步:修改 containerd 配置(所有节点)
vim /etc/containerd/config.toml
找到 mirrors 部分修改为:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io", "https://docker.1ms.run"]
bash
systemctl restart containerd
第四步:手动拉取镜像(master 节点)
# 拉取(不要 Ctrl+C)
ctr -n k8s.io images pull docker.m.daocloud.io/calico/cni:v3.27.0
ctr -n k8s.io images pull docker.m.daocloud.io/calico/node:v3.27.0
ctr -n k8s.io images pull docker.m.daocloud.io/calico/kube-controllers:v3.27.0
# 打 tag
ctr -n k8s.io images tag docker.m.daocloud.io/calico/cni:v3.27.0 docker.io/calico/cni:v3.27.0
ctr -n k8s.io images tag docker.m.daocloud.io/calico/node:v3.27.0 docker.io/calico/node:v3.27.0
ctr -n k8s.io images tag docker.m.daocloud.io/calico/kube-controllers:v3.27.0 docker.io/calico/kube-controllers:v3.27.0
第五步:通过 scp 分发到其他节点(最快)
# master 上打包
ctr -n k8s.io images export calico-images.tar \
docker.io/calico/cni:v3.27.0 \
docker.io/calico/node:v3.27.0 \
docker.io/calico/kube-controllers:v3.27.0
# 传给各节点
scp calico-images.tar root@k8s-node1:/root/
scp calico-images.tar root@k8s-node2:/root/
# 各节点上导入
ctr -n k8s.io images import /root/calico-images.tar
第六步:触发重建
kubectl delete pods -n kube-system -l k8s-app=calico-node
kubectl delete pods -n kube-system -l app=calico-kube-controllers
watch kubectl get nodes
注意事项
|
问题 |
解决 |
|
节点内存不足(<2GB) |
master 至少分配 4GB |
|
apiserver 反复崩溃 |
先查内存和负载
|
|
kubectl 权限报错 |
|
|
镜像源超时 |
换源或用 scp 局域网传输 |
下次部署前的准备(提前做好)
# 部署前先改好所有节点的 containerd 镜像源
# 然后提前拉好所需镜像
# 这样 kubectl apply -f calico.yaml 后就能直接成功
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)