边缘pods使用in-cluster config访问Kube-APIServer

概要

在边缘场景中,边缘端和云端通常处于不同的网络环境,因此边缘 Pod 无法直接通过 in-cluster config访问 Kube-APIServer。当您部署的边缘pods需要使用in-cluster config, pod日志会出现类似如下报错:

  1. unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined

从KubeEdge v1.17.0起, KubeEdge开始支持边缘pods使用in-cluster config机制访问Kube-APIServer. 如果您需要使用该特性,请参考下面的步骤。

您也可以参考in-cluster config特性proposal 来了解关于该特性的设计与实现.

操作步骤

云端

当您使用keadm init来安装CloudCore时,请打开dynamiccontroller模块以及requireAuthorization特性开关:

  1. keadm init --advertise-address="THE-EXPOSED-IP" --kubeedge-version=v1.17.0 --set cloudCore.modules.dynamicController.enable=true cloudCore.featureGates.requireAuthorization=true

如果您已经安装过CloudCore,并且在安装时没有配置dynamiccontroller模块以及requireAuthorization特性开关,请按照以下步骤修改配置:

  1. 修改CloudCore配置

    执行kubectl edit cm cloudcore -nkubeedge并配置featureGates.requireAuthorization=true以下dynamiccontroller.enable=true

  1. apiVersion: v1
  2. data:
  3. cloudcore.yaml: |
  4. apiVersion: cloudcore.config.kubeedge.io/v1alpha2
  5. ...
  6. featureGates:
  7. requireAuthorization: true
  8. modules:
  9. ...
  10. dynamicController:
  11. enable: true
  12. ...
  1. 创建该特性相关的clusterrole

    特性相关的clusterrole请参考rbac_cloudcore_requireAuthorization。 在集群中添加参考文档中的clusterrole。

  2. 重启CloudCore的pod

边缘端

  1. 请先安装好EdgeCore

  2. 修改EdgeCore配置

    执行vi /etc/kubeedge/config/edgecore.yaml,配置 featureGates.requireAuthorization=true 以及 metaServer.enable=true

  1. apiVersion: edgecore.config.kubeedge.io/v1alpha2
  2. ...
  3. kind: EdgeCore
  4. featureGates:
  5. requireAuthorization: true
  6. modules:
  7. ...
  8. metaServer:
  9. enable: false
  10. ...

保存以上修改并执行sudo systemctl restart edgecore.service来重启EdgeCore.

部署您的边缘应用

当CloudCore和EdgeCore配置完成后,您就可以部署边缘应用,并通过in-cluster config机制访问Kube-APIServer了。

边缘pods使用in-cluster config访问Kube-APIServer - 图1备注

如果您的pods无法直接访问Kube-APIServer,并且错误信息类似如下权限错误:

  1. User "system:xxx:kubeedge:cloudcore" cannot create resource "xxx" in API group "xxx.k8s.io" at the cluster scope

说明该pod需要额外的clusterrole权限,您可以手动在集群中添加对应的clusterrole