为Pod动态配置阿里云产品白名单

在对权限要求相对较高的云上的场景中,您需要将Pod的IP地址动态地加入或移出指定的RDS白名单,以实现对权限最细粒度的控制。您可以通过ack-kubernetes-webhook-injector组件为Pod添加Annotation(注解),动态地将Pod的IP地址加入或移出指定的RDS白名单。本文介绍如何安装并使用ack-kubernetes-webhook-injector组件为Pod动态配置阿里云产品白名单,以及如何配置访问云产品内网Endpoint。

前提条件

组件介绍

在云计算的使用场景中,某些资源需要配置相应的安全策略才能被外部访问,例如实例需要配置SLB访问控制策略,或者RDS数据库需要配置访问客户端的源IP地址白名单。虽然在创建ACK集群时可以将集群节点的IP网段加入到指定RDS的白名单中,但此方案有如下缺点:

  • 白名单规则粒度太粗,加入白名单的IP网段覆盖了集群所有节点和Pod的IP地址。

  • 集群删除后白名单规则需手动清理。

为了解决上述问题,容器服务 Kubernetes 版开发了ack-kubernetes-webhook-injector,支持将指定Pod的IP地址动态加入RDS白名单中,并且在Pod被删除时,将其IP地址从白名单中移除,实现对安全策略的细粒度控制。

目前,ack-kubernetes-webhook-injector支持以下功能:

  • 随着Pod的创建与删除,自动将Pod的IP加入或移出指定的SLB访问控制策略组。

  • 随着Pod的创建与删除,自动将Pod的IP加入或移出指定的阿里云Redis白名单。

  • 随着Pod的创建与删除,自动将Pod的IP加入或移出指定的RDS白名单。

安装ack-kubernetes-webhook-injector

  1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

  2. 选择并单击ack-kubernetes-webhook-injector,然后单击右上角的一键部署

  3. 在面板中,选择安装组件的目标集群和命名空间,并设置名称,然后单击下一步

  4. 参数区域,填写openapi字段下的aksk为您的AK信息,然后在页面下方单击确定

    关于如何获取AK信息,请参见获取AccessKeyAK

使用ack-kubernetes-webhook-injector动态添加RDS白名单示例

在Pod副本控制器的Pod Spec中,您可以使用Annotation指定Pod需加入的RDS实例ID和RDS白名单分组名称。Pod创建时,ack-kubernetes-webhook-injector会将Pod的IP地址加入到白名单中,并且在Pod删除时移除规则。

Pod的Annotation需包括的RDS白名单如下:

  • RDS实例ID:ack.aliyun.com/rds_id

  • RDS白名单分组名称:ack.aliyun.com/white_list_name

本文以自动添加RDS白名单规则为例,展示如何使用ack-kubernetes-webhook-injector为Pod动态添加安全规则。

  1. 使用以下YAML示例创建一个Deployment,在其中的Pod定义中加入RDS实例ID和RDS白名单分组名称的Annotation。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: inject-test
      name: inject-test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: inject-test
      template:
        metadata:
          annotations:
            ack.aliyun.com/rds_id: <rm-wz9nanjcud75b****>
            ack.aliyun.com/white_list_name: <rds_group>
          labels:
            app: inject-test
        spec:
          containers:
          - command:
            - sleep
            - "3600"
            image: alpine:latest
            name: inject-test
  2. 执行以下命令,查看Pod的IP地址。

    kubectl --kubeconfig .kube/config_sts_test -n inject-test get pod -o wide

    预期输出:

    NAME                           READY           STATUS        RESTARTS    AGE    IP                NODE
    inject-test-68cc8f9bbf-gj86n    1/1            Running         0        22s   172.25.0.28    cn-hangzhou.xxx

    预期输出中,Pod的IP地址为172.25.0.28。

  3. 登录RDS控制台,查看Annotation中RDS实例中的白名单。有关如何查看RDS的白名单,请参见高安全白名单模式IP白名单

    此时,控制台显示规则已经自动添加。IP

  4. 步骤1中的Deployment的副本数设置为0,再次查看RDS白名单。

    此时,控制台显示已创建的规则被自动删除。

配置访问云产品内网Endpoint

ack-kubernetes-webhook-injector默认使用云产品公网Endpoint。如果您的集群未开启公网访问能力,可以通过修改配置,选择访问云产品内网Endpoint。

说明

部分云产品在特定地域没有内网Endpoint。配置前,请在OpenAPI门户查询目标产品的地域下是否提供内网Endpoint。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 在页面顶部命名空间下拉列表中,选择kube-system命名空间,找到kubernetes-webhook-injector对应的Deployment,然后单击目标Deployment右侧操作列下的更多 > 查看Yamlimage.png

  4. spec.template.spec.containers.command下方增加- '--intranet-access'一行,然后单击更新image.png

更多安全策略配置规则

ack-kubernetes-webhook-injector也支持以下安全策略配置:

  • SLB访问控制:ack.aliyun.com/access_control_policy_id

  • 阿里云Redis白名单配置:

    • Redis ID:ack.aliyun.com/redis_id

    • Redis白名单分组:ack.aliyun.com/redis_white_list_name

卸载ack-kubernetes-webhook-injector

如果您不再使用ack-kubernetes-webhook-injector,可以在ACK发布功能中将其删除。具体操作,请参见基于Helm的发布管理。同时,请执行以下命令清理配置信息。

kubectl -n kube-system delete secret kubernetes-webhook-injector-certs
kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io kubernetes-webhook-injector