前置条件

必须使用openEuler提供的kubernetes版本

本教程使用的是openEuler提供的kubernetes版本,isula才可以加入到kubernetes集群,其他版本的kubernetes可能无法支持isula。openEuler22.03LTS版本提供的kubernetes安装版本为1.20.2,笔者试过使用kubernetes官方的1.20.2版本,docker引擎能加入到kubernetes集群,唯独isula不行,不知道是什么原因,也可能需要特殊配置,总之,笔者没有成功过。

保证使用的kubernetes版本相同或者接近

最好不要出现api版本有差异的情况,否则也有可能导致兼容性问题,从而无法正常组成集群。

安装必要的软件包

在openEuler系统上,安装以下软件包

dnf install -y kubernetes kubernetes-kubeadm kubernetes-kubelet kubernetes-cni
dnf install -y iSulad

安装crictl

由于使用kubeadm加入集群会使用crictl进行检查,所以需要安装crictl。这里使用crictl v1.21.0,此版本接近 kubernetes1.20.2,是笔者验证了可用的版本。当然你也可以想办法跳过kubeadm的检查流程。

wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.21.0/crictl-v1.21.0-linux-amd64.tar.gz
tar xvf crictl-v1.21.0-linux-amd64.tar.gz -C /usr/bin

如果你的目标节点是其他架构的,如arm64、riscv64,则需要自行用go交叉编译源码

配置必要参数

创建目录和cni软链接

创建目录,避免由于没有目录而出现kubelet启动失败的问题。创建软链接,因为kubernetes-cni安装的cni目录,不是kubernetes cni插件默认的目录。

mkdir -p /opt/cni /etc/kubernetes/manifests
ln -s /usr/libexec/cni/ /opt/cni/bin

配置isula参数并重启服务

vi /etc/isulad/daemon.json

修改pod-sandbox-images字段内容,这里我填写了阿里云的镜像pause容器地址,你可以根据需要自行改动

"pod-sandbox-image": "registry.aliyuncs.com/google_containers/pause:3.2"

CNI 网络配置

需要配置CNI网络,如果不配置,创建的pod将会无法获取ip地址

/etc/isulad/daemon.json中配置isulad

"network-plugin": "cni",
"cni-bin-dir": "/opt/cni/bin",
"cni-conf-dir": "/etc/cni/net.d",

重启isula服务

systemctl restart isulad

加入集群

导出kubernetes join配置参数

kubeadm config print join-defaults > kubeadm-join-defaults.yaml

修改kubeadm-join-defaults.yaml中的参数

vi kubeadm-join-defaults.yaml

apiServerEndpoint修改为master节点的ip,token修改为master节点的token,tlsBootstrapToken修改为master节点的token,新增caCertHashes字段,其值修改为master节点提供的加入节点必须的hash值,最后criSocket需要修改为/var/run/isulad.sock。完整参数如下。

apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.12.239:6443
    token: abcdef.0123456789abcdef
    unsafeSkipCAVerification: true
    caCertHashes: [sha256:099ac7a996d5a8bbbdded90a7130585e188a4da6bf0055d2d195536bfa741c52]
  timeout: 5m0s
  tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/isulad.sock
  name: openeuler-node
  taints: null

加入集群

kubeadm join --config kubeadm-join-defaults.yaml

成功后的效果如下

常见问题

flannel组件处于CrashLoopBackOff状态

是init时没有加--pod-network-cidr参数

忘记了添加 podSubnet字段

networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16 # Pod 网段,flannel插件需要使用这个网段

flannel安装完成,却显示Not Ready

sudo ls /opt/cni/bin

显示只有flannel一个bin文件,说明缺少其他必要的文件

编译生成 CNI 插件的二进制文件,并将该二进制文件复制到 /opt/cni/bin

  $ git clone https://github.com/containernetworking/plugins.git
  $ cd plugins && ./build_linux.sh
  $ cd ./bin && ls
  bandwidth bridge dhcp firewall flannel ...

isula所在的节点仍然显示Not Ready

发现报错

Unable to read config path "/etc/kubernetes/manifests": path does not exist, ignoring

手动创建该路径即可

多看 kubelet跟isulad的日志

sudo journalctl -u kubelet

重装isulad就好了

记得必须要配置isulad

/etc/isulad/daemon.json中先配置pod-sandbox-image :

"pod-sandbox-image": "registry.aliyuncs.com/google_containers/pause:3.2"

kubadm join时出现奇怪报错

[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorized
To see the stack trace of this error execute with --v=5 or higher

此时需要及时修改join config中的token,所有的token都需要改

点击阅读全文
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐