k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装

官网参考文档:iSulad+k8s环境部署 | 文档 | openEuler社区

  1. 按照官网步骤初始化安装环境,安装配置必备的组件

  2. 安装keepalived,并配置高可用(配置脚本在第一篇中已写过,不做赘述)

  3. 下载k8s安装镜像,因为墙的原因,国内直接访问registry.k8s.io地址访问不了,必须通过国内镜像"曲线救国",脚本如下,通过 sudo chmod + ./install.sh 给脚本添加执行权限,直接运行 sudo ./install.sh 便可完成镜像拉取工作。官网使用k8smx我没拉下来,我不知道是网络问题还是什么原因,这里我用的别的镜像地址。

    #!/bin/bash

    #这里设置了下拉镜像的版本号v1.29.1 可以根据自己的需求修改

    mapfile -t images < <(sudo kubeadm config images list --kubernetes-version v1.29.1 | sed "s/registry.k8s.io/k8s.m.daocloud.io/g")
    for src_img in "{images[@]}"; do dest_img=(echo "src_img" | sed "s|k8s.m.daocloud.io|registry.k8s.io|g") sudo isula pull "src_img"
    sudo isula tag "src_img" "dest_img"
    sudo isula rmi "$src_img"
    done;

  4. 下载calico网络插件的镜像,你可以换别的网络插件,这里我用的是calico,执行方法同上。

    // pull-calico.sh

    #!/bin/bash

    这里可以根据自己想要的版本修改

    sudo isula pull docker.m.daocloud.io/calico/apiserver:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/whisker-backend:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/whisker:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/goldmane:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/typha:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/node-driver-registrar:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/csi:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/pod2daemon-flexvol:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/node:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/kube-controllers:v3.30.2
    sudo isula pull docker.m.daocloud.io/calico/cni:v3.30.2

  5. 配置kubeadm-config.yaml文件 因为这里涉及高可用和自定义的pods运行网络规划,还有版本和镜像地址的修改等多项配置,直接用官网的

    kubeadm init --kubernetes-version v1.20.2 --cri-socket=/var/run/isulad.sock --pod-network-cidr=[指定pod分配IP段]

初始化命令不能解决当前的配置环境。所以我自己写了一个配置文件,大家可以根据自己的环境需求自行修改。

复制代码
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
  criSocket: "unix:///var/run/isulad.sock"
localAPIEndpoint:
  advertiseAddress: 22.12.70.140
  bindPort: 6443
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controlPlaneEndpoint: "22.12.70.140:6443"
apiServer:
  certSANs:
  - 22.12.70.140
  - 22.12.70.141
  - 22.12.70.142
  - 22.12.70.143
  - k8s-isulad-master1
  - k8s-isulad-master2
  - k8s-isulad-master3
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kubernetesVersion: v1.29.1
networking:
  dnsDomain: cluster.local
  podSubnet: 22.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

这里的k8s-isulad-master1、k8s-isulad-master2、k8s-isulad-master3 分别是我配置的3个高可用master节点。

6、 执行初始化

复制代码
kubeadm init --config kubeadm-config.yaml --upload-certs --skip-phases=preflight 

这里使用了--skip-phases 目的是初始化时系统,跳过预检查,不然系统会按照kubeadm config images list的结果重新去拉取镜像,因为网络不可达,就卡死那了。或者命令不会正常执行。

使用 --upload-certs 目的是获取master节点的秘钥,不然初始化成功后只打印worker节点的join命令,不会体现master节点的秘钥信息。

  1. 重置或秘钥过期重新查看(非必要执行步骤)

如果安装不成功,需要在初始化前重置系统,情况上次安装的配置信息,不然系统不能正常安装。

复制代码
sudo kubeadm reset -f 
sudo rm -rf /etc/kubernetes/pki /var/lib/etcd  /etc/cni/net.d/
# 删除残留容器或pods
sudo crictl ps -a  #查看如果没有残留pod下面命令无须执行
sudo crictl stopp "pod-id" # 如何当前的pod在Running状态需要先暂停pod才能删除
sudo crictl rmpp "pod-id"  # 如果全部处于不运行状态可以使用 --all 参数
# 查看确保pods全部为空,有时候使用crictl 不能直接删除,可以用isula试试
sudo crictl pods

sudo isula ps -a
sudo isula stop "pod-id"
sudo isula rm "pod-id"

#重启服务
sudo systemctl restart isulad
sudo systemctl restart kubelet

#如果有故障可以通过下面命令查看日志信息
# 查看kubelet收集的apiserver容器日志
sudo journalctl -u kubelet -n 100 --no-pager | grep apiserver

join秘钥过期 master节点查看命令 kubeadm init phase upload-certs --upload-certs

worker节点查看命令

复制代码
kubeadm token create --print-join-command

8、安装网络插件

参考官网文档:Calico quickstart guide | Calico Documentation

复制代码
wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/tigera-operator.yaml

wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.2/manifests/custom-resources.yaml

// vim custom-resources.yaml

apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    ipPools:
    - name: default-ipv4-ippool
      blockSize: 26
      cidr: 22.244.0.0/16         //配置成自己的网络
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
  imagePullSecrets: []
  variant: Calico
  registry: docker.m.daocloud.io  // 设置国内镜像拉取地址
---

# This section configures the Calico API server.
# For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
spec: {}

---

# Configures the Calico Goldmane flow aggregator.
apiVersion: operator.tigera.io/v1
kind: Goldmane
metadata:
  name: default

---

# Configures the Calico Whisker observability UI.
apiVersion: operator.tigera.io/v1
kind: Whisker
metadata:
  name: default

kubectl apply -f tigera-operator.yaml
kubectl apply -f custom-resources.yaml

// 使用命令查看网络启动状态
watch kubectl get tigerastatus
// 这个状态就正常了
NAME        AVAILABLE   PROGRESSING   DEGRADED   SINCE
apiserver   True        False         False      23h
calico      True        False         False      4h50m
goldmane    True        False         False      23h
ippools     True        False         False      23h
whisker     True        False         False      23h

9、初始化成功后添加新的master节点

在其他节点运行

复制代码
sudo kubeadm join 22.12.70.140:6443 --token ctldnb.nxhq79u0t6fh6aoo --cri-socket="unix:///var/run/isulad.sock" --discovery-token-ca-cert-hash sha256:722f3d0c6ad078d52fc3307ff9b363bac6cb255aff7dbc31cb99dc02d44acb9e --control-plane --certificate-key bbe3cf27bc8cea21da2d9b990a552413382a0dc250a99a8a46aea830caf33910 --skip-phases=preflight

// 这里--certificate-key 值就为kubeadm init phase upload-certs --upload-certs得到的结果
// 当前步骤不用需要执行kubeadm init phase upload-certs --upload-certs,因为初始化成功后系统自动打印--certificate-key的值

添加新节点。

执行这一步的前提是其他master节点上已经正常执行了1~4步。

在第一个节点上使用kubectl get node 可以看到第二个master节点加入,但是状态处于NoReady状态,是因为网络服务还还没有正常启动。

可以使用watch kubectl get tigerastatus 命令在master1上查看,第一栏都是true就说明运行起来了

可以通过kubectl get pod -A 查看系统各个pod都运行正常吗,如果正常说明master节点安装成功,参考上述步骤继续添加第三个节点。