手动安装OpenYurt

本教程展示了如何手动部署 OpenYurt 集群。本教程使用是一个双节点Kubernetes集群,使用的所有 yaml 文件都可以在 openyurt repoyurt-app-manager repo下找到。

1 Kubernetes集群环境

用户需要先自行准备好一个Kubernetes集群(可以通过kubeadm工具搭建),本文档中以2节点的Kubernetes为例。

  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

1.1 给云端节点和边缘节点打标签

当与 apiserver 断开连接时,只有运行在边缘自治的节点上的Pod才不会被驱逐。因此,我们首先需要通过打 openyurt.io/is-edge-worker 的标签的方式,将节点分为云端节点和边缘节点。 我们将 us-west-1.192.168.0.87 作为云端节点,将标签的 value 值设置为 false

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

然后边缘节点设置为 true

  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

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

  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

2 OpenYurt安装准备

2.1 Kube-Controller-Manager调整

为了保证Yurt-Controller-Manager可以正常工作,需要关闭Kube-Controller-Manager中的NodeLifeCycle controller(目前正在优化,后续Kube-Controller-Manager将无需调整)。

Kube-Controller-Manager配置调整方法如下:

2.2 部署Yurt-Tunnel专用DNS

云端组件(如Kube-apiserver, prometheus, metrics-server等)通过hostname:port访问边缘时,为了让hostname域名解析到yurt-tunnel-server,从而让请求无感知 经过yurt-tunnel-server/yurt-tunnel-agent到达边缘节点。需要确保组件的DNS域名解析请求发送到Yurt-Tunnel专用的DNS(取名为yurt-tunnel-dns)。

通过如下命令安装yurt-tunnel-dns:

  1. $ kubectl apply -f config/setup/yurt-tunnel-dns.yaml

当安装完成后,可以通过命令kubectl -n kube-system get po等确认一下yurt-tunnel-dns组件是否正常启动。并且通过kubectl -n kube-system get svc yurt-tunnel-dns获取到yurt-tunnel-dns serviceclusterIP.

2.3 Kube-apiserver调整

为了保证Master节点上kube-apiserver使用hostname:port访问kubelet,同时保证使用yurt-tunnel-dns podhostname进行域名解析。需要调整kube-apiserver组件的相关配置。

Kube-apiserver配置调整方法如下:

2.4 Addons调整

kubeadm默认安装kube-proxy和CoreDNS的配置也需要配置,从而适配云边协同场景。调整配置方法如下:

3 部署OpenYurt的Control-Plane组件

3.1 安装Yurt-controller-manager

部署 yurt-controller-manager,防止在与 apiserver 断开期间,自治边缘节点上的Pod被驱逐。

  1. $ kubectl apply -f config/setup/yurt-controller-manager.yaml
  2. deployment.apps/yurt-controller-manager created

备注:

由于 Docker 对匿名请求开启了拉取速率限制,您可能会遇到错误信息提示,比如:”You have reached your pull rate limit. xxxx”。在这种情况下,您需要创建一个 docker-registry 密码来拉取镜像。

  1. $ kubectl create secret docker-registry dockerpass --docker-username=your-docker-username --docker-password='your-docker-password' --docker-email='your-email-address' -n kube-system

然后编辑 config/setup/yurt-controller-manager.yaml

  1. ...
  2. containers:
  3. - name: yurt-controller-manager
  4. image: openyurt/yurt-controller-manager:latest
  5. command:
  6. - yurt-controller-manager
  7. imagePullSecrets:
  8. - name: dockerpass

3.2 安装Yurt-App-Manager

3.2.1 部署Yurt-App-Manager

首先从yurt-app-manager repo获取config/setup/all_in_one.yaml。执行如下命令:

  1. $ kubectl apply -f config/setup/all_in_one.yaml

确认yurt-app-manager组件的pod和service配置已经成功创建:

  1. $ kubectl get pod -n kube-system | grep yurt-app-manager
  2. $ kubectl get svc -n kube-system | grep yurt-app-manager

3.2.2 创建节点池

为了更好的管理节点和节点上的流量(如Service流量拓扑管理),我们推荐把二层网络互通的节点放在同一个节点池。本例中为云边各自创建一个节点池,具体如下:

  1. $ cat <<EOF | kubectl apply -f -
  2. apiVersion: apps.openyurt.io/v1alpha1
  3. kind: NodePool
  4. metadata:
  5. name: master
  6. spec:
  7. type: Cloud
  8. ---
  9. apiVersion: apps.openyurt.io/v1alpha1
  10. kind: NodePool
  11. metadata:
  12. name: worker
  13. spec:
  14. type: Edge
  15. EOF

3.2.3 节点加入节点池

分别讲云端和边缘节点加入3.2.2中创建的节点池,具体如下:

  1. $ kubectl label node us-west-1.192.168.0.87 apps.openyurt.io/desired-nodepool=master
  2. node/us-west-1.192.168.0.87 labeled
  3. $ kubectl label node us-west-1.192.168.0.88 apps.openyurt.io/desired-nodepool=worker
  4. node/us-west-1.192.168.0.88 labeled

3.3 安装Yurt-tunnel

通过如下命令安装yurt-tunnel-server:

  1. $ kubectl apply -f config/setup/yurt-tunnel-server.yaml

然后再安装yurt-tunnel-agent:

  1. kubectl apply -f config/setup/yurt-tunnel-agent.yaml

当yurt-tunnel-server和yurt-tunnel-agent安装完成后,可以通过命令kubectl -n kube-system get po等确认一下yurt-tunnel组件是否正常启动。

3.4 安装Yurthub配置

通过如下命令安装Yurthub配置(如: RBAC, configmap):

  1. $ kubectl apply -f config/setup/yurthub-cfg.yaml

4. 接入边缘节点

已经是Kubernetes集群的工作节点(如: node/us-west-1.192.168.0.88),我们需要在节点安装OpenYurt的节点端组件(如Yurthub)。 当然,也可以从0开始往集群中接入新节点。

4.1 已接入节点的配置调整

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

4.1.1 部署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 将在几分钟内准备就绪。

4.1.2 配置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

4.1.3 重建节点上的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>

4.2 从零接入新节点

用户可以直接使用yurtadm join命令往集群中接入边缘节点。命令的详细信息可以参考链接: yurtadm join