ACK Edge是业界首个非侵入的边缘计算云原生产品服务,为了给您提供云边一体化的使用体验,通过InClusterConfig访问kube-apiserver的业务Pod,无需任何修改,可以直接被部署到边缘环境。本文介绍如何在边缘场景无缝运行使用InClusterConfig的业务Pod。
背景信息
当需要把原生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_HOST和KUBERNETES_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中获取到本地缓存数据,从而解决上述的问题二。
关于如何开启edge-hub的数据缓存能力,请参见开启edge-hub的数据缓存能力。
开启edge-hub的数据缓存能力
因为数据缓存在本地磁盘,所以不推荐为有大量list/watch请求的Pod开启数据缓存。
开启edge-hub的数据缓存能力后,必须重启对应的业务Pod。
获取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
开启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" #添加多个组件请用英文半角逗号(,)分隔。
确认业务Pod的云端返回数据缓存是否生效。
在业务Pod运行的节点上,查看/etc/kubernetes/cache/{User-Agent}目录下是否有对应的数据。