Skip to main content
版本:Next

YurtStaticSet

背景介绍

静态 pod 是 K8s 中一种特殊的 pod,它由 Kubelet 直接进行管理。静态 pod 也常用于云边协同的场景中,比如一些 AI 相关的业务。 在 OpenYurt 中,核心组件 YurtHub 就是通过静态 pod 进行部署的。静态 pod 一般通过 /etc/kubernetes/manifests 目录下的配置文件进行创建,通过人工手动替换/修改配置文件完成升级,这个过程中 Kubelet 直接负责了静态 pod 的创建、删除任务。由于边缘侧设备数量多、位置分布分散等特点,若通过人工完成云边协同场景下静态 pod 的部署、升级等工作,势必会带来沉重的操作负担与失误风险。 因此,OpenYurt 新增 CRD YurtStaticSet 来增强对于静态 pod 的管理,通过的控制器提供了滚动更新、OTA 升级等能力。

配置

apiVersion: apps.openyurt.io/v1alpha1
kind: YurtStaticSet
metadata:
  # ···
spec:
  # static pod 配置文件名称
  staticPodManifest: xxx
  # 升级策略,支持 AdvancedRollingUpdate 与 OTA 升级方式
  upgradeStrategy:
    type: AdvancedRollingUpdate
    # AdvancedRollingUpdate 升级方式可以设置滚动更新最大不可用数量,默认值为 10%
    # maxUnavailable: 3
  # static pod 模板配置
  template:
  #  ···

用户使用

1)部署 OpenYurt

static-pod 控制器集成于 Yurt-Manager 组件,使用前需要安装部署Yurt-Manager,相关操作可以参照部署OpenYurt组件

2) 创建 static pod

YurtStaticSet Operator 不负责静态 pod 初始的部署,部署静态节点需手动完成或者通过 yurtadm 工具实现。作为示例,本文通过 Kind 创建一个具有三个工作节点的集群,并且每个节点上手动部署静态 pod。

cat >  nginx.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: web
    image: nginx:1.19.1
EOF

3)部署 YurtStaticSet CR

YurtStaticSet 资源通过 namespace/name 与静态 pod 对应。 因此,我们创建一个 namespace:default, name:nginx 的CR实例接管该静态 pod。

cat <<EOF | kubectl apply -f -
apiVersion: apps.openyurt.io/v1alpha1
kind: YurtStaticSet
metadata:
  name: nginx
spec:
  staticPodManifest: nginx
  upgradeStrategy:
    type: AdvancedRollingUpdate
    maxUnavailable: 3
  template:
    metadata:
      name: nginx
    spec:
      containers:
      - name: web
        image: nginx:1.19.1
EOF

4) 静态 pod 升级

通过 YurtStaticSet 资源可以轻松实现对静态 pod 的管理,其中就包括升级静态 pod。 YurtStaticSet 支持两种升级方式,分别为 AdvancedRollingUpdate 模式与 OTA 模式。 简单来说,AdvancedRollingUpdate 模式实现了跃过 not-ready 节点的滚动更新升级能力; OTA 模式则支持用户自主控制升级流程。 两种模式的详细介绍参见 DaemonSet 升级模型

AdvancedRollingUpdate 升级

  • 升级之前查看集群中的静态 pod
$ kubectl get pods | grep nginx

default  nginx-openyurt-e2e-test-worker    1/1     Running   0   3h4m   10.244.2.3   openyurt-e2e-test-worker   
default  nginx-openyurt-e2e-test-worker2   1/1     Running   0   3h4m   10.244.1.2   openyurt-e2e-test-worker2  
default  nginx-openyurt-e2e-test-worker3   1/1     Running   0   3h5m   10.244.3.3   openyurt-e2e-test-worker3  

$ kubectl describe pods nginx-openyurt-e2e-test-worker

···
Containers:
  web:
    ···
    # 此时 nginx pod 的版本是1.19.1
    Image:          nginx:1.19.1
    ···
···
  • 修改 YurtStaticSet spec,将容器镜像从 nginx:1.19.1 升级版本至 nginx:1.19.2
apiVersion: apps.openyurt.io/v1alpha1
kind: YurtStaticSet
metadata:
  name: nginx
spec:
    ···
    spec:
      containers:
      - name: web
        image: nginx:1.19.2

  • 查看资源状态, 可以看到三个静态 pods 均升级完成。 TOTAL 代表 YurtStaticSet nginx 在该集群中匹配多少对应的静态 pods, READY 代表就绪 pods 的数量,UPGRADED 表示多少 pods 已经升级至最新版本。
$ kubectl get yurtstaticsets nginx

NAME    AGE     TOTAL   READY   UPGRADED
nginx   4m20s   3       3       3
  • 查看集群中相应的静态 pods
$ kubectl describe pods nginx-openyurt-e2e-test-worker

···
Containers:
  web:
    ···
    # 此时 nginx pod 的版本已经升级至1.19.2
    Image:          nginx:1.19.2
    ···
···

OTA 升级

  1. OTA 升级接口

    YurtHub 提供了两个 OTA 升级相关的 REST APIs。

    • GET /pods 通过该接口可以获取节点上 pods 信息。
    • POST /openyurt.io/v1/namespaces/{ns}/pods/{podname}/upgrade 通过该接口用户可以指定更新某个静态 Pod。路径参数 nspodname 分别代表 Pod 的命名空间以及名称。
  2. OTA 升级流程

    • OTA 升级中通过 pod status 中 PodNeedUpgrade condition 字段表示升级状态,当值为 true 时表示存在可升级版本,反正不可升级。
    • 通过主动调用上述 upgrade API 接口即可实现静态 pod 升级任务