全部產品
Search
文件中心

Container Service for Kubernetes:為Pod動態配置阿里雲產品白名單

更新時間:Jun 19, 2024

在對許可權要求相對較高的雲上的情境中,您需要將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地址。

  • 叢集刪除後白名單規則需手動清理。

為瞭解決上述問題,Container Service 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. 登入Container Service管理主控台,在左側導覽列選擇市場 > 應用市場

  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白名單

  4. 步驟1中的Deployment的副本數設定為0,再次查看RDS白名單。

    此時,控制台顯示已建立的規則被自動刪除。

配置訪問雲產品內網Endpoint

ack-kubernetes-webhook-injector預設使用雲產品公網Endpoint。如果您的叢集未開啟公網訪問能力,可以通過修改配置,選擇訪問雲產品內網Endpoint。

說明

部分雲產品在特定地區沒有內網Endpoint。配置前,請在OpenAPI門戶查詢目標產品的地區下是否提供內網Endpoint。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  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