在对权限要求相对较高的云上的场景中,您需要将Pod的IP地址动态地加入或移出指定的RDS白名单,以实现对权限最细粒度的控制。您可以通过ack-kubernetes-webhook-injector组件为Pod添加Annotation(注解),动态地将Pod的IP地址加入或移出指定的RDS白名单。本文介绍如何安装并使用ack-kubernetes-webhook-injector组件为Pod动态配置阿里云产品白名单,以及如何配置访问云产品内网Endpoint。
前提条件
已创建Kubernetes托管版集群,具体操作,请参见创建Kubernetes托管版集群。
已通过kubectl工具连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
集群使用Terway网络模式。更多信息,请参见使用Terway网络插件。
组件介绍
在云计算的使用场景中,某些资源需要配置相应的安全策略才能被外部访问,例如实例需要配置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
登录容器服务管理控制台,在左侧导航栏选择 。
选择并单击ack-kubernetes-webhook-injector,然后单击右上角的一键部署。
在面板中,选择安装组件的目标集群和命名空间,并设置名称,然后单击下一步。
在参数区域,填写
openapi
字段下的ak
、sk
为您的AK信息,然后在页面下方单击确定。关于如何获取AK信息,请参见获取AccessKey。
使用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动态添加安全规则。
使用以下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
执行以下命令,查看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。
登录RDS控制台,查看Annotation中RDS实例中的白名单。有关如何查看RDS的白名单,请参见高安全白名单模式IP白名单。
此时,控制台显示规则已经自动添加。
将步骤1中的Deployment的副本数设置为0,再次查看RDS白名单。
此时,控制台显示已创建的规则被自动删除。
配置访问云产品内网Endpoint
ack-kubernetes-webhook-injector默认使用云产品公网Endpoint。如果您的集群未开启公网访问能力,可以通过修改配置,选择访问云产品内网Endpoint。
部分云产品在特定地域没有内网Endpoint。配置前,请在OpenAPI门户查询目标产品的地域下是否提供内网Endpoint。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在页面顶部命名空间下拉列表中,选择kube-system命名空间,找到kubernetes-webhook-injector对应的Deployment,然后单击目标Deployment右侧操作列下的更多 > 查看Yaml。
在
spec.template.spec.containers.command
下方增加- '--intranet-access'
一行,然后单击更新。
更多安全策略配置规则
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