一、环境说明

主机名、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 反复崩溃

先查内存和负载 free -h

top

kubectl 权限报错

export KUBECONFIG=/etc/kubernetes/admin.conf

镜像源超时

换源或用 scp 局域网传输


下次部署前的准备(提前做好)

# 部署前先改好所有节点的 containerd 镜像源
# 然后提前拉好所需镜像
# 这样 kubectl apply -f calico.yaml 后就能直接成功
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐