全部產品
Search
文件中心

Container Service for Kubernetes:通過Ingress或AlbConfig為HTTPS監聽配置認證

更新時間:Jun 19, 2024

當您選擇使用HTTPS協議的監聽時,您需要為監聽配置SSL/TLS認證以確保與用戶端的加密串連。本文介紹ALB Ingress支援的多種配置認證的方法。

前提條件

重要

由於缺乏可靠的CA認證,自我簽署憑證在瀏覽器和用戶端中預設不受信任,通常會導致客戶訪問時收到安全警告。本文中產生的自我簽署憑證僅作為樣本,請勿在面向公眾的生產環境中使用。

認證管理方式對比

ALB Ingress支援三種配置認證的方式:自動探索認證、Secret認證和AlbConfig指定認證。三種配置方式的區別如下。

說明

ALB Ingress不影響長連結。

對比項

自動探索認證

Secret認證

AlbConfig指定認證

關聯資源

Ingress

Ingress

AlbConfig

儲存方式

阿里雲數位憑證中心

叢集內的Secret資源

阿里雲數位憑證中心

適用情境

適用於已在阿里雲數位憑證中心已購買認證或上傳認證,並希望在Ingress層級進行認證管理的情境。

適用於叢集內部管理的認證,例如使用cert-manager類的管理工具時,ALB執行個體認證會隨著認證Secret的更新而更新。

適用於已在阿里雲數位憑證中心已購買認證或上傳認證,並希望在ALB執行個體層級進行認證管理的情境。

優先順序(僅供參考)

跨命名空間使用

支援

不支援,僅支援在Secret資源所處的命名空間使用。

支援

更新認證方式

在數位憑證中心上傳新認證或續約認證後,更新Ingress資源。

更新Ingress關聯的Secret資源。

在數位憑證中心上傳新認證或續約認證後,更新AlbConfig資源。

認證管理方式相容性說明

在ALB Ingress中,如果您同時使用了多種認證配置方式時,認證的管理方式和相容性如下所示。

認證配置

說明

在Ingress資源中同時定義了自動探索認證和Secret認證

  • 如果自動探索認證和Secret認證屬於同一網域名稱,那麼Secret認證具有更高的優先順序。

  • 如果自動探索認證和Secret認證屬於不同的網域名稱,那麼ALB Ingress Controller會為每個網域名稱分別選擇相應的認證。

在Ingress資源中同時定義了自動探索認證和AlbConfig指定認證,並且它們關聯的Listener相同

  • 如果在AlbConfig中指定了認證,則同監聽下不會使用自動探索認證。

  • 如果未在AlbConfig中指定認證,則會嘗試執行自動探索認證流程。

在Ingress資源中同時定義了Secret認證和在AlbConfig指定認證

AlbConfig指定認證和Secret認證是可以完全相容的,並且可以同時使用。

建立前置資源

您需要Deployment、Service、AlbConfig、IngressClass、Ingress這5種資源才能使ALB Ingress工作,您可以使用以下的樣本快速建立這5種資源。

  1. 建立https-quickstart.yaml檔案,並將以下內容拷貝到該檔案中。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: https-deploy
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: https-deploy
      template:
        metadata:
          labels:
            app: https-deploy
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: https-deploy
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: https-svc
      namespace: default
    spec:
      ports:
        - name: port1
          port: 443
          protocol: TCP
          targetPort: 8080
      selector:
        app: https-deploy
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: https-ingressclass
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb-demo # 修改為您的AlbConfig資源的名稱
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
      namespace: default
    spec:
      ingressClassName: https-ingressclass
      rules:
      - host: demo.alb.ingress.top # demo.alb.ingress.top可以替換為您的網域名稱
        http:
          paths:
          - backend:
              service:
                name: https-svc
                port:
                  number: 443
            path: /
            pathType: Prefix
  2. 執行以下命令建立服務。

    kubectl apply -f https-quickstart.yaml

(可選)產生自我簽署憑證

如果您還未擷取認證,您可以執行以下命令,通過OpenSSL建立自我簽署憑證。

openssl genrsa -out albtop-key.pem 4096
openssl req -subj "/CN=demo.alb.ingress.top" -sha256  -new -key albtop-key.pem -out albtop.csr  # demo.alb.ingress.top可以替換為您的網域名稱
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf  # demo.alb.ingress.top可以替換為您的網域名稱
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
說明

命令中的demo.alb.ingress.top是自我簽署憑證所關聯的網域名稱。如果您擁有網域名稱,請您進行替換。如果您未擁有網域名稱,可以不進行替換,不影響本文後續步驟。

使用自動探索認證

說明

同一個ALB支援的擴充認證上限為25個,包含同網域名稱的認證總數不能超過該閾值。

  1. 將自我簽署憑證上傳至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證

  2. 更新Ingress配置。

    1. 執行以下命令更新Ingress配置。

      kubectl edit ingress https-ingress
    2. 在https-quickstart.yaml的Ingress部分中添加tls欄位,填入認證關聯的網域名稱並儲存退出。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: https-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
        - host: demo.alb.ingress.top # demo.alb.ingress.top可以替換為您的網域名稱
          http:
            #...
        tls:
        - hosts:
          - demo.alb.ingress.top # 需要和“host“欄位中的網域名稱保持一致,同時是認證關聯的網域名稱
  3. 執行以下命令,驗證認證是否配置成功。

    curl https://demo.alb.ingress.top/tea

    預期輸出:

    {"hello":"tee"}

    返回以上結果,說明認證配置成功。

使用Secret認證

以下以自我簽署憑證為例,介紹如何配置Secret認證。

說明

同一認證支援建立不同的Secret,ALB也支援關聯多個認證,但同一ALB支援的擴充認證上限為25個。

  1. 執行以下命令,使用OpenSSL建立自我簽署憑證。

    openssl genrsa -out albtop-key.pem 4096
    openssl req -subj "/CN=demo.alb.ingress.top" -sha256  -new -key albtop-key.pem -out albtop.csr
    echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf
    openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
  2. Base64編碼步驟1中的albtop-key.pem和albtop-cert.pem。

    echo -n `cat albtop-key.pem` | base64
    echo -n `cat albtop-cert.pem`  | base64
  3. 建立Secret。

    1. 建立secret.yaml,程式碼範例如下。

      apiVersion: v1
      kind: Secret
      metadata:
        name: secret-tls
      type: kubernetes.io/tls
      data:
        # the data is abbreviated in this example
        tls.crt: |
          {base64 albtop-cert.pem} # Base64編碼後的albtop-cert.pem。
        tls.key: |
          {base64 albtop-key.pem}  # Base64編碼後的albtop-key.pem。
    2. 執行以下命令,建立Secret。

      kubectl apply -f secret.yaml
  4. 建立Ingress、Service和應用。

    1. 建立demo.yaml,程式碼範例如下。

      在Ingress的YAML中添加認證對應的網域名稱。

      tls:
        - hosts:
          - demo.alb.ingress.top
          secretName: secret-tls

      展開查看範例程式碼

      apiVersion: v1
      kind: Service
      metadata:
        name: demo-service-https
        namespace: default
      spec:
        ports:
          - name: port1
            port: 443
            protocol: TCP
            targetPort: 8080
        selector:
          app: demo-cafe
        sessionAffinity: None
        type: ClusterIP
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: demo-cafe
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: demo-cafe
        template:
          metadata:
            labels:
              app: demo-cafe
          spec:
            containers:
              - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
                imagePullPolicy: IfNotPresent
                name: demo-cafe
                ports:
                  - containerPort: 8080
                    protocol: TCP
      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: demo-https
        namespace: default
      spec:
        ingressClassName: alb
        rules:
        - host: demo.alb.ingress.top
          http:
            paths:
            - backend:
                service:
                  name: demo-service-https
                  port:
                    number: 443
              path: /
              pathType: Prefix
        tls:
        - hosts:
          - demo.alb.ingress.top
          secretName: secret-tls
    2. 執行以下命令,建立Ingress、Service和應用。

      kubectl apply -f demo.yaml
  5. 執行以下命令,驗證認證是否配置成功。

    curl https://demo.alb.ingress.top/tea

    預期輸出:

    {"hello":"tee"}

    返回以上結果,說明認證配置成功。

使用AlbConfig指定認證

以下以自我簽署憑證為例,介紹如何使用AlbConfig指定認證。

說明

如果監聽配置了認證ID,那麼相同監聽下的網域名稱不會再使用Secret認證和自動探索認證。

  1. 執行以下命令,通過OpenSSL建立自我簽署憑證。

    openssl genrsa -out albtop-key.pem 4096
    openssl req -subj "/CN=demo.alb.ingress.top" -sha256  -new -key albtop-key.pem -out albtop.csr
    echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf
    openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
  2. 上傳自我簽署憑證至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證

  3. 擷取認證ID。

    1. 登入數位憑證管理服務控制台

    2. 在控制台左側導覽列,單擊SSL 憑證

    3. SSL認證頁面,單擊上傳認證頁簽,在目標認證操作列下選擇表徵圖 > 詳情

      認證詳情面板中擷取認證ID。

  4. 關聯認證至AlbConfig。

    未建立AlbConfig情境

    1. 建立albconfig.yaml,程式碼範例如下。

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb-demo
      spec:
        config:
          #...
        listeners:
        - caEnabled: false
          certificates:
          - CertificateId: 756****-cn-hangzhou # 認證ID
            IsDefault: true
          port: 443
          protocol: HTTPS
        #...

      參數

      說明

      caEnabled

      是否開啟TLS握手過程中有效認證的身分識別驗證。本樣本配置false,表示不需要用戶端的身分識別驗證。

      CertificateId

      認證ID。本樣本配置為756****-cn-hangzhouCertificateId格式樣本及說明如下:

      • 中國地區:756****-cn-hangzhou-cn-hangzhou為固定內容,不受地區影響,配置時您只需替換756****即可。

      • 海外地區:756****-ap-southeast-1-ap-southeast-1為固定內容,不受地區影響,配置時您只需替換756****即可。

      IsDefault

      是否為預設認證。本文配置為true,表示是預設認證。

      protocol

      支援監聽的協議類型。本文配置為HTTPS,表示支援HTTPS協議的監聽。

    2. 執行以下命令,建立AlbConfig。

      kubectl apply -f albconfig.yaml

    已建立AlbConfig情境

    通過kubectl edit命令進行累加式更新。

    1. 執行以下命令,查看AlbConfig名稱。

      kubectl -n kube-system get AlbConfig

      預期輸出:

      NAME AGE
      alb-demo 87m
    2. 執行以下命令,更新對應AlbConfig。

      kubectl -n kube-system edit AlbConfig alb-demo
        #...
        spec:
          config:
            #...
          listeners:
          - caEnabled: false
            certificates:
            - CertificateId: 756****-cn-hangzhou # 認證ID
              IsDefault: true
            port: 443
            protocol: HTTPS
            #...

    更多關於更新AlbConfig的資訊,請參見更新AlbConfig

  5. 建立Ingress、Service和應用。

    1. 建立demo.yaml,程式碼範例如下

      說明

      本例Ingress中的tls欄位只作為掛載到443監聽標識,並不是自動探索認證的配置。

      展開查看範例程式碼

      apiVersion: v1
      kind: Service
      metadata:
        name: demo-service-https
        namespace: default
      spec:
        ports:
          - name: port1
            port: 443
            protocol: TCP
            targetPort: 8080
        selector:
          app: demo-cafe
        sessionAffinity: None
        type: ClusterIP
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: demo-cafe
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: demo-cafe
        template:
          metadata:
            labels:
              app: demo-cafe
          spec:
            containers:
              - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
                imagePullPolicy: IfNotPresent
                name: demo-cafe
                ports:
                  - containerPort: 8080
                    protocol: TCP
      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: demo-https
        namespace: default
      spec:
        ingressClassName: alb
        rules:
        - host: demo.alb.ingress.top
          http:
            paths:
            - backend:
                service:
                  name: demo-service-https
                  port:
                    number: 443
              path: /
              pathType: Prefix
        tls:
        - hosts:
          - demo.alb.ingress.top
    2. 執行以下命令,建立Ingress、Service和應用。

      kubectl apply -f demo.yaml
  6. 執行以下命令,驗證認證是否配置成功。

    curl https://demo.alb.ingress.top/tea

    預期輸出:

    {"hello":"tee"}

(可選)釋放資源

執行以下命令,您可以釋放在本文中建立的資源。

kubectl delete deployment https-deploy
kubectl delete service https-svc
kubectl delete ingressclass https-ingressclass
kubectl delete ingress https-ingress
rm https-quickstart.yaml