节点接入

用户根据节点自身的状况,选择下述其中一种方法来接入节点

1. 从零开始把节点加入集群

1.1 yurtadm join

用户可以通过 Yurtadm join 将云端节点、边缘节点加入 OpenYurt 集群。注意,在加入节点时,需要在节点上安装运行时,并关闭交换分区。

执行以下命令加入边缘节点:

  1. $ _output/local/bin/linux/amd64/yurtadm join 1.2.3.4:6443 --token=zffaj3.a5vjzf09qn9ft3gt --node-type=edge --discovery-token-unsafe-skip-ca-verification --v=5

执行以下命令加入云端节点:

  1. $ _output/local/bin/linux/amd64/yurtadm join 1.2.3.4:6443 --token=zffaj3.a5vjzf09qn9ft3gt --node-type=cloud --discovery-token-unsafe-skip-ca-verification --v=5

当边缘节点runtime为containerd时,需要配置cri-socket参数,如上面执行命令加入边缘节点改为:

  1. $ _output/local/bin/linux/amd64/yurtadm join 1.2.3.4:6443 --token=zffaj3.a5vjzf09qn9ft3gt --node-type=edge --discovery-token-unsafe-skip-ca-verification --cri-socket=/run/containerd/containerd.sock --v=5

对参数的解释:

  • 1.2.3.4:6443: apiserver 的地址
  • --token:bootstrap token
  • --node-type:openyurt 节点类型,可以为:cloud 或者 edge

如何编译yurtadm二进制,可以参考链接

yurtadm join 的过程会自动安装以下k8s组件:

  • kubeadm
  • kubectl
  • kubelet
  • kube-proxy

yurtadm join的过程中,将会拉取经过特殊修改的cni二进制文件,修改的内容可以参考链接。如果你想要使用预先准备好的cni二进制文件,你应该将它们放置在目录/opt/cni/bin下,接着在使用yurtadm join时添加--reuse-cni-bin=true参数即可。

你也可以将kubeletkubeadm组件提前预置在PATH环境变量中。不过对于kubeletkubeadm的版本有一些限制,yurtadm会检查组件的major versionminor version是否与集群Kubernetes版本相同(这遵循semver规范)。

1.2 yurtadm reset

当需要删除使用 yurtadm join 加入的节点时,可以使用 yurtadm reset。下面是详细步骤:

在 master 节点上:

  1. kubectl drain {NodeName} --delete-local-data --force --ignore-daemonsets
  2. kubectl delete node {NodeName}

在 join 的节点上:

  1. 执行 yurtadm reset
  1. yurtadm reset
  1. 删除 /etc/cni/net.d目录:
  1. rm -rf /etc/cni/net.d

2. 在存量的K8s节点上安装OpenYurt Node组件

下述操作,仅仅针对已经是Kubernetes集群的工作节点。

2.1 给节点打标签

OpenYurt需要根据节点的openyurt.io/is-edge-worker标签区分云端节点和边缘节点,从而在云边断联情况下判断是否驱逐节点上Pod. 假设我们的节点us-west-1.192.168.0.88是一个边缘节点,则

  1. $ kubectl label node us-west-1.192.168.0.88 openyurt.io/is-edge-worker=true
  2. node/us-west-1.192.168.0.88 labeled

如果us-west-1.192.168.0.88不是一个边缘节点,则将true改为false即可

为了激活自治模式,我们需要通过如下命令给边缘节点添加注解。

  1. $ kubectl annotate node us-west-1.192.168.0.88 node.beta.openyurt.io/autonomy=true
  2. node/us-west-1.192.168.0.88 annotated

如果希望使用OpenYurt的单元化管理能力,我们可以将该节点加入节点池中:

  1. $ cat <<EOF | kubectl apply -f -
  2. apiVersion: apps.openyurt.io/v1alpha1
  3. kind: NodePool
  4. metadata:
  5. name: worker
  6. spec:
  7. type: Edge
  8. EOF
  9. $ kubectl label node us-west-1.192.168.0.87 apps.openyurt.io/desired-nodepool=worker

2.2 部署Edge工作模式的Yurthub

  • openyurt repo获取yurthub.yaml,执行如下修改后上传到边缘节点的/etc/kubernets/manifests目录。
  • 获取 apiserver 的地址 (即ip:port) 和 bootstrap token ,用于替换模板文件 yurthub.yaml 中的对应值

在下面的命令中,我们假设 apiserver 的地址是 1.2.3.4:5678,bootstrap token 是 07401b.f395accd246ae52d

  1. $ vi /etc/kubernetes/manifests/yurt-hub.yaml
  2. ...
  3. command:
  4. - yurthub
  5. - --v=2
  6. - --server-addr=https://1.2.3.4:5678
  7. - --node-name=$(NODE_NAME)
  8. - --join-token=07401b.f395accd246ae52d
  9. ...

Yurthub 将在几分钟内准备就绪。

2.3 配置Kubelet

接下来需要重置kubelet服务,让kubelet通过Yurthub访问apiserver (以下步骤假设我们以root身份登录到边缘节点)。由于 kubelet 会通过 http 连接 Yurthub,所以我们为 kubelet 服务创建一个新的 kubeconfig 文件。

  1. mkdir -p /var/lib/openyurt
  2. cat << EOF > /var/lib/openyurt/kubelet.conf
  3. apiVersion: v1
  4. clusters:
  5. - cluster:
  6. server: http://127.0.0.1:10261
  7. name: default-cluster
  8. contexts:
  9. - context:
  10. cluster: default-cluster
  11. namespace: default
  12. user: default-auth
  13. name: default-context
  14. current-context: default-context
  15. kind: Config
  16. preferences: {}
  17. EOF

为了让 kubelet 使用新的 kubeconfig,我们编辑 kubelet 服务的 drop-in 文件(即 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 或者 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 在 CentOS 系统上))。

  1. sed -i "s|KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=\/etc\/kubernetes\/bootstrap-kubelet.conf\ --kubeconfig=\/etc\/kubernetes\/kubelet.conf|KUBELET_KUBECONFIG_ARGS=--kubeconfig=\/var\/lib\/openyurt\/kubelet.conf|g" \
  2. /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

然后,我们重启 kubelet 服务。

  1. # assume we are logged in to the edge node already
  2. $ systemctl daemon-reload && systemctl restart kubelet

最后,当重启Kubelet之后需要确认节点状态是否Ready。

  1. $ kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. us-west-1.192.168.0.87 Ready <none> 3d23h v1.20.11
  4. us-west-1.192.168.0.88 Ready <none> 3d23h v1.20.11

2.4 重建节点上的Pods

当安装完Yurthub并且调整好Kubelet配置后,为了让节点上所有Pods(Yurthub除外)都可以通过Yurthub访问Kube-apiserver,所有需要重建节点上所有Pods(Yurthub pod除外)。请务必确认该操作对生产环境的影响后再执行。

  1. $ kubectl get pod -A -o wide | grep us-west-1.192.168.0.88
  2. kube-system yurt-hub-us-west-1.192.168.0.88 1/1 Running 0 19d 172.16.0.32 us-west-1.192.168.0.88 <none> <none>
  3. kube-system coredns-qq6dk 1/1 Running 0 19d 10.148.2.197 us-west-1.192.168.0.88 <none> <none>
  4. kube-system kube-flannel-ds-j698r 1/1 Running 0 19d 172.16.0.32 us-west-1.192.168.0.88 <none> <none>
  5. kube-system kube-proxy-f5qvr 1/1 Running 0 19d 172.16.0.32 us-west-1.192.168.0.88 <none> <none>
  6. // 删除节点上所有pods(Yurthub pod除外)
  7. $ kubectl -n kube-system delete pod coredns-qq6dk kube-flannel-ds-j698r kube-proxy-f5qvr
  8. // 确认节点上所有pods正常运行
  9. $ kubectl get pod -A -o wide | grep us-west-1.192.168.0.88
  10. kube-system yurt-hub-us-west-1.192.168.0.88 1/1 Running 0 19d 172.16.0.32 us-west-1.192.168.0.88 <none> <none>
  11. kube-system coredns-qq6ad 1/1 Running 0 19d 10.148.2.198 us-west-1.192.168.0.88 <none> <none>
  12. kube-system kube-flannel-ds-j123d 1/1 Running 0 19d 172.16.0.32 us-west-1.192.168.0.88 <none> <none>
  13. kube-system kube-proxy-a2qdc 1/1 Running 0 19d 172.16.0.32 us-west-1.192.168.0.88 <none> <none>