在边缘场景无缝运行使用InClusterConfig的业务Pod

ACK Edge是业界首个非侵入的边缘计算云原生产品服务,为了给您提供云边一体化的使用体验,通过InClusterConfig访问kube-apiserver的业务Pod,无需任何修改,可以直接被部署到边缘环境。本文介绍如何在边缘场景无缝运行使用InClusterConfig的业务Pod。

背景信息

image

当需要把原生Kubernetes中,通过InClusterConfig(即Kubernetes Service)访问kube-apiserver的业务Pod部署到边缘环境中,会出现以下问题:

  • 问题一:Pod通过InClusterConfig地址访问kube-apiserver,节点上默认网络规则(iptables/ipvs)将会把请求转发到kube-apiserver的Pod IP,同时云端与边缘位于不同网络平面,边缘是无法访问到云端的Pod IP。所以边缘业务Pod无法通过InClusterConfig访问到kube-apiserver。

  • 问题二:在解决问题一后,如果云边网络断开时业务Pod容器出现重启等状况,边缘Pod将无法从kube-apiserver获取到业务配置,这会影响到业务Pod的重启运行。

关于如何从Pod访问API的更多信息,请参见从Pod中访问API

解决方案

通过边缘节点上的edge-hub非侵入的ACK Edge服务可以解决上述问题,让使用InClusterConfig的业务Pod可以无需修改,直接运行在边缘场景。具体说明如下:

  • 在业务Pod无感知状态下,边缘Pod的访问地址(即KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT环境变量)会被默认修改为edge-hub的HTTPS Endpoint(即KUBERNETES_SERVICE_HOST=169.254.2.1, KUBERNETES_SERVICE_PORT=10268),因此业务Pod的InClusterConfig会通过edge-hub来访问kube-apiserver,从而解决上述的问题一。

  • 您需要手动开启edge-hub的数据缓存能力,这样即使云边断网,业务Pod重启时可以从edge-hub中获取到本地缓存数据,从而解决上述的问题二。

    image

    关于如何开启edge-hub的数据缓存能力,请参见开启edge-hub的数据缓存能力

开启edge-hub的数据缓存能力

说明
  • 因为数据缓存在本地磁盘,所以不推荐为有大量list/watch请求的Pod开启数据缓存。

  • 开启edge-hub的数据缓存能力后,必须重启对应的业务Pod。

  1. 获取User-Agent信息。

    User-Agent一般为业务容器的启动命令。

    apiVersion: v1
    kind: Pod
    metadata:
      name: edge-app-pod
    spec:
      containers:
        - name: "edge-app"
          image: "xxx/edge-app-amd64:1.18.8"
          command:
            - /bin/sh
            - -ec
            - |
              # User-Agent即为启动命令: edge-app。
              /usr/local/bin/edge-app --v=2

    也可通过edge-hub的日志确认User-Agent信息,找到类似{User-Agent} watch {resource}的日志,如下所示:

    I0820 07:50:18.899015       1 util.go:221] edge-app get services: /api/v1/services/xxx with status code 200, spent 21.035061152ms
  2. 开启edge-hub缓存能力。

    在edge-hub-cfg ConfigMap的cache_agents字段中增加业务Pod请求的User-Agent Header来开启数据缓存能力。

    根据以下YAML示例,开启edge-hub缓存能力:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: edge-hub-cfg
      namespace: kube-system
    data:
      # 缓存边缘edge-app pod(User-Agent header为edge-app)访问kube-apiserver的数据。
      # 开启缓存后,记得重启对应的业务Pod。
      cache_agents: "edge-app"   #添加多个组件请用英文半角逗号(,)分隔。
  3. 确认业务Pod的云端返回数据缓存是否生效。

    在业务Pod运行的节点上,查看/etc/kubernetes/cache/{User-Agent}目录下是否有对应的数据。