自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 Cert Manager 自動(dòng)管理 Kubernetes Gateway 證書

云計(jì)算 云原生
使用 cert-manager 自動(dòng)管理 Kubernetes Gateway 證書可以顯著提升安全性和管理效率。通過自動(dòng)化的證書處理,如自動(dòng)續(xù)期和輪換,cert-manager 減輕了管理負(fù)擔(dān)并降低了人為錯(cuò)誤,確保了持續(xù)的系統(tǒng)安全。

背景

Kubernetes Gateway

或許,確切地應(yīng)該稱為 Kubernetes Gateway API[1] (下稱 GWAPI)。GWAPI 是由 SIG-NETWORK[2] 社區(qū)管理的開源項(xiàng)目,是一種規(guī)范,不提供實(shí)現(xiàn)。Gateway API 被認(rèn)為是 Kubernetes Ingress API[3] 的繼任者,在 2019 年的 Ingress 革命[4] 中首次被提出,并在 2020 年 11 月發(fā)布了第一個(gè)版本。GWAPI 的發(fā)展非??欤刂贡疚陌l(fā)出已經(jīng)演進(jìn)到了 1.0.0 版本[5],并且 1.1.0 也即將發(fā)布(已經(jīng)發(fā)布了 1.1.0-rc2[6])。

GWAPI 是一種管理 Kubernetes 集群內(nèi)部和集群外部流量的方法。它提供了一個(gè)更精細(xì)、更模塊化的方法來描述路由和網(wǎng)關(guān)配置,相比于傳統(tǒng)的 Ingress API,GWAPI 設(shè)計(jì)上更為靈活和可擴(kuò)展。

cert-manager

cert-manager[7] 是一個(gè)專門為 Kubernetes 設(shè)計(jì)的自動(dòng)化證書管理工具,它簡(jiǎn)化了在 Kubernetes 集群中使用 X.509 證書的管理過程。通過 cert-manager,用戶可以輕松地為 Kubernetes 中的各種資源,如服務(wù)、應(yīng)用程序和內(nèi)部通信、自動(dòng)頒發(fā)、更新和管理 SSL/TLS 證書。這對(duì)于確保數(shù)據(jù)傳輸?shù)陌踩苑浅V匾?/p>

cert-manager 主要有以下特性:

  • 自動(dòng)證書頒發(fā)和續(xù)期:cert-manager 可以自動(dòng)處理證書的申請(qǐng)、續(xù)期和生命周期管理。
  • 支持多種頒發(fā)源:cert-manager 支持多種證書頒發(fā)機(jī)構(gòu)(CA),包括自簽的證書;通過 ACME 使用公共的 CA 如 Let's Encrypt;企業(yè)自建的 CA 系統(tǒng),如 HashiCorp Vault[8]、銅鎖的 RustyVault[9] 的 PKI 等。
  • Kubernetes 原生集成:作為 Kubernetes 的原生組件,cert-manager 可以使用 CRD 來定義頒發(fā)者 Issuer、證書 Certificate 等資源。

尤其是最后這點(diǎn),cert-manager 可以便捷地與 Kubernetes 生態(tài)的其他組件無縫集成,比如本文要介紹的與 K8s Gateway 的整合。

Why cert-manager?

在 Kubernetes 環(huán)境中,Gateway 作為整個(gè)集群的入口,是管理入站流量的重要組件。在眾多功能特性中,安全性尤為突出和重要。其中,通信加密是確保數(shù)據(jù)安全的首要措施。通過使用 TLS/SSL 證書,Gateway 確保所有進(jìn)出集群的數(shù)據(jù)都是加密的。這不僅保護(hù)了數(shù)據(jù)免受竊聽和篡改,還確保了客戶端和服務(wù)之間的通信是安全的。除了這種單向 SSL 加密以外,還可以配置為支持雙向的 SSL 加密來實(shí)現(xiàn)端到端的安全驗(yàn)證。

而使用 cert-manager 來管理 Kubernetes Gateway 的證書提供了許多優(yōu)勢(shì),顯著提升操作效率、增強(qiáng)系統(tǒng)安全性,并且能夠以可擴(kuò)展和可維護(hù)的方式支持企業(yè)級(jí)的部署和管理:

  • 自動(dòng)證書管理:開發(fā)者和管理員可以減少手動(dòng)介入,從而降低因手動(dòng)處理證書相關(guān)任務(wù)(如忘記續(xù)期)而導(dǎo)致的錯(cuò)誤和服務(wù)中斷風(fēng)險(xiǎn)。這些都可以通過 cert-manager 的自動(dòng)化來完成。
  • 集成外部 CA:cert-manager 支持多種證書頒發(fā)機(jī)構(gòu)(CA),包括 Let's Encrypt、HashiCorp Vault、Venafi 等。這使得在 Kubernetes 環(huán)境中使用商業(yè)或自建的 CA 變得容易,并能確保證書的合規(guī)性和認(rèn)證。
  • 安全和合規(guī)性:自動(dòng)化證書輪換和短期證書的使用,增強(qiáng)安全性和合規(guī)性(自動(dòng)更新證書意味著攻擊者竊取的證書只在很短的有效期內(nèi)有用)。
  • 與 Kubernetes 原生集成:與操作 GWAPI 的 CRD 一樣,cert-manager CRD 的操作方式對(duì)開發(fā)者友好,也能夠與 GWAPI 無縫集成。

演示說明

  1. FSM Gateway[10] 作為 Gateway API 的實(shí)現(xiàn)[11] 之一,也是 FSM[12] 整個(gè)生態(tài)中的眾多組件之一,擔(dān)負(fù)著 Kubernetes 入口流量管理的重任。在這次演示中,我們將采用 FSM Gateway 作為網(wǎng)關(guān)實(shí)施方案,利用其 TLS 卸載[13] 功能來增強(qiáng)上游服務(wù)的安全性。
  2. 前面提到 cert-manager 可以支持 多種頒發(fā)源[14],這里為了操作簡(jiǎn)便,選擇最簡(jiǎn)單的自簽發(fā)的 CA 證書。

圖片圖片

前提條件

  • K8s 集群 >=1.22
  • kubectl
  • helm

安裝 FSM Gateway

參考 FSM Gateway 的安裝文檔[15],我們使用 CLI 進(jìn)行安裝,當(dāng)前 FSM 的最新版本為 1.2.4。

system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.2.4
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version

執(zhí)行下面的命令安裝。

fsm install \
    --set=fsm.fsmGateway.enabled=true

安裝成功后,可以看到已經(jīng)注冊(cè)了 GatewayClass fsm-gateway-cls。

kubectl get gatewayclass
NAME              CONTROLLER                      ACCEPTED   AGE
fsm-gateway-cls   flomesh.io/gateway-controller   True       106s

安裝 cert-manager

cert-manager 的安裝可以通過 kubectl manifest 或者 helm chart 來安裝,我們這里選擇 helm chart。 注意在安裝時(shí)記得安裝 CRD。

helm repo add jetstack https://charts.jetstack.io --force-update
helm repo update

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.14.5 \
  --set installCRDs=true

由于使用自簽名的 CA 證書,在創(chuàng)建頒發(fā)源之前先自簽 CA 證書。

openssl genrsa 2048 > ca-key.pem

openssl req -new -x509 -nodes -days 365000 \
   -key ca-key.pem \
   -out ca-cert.pem \
   -subj '/CN=flomesh.io'

將 CA 證書保存在 Secret ca-key-pair 中,要指定命名空間 cert-manager。

kubectl create secret generic -n cert-manager ca-key-pair \
  --from-file=tls.crt=./ca-cert.pem \
  --from-file=tls.key=./ca-key.pem

這里我們直接創(chuàng)建一個(gè) ClusterIssuer,類型為 ca,指定為我們上面創(chuàng)建的 secret ca-key-pair。

cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: ca-issuer-sample
spec:
  ca:
    secretName: ca-key-pair
EOF

一切就緒之后,接下來讓我們來部署示例應(yīng)用進(jìn)行測(cè)試。

部署示例應(yīng)用

創(chuàng)建一個(gè) httpbin 服務(wù)。

kubectl create namespace httpbin
cat <<EOF | kubectl apply -n httpbin -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
  template:
    metadata:
      labels:
        app: httpbin
    spec:
      containers:
      - name: httpbin
        image: kennethreitz/httpbin
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
spec:
  selector:
    app: httpbin
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
EOF

簽發(fā) TLS 證書

要簽發(fā) TLS 證書,我們需要?jiǎng)?chuàng)建一個(gè) CR Certificate。cert-manager 會(huì)監(jiān)控該資源,然后通過資源的配置簽發(fā)證書,并保存在字段 secretName 指定的 secret 中。

  • 證書保存在 secret simple-gateway-cert 中。
  • 證書有效期 duration 設(shè)置為 60m
  • 證書輪換的提前時(shí)間 renewBefore 設(shè)置為 59m,也就是每分鐘輪換一次。
  • 通用名稱 commonName 設(shè)置為 foo.example.com
  • 還有最重要的指定證書的頒發(fā)源為 ClusterIssuer ca-issuer-sample
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: simple-gateway-cert
  namespace: httpbin
spec:
  secretName: simple-gateway-cert
  duration: 60m
  renewBefore: 59m
  subject:
    organizations:
      - flomesh-io
  commonName: foo.example.com
  issuerRef:
    name: ca-issuer-sample
    kind: ClusterIssuer
    group: cert-manager.io
EOF

Certificate 創(chuàng)建完成后,我們可以在命名空間 httpbin 下找到 cert-manager 創(chuàng)建的 secert,類型為 kubernetes.io/tls。

kubectl get secret simple-gateway-cert
NAME                  TYPE                DATA   AGE
simple-gateway-cert   kubernetes.io/tls   3      20s

有了證書之后,就可以為 httpbin 服務(wù)暴露 HTTPS 的訪問入口了。

創(chuàng)建網(wǎng)關(guān)和路由

為了向集群外暴露 httpbin 服務(wù),需要為其創(chuàng)建網(wǎng)關(guān)和路由:

  • 監(jiān)聽器監(jiān)聽在端口 8000
  • 協(xié)議設(shè)置為 TLS
  • 證書通過 secret simple-gateway-cert 提供
  • 還有最重要的模式設(shè)置為 Terminate
cat <<EOF | kubectl apply -n httpbin -f -
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: simple-fsm-gateway
spec:
  gatewayClassName: fsm-gateway-cls
  listeners:
  - name: https
    port: 8000
    protocol: HTTPS
    tls:
      certificateRefs:
      - kind: Secret
        name: simple-gateway-cert
      mode: Terminate
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route-foo
spec:
  parentRefs:
  - name: simple-fsm-gateway
    port: 8000
  hostnames:
    - foo.example.com
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: httpbin
      port: 8080
EOF

測(cè)試

如果不提供 CA 證書直接訪問,會(huì)遇到類似下面的問題。

curl https://foo.example.com/headers  --connect-to foo.example.com:443:$GATEWAY_IP:8000
curl: (60) SSL certificate problem: unable to get local issuer certificate

指定 CA 證書然后再次訪問,同時(shí)添加參數(shù) -v 可以發(fā)現(xiàn)請(qǐng)求成功。

curl --cacert ca-cert.pem https://foo.example.com/headers  --connect-to foo.example.com:443:$GATEWAY_IP:8000 -v
* Connecting to hostname: 198.19.249.153
* Connecting to port: 8000
*   Trying 198.19.249.153:8000...
* Connected to 198.19.249.153 (198.19.249.153) port 8000
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
*  CAfile: ca-cert.pem
*  CApath: none
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / AEAD-CHACHA20-POLY1305-SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: O=flomesh-io; CN=foo.example.com
*  start date: May  8 14:59:33 2024 GMT
*  expire date: May  8 15:59:33 2024 GMT
*  common name: foo.example.com (matched)
*  issuer: CN=flomesh.io
*  SSL certificate verify ok.
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://foo.example.com/headers
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: foo.example.com]
* [HTTP/2] [1] [:path: /headers]
* [HTTP/2] [1] [user-agent: curl/8.4.0]
* [HTTP/2] [1] [accept: */*]
> GET /headers HTTP/2
> Host: foo.example.com
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/2 200
< server: gunicorn/19.9.0
< date: Wed, 08 May 2024 15:00:07 GMT
< content-type: application/json
< content-length: 141
< access-control-allow-origin: *
< access-control-allow-credentials: true
<
{
  "headers": {
    "Accept": "*/*",
    "Connection": "keep-alive",
    "Host": "foo.example.com",
    "User-Agent": "curl/8.4.0"
  }
}
* Connection #0 to host 198.19.249.153 left intact

從輸出的 debug 內(nèi)容中我們還可以找到 TLS 握手的詳細(xì)信息。比如證書有效期 start date: May 8 14:59:33 2024 GMT 和 expire date: May 8 15:59:33 2024 GMT。

等待 1 分鐘后再次請(qǐng)求,你將會(huì)看到證書信息已經(jīng)更新。此時(shí),如果檢查 Certificate 資源,可以確認(rèn)證書確實(shí)發(fā)生了輪換。

kubectl describe certificate simple-gateway-cert
.
Events:
  Type    Reason     Age               From                                       Message
  ----    ------     ----              ----                                       -------
  Normal  Issuing    61s               cert-manager-certificates-trigger          Renewing certificate as renewal was scheduled at 2024-05-08 15:03:33 +0000 UTC
  Normal  Requested  61s               cert-manager-certificates-request-manager  Created new CertificateRequest resource "simple-gateway-cert-1"
  Normal  Issuing    1s                cert-manager-certificates-trigger          Renewing certificate as renewal was scheduled at 2024-05-08 15:04:33 +0000 UTC
  Normal  Reused     1s (x2 over 61s)  cert-manager-certificates-key-manager      Reusing private key stored in existing Secret resource "simple-gateway-cert"
  Normal  Requested  1s                cert-manager-certificates-request-manager  Created new CertificateRequest resource "simple-gateway-cert-2"
  Normal  Issuing    1s (x2 over 61s)  cert-manager-certificates-issuing          The certificate has been successfully issued

總結(jié)

使用 cert-manager 自動(dòng)管理 Kubernetes Gateway 證書可以顯著提升安全性和管理效率。通過自動(dòng)化的證書處理,如自動(dòng)續(xù)期和輪換,cert-manager 減輕了管理負(fù)擔(dān)并降低了人為錯(cuò)誤,確保了持續(xù)的系統(tǒng)安全。這一工具的集成和靈活性使其成為維護(hù) Kubernetes 集群安全的理想選擇。

參考資料

[1] Kubernetes Gateway API: https://gateway-api.sigs.k8s.io/

[2] SIG-NETWORK: https://github.com/kubernetes/community/tree/master/sig-network

[3] Kubernetes Ingress API: https://kubernetes.io/docs/concepts/services-networking/ingress/

[4] Ingress 革命: https://static.sched.com/hosted_files/kccncna19/a5/Kubecon%2520San%2520Diego%25202019%2520-%2520Evolving%2520the%2520Kubernetes%2520Ingress%2520APIs%2520to%2520GA%2520and%2520Beyond%2520%255BPUBLIC%255D.pdf

[5] 1.0.0 版本: https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.0.0

[6] 1.1.0-rc2: https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.1.0-rc2

[7] cert-manager: https://cert-manager.io

[8] Vault: https://www.vaultproject.io

[9] RustyVault: https://github.com/Tongsuo-Project/RustyVault

[10] FSM Gateway: https://fsm-docs.flomesh.io/guides/traffic_management/ingress/fsm_gateway/

[11] Gateway API 的實(shí)現(xiàn): https://gateway-api.sigs.k8s.io/implementations/

[12] FSM: https://fsm-docs.flomesh.io/overview/

[13] TLS 卸載: https://fsm-docs.flomesh.io/guides/traffic_management/ingress/fsm_gateway/tls_termination/

[14] 多種頒發(fā)源: https://cert-manager.io/docs/configuration/issuers/

[15] FSM Gateway 的安裝文檔: https://fsm-docs.flomesh.io/guides/traffic_management/ingress/fsm_gateway/installation/

責(zé)任編輯:武曉燕 來源: 云原生指北
相關(guān)推薦

2023-01-06 08:16:21

Kubernetesapiserver

2022-09-07 08:34:19

kuberneteshttps

2023-03-01 19:03:35

K8s服務(wù)域名證書

2022-01-06 07:46:01

Traefik 開源Gateway API

2022-01-17 11:05:11

CFSSLKubernetesLinux

2022-10-12 08:03:21

k8sistioCA

2025-04-17 09:09:29

2023-12-25 07:46:35

GatewayAPI開源

2023-11-07 07:08:57

2020-07-08 08:03:37

KubernetesLens集群

2024-01-30 07:58:41

KubernetesGAMMA網(wǎng)關(guān)

2012-12-25 10:47:50

IBMdW

2022-03-30 07:45:41

KyvernoAPI開源項(xiàng)目

2015-12-30 14:50:45

Kubernetes容器技術(shù)Docker

2022-08-04 08:00:54

安全管理服務(wù)器

2009-01-03 14:46:06

ibmdwRational

2020-07-14 07:00:47

Virt-ManageKVM虛擬機(jī)

2021-09-08 16:03:12

Kubernetes 安全開源

2022-04-07 09:30:00

自動(dòng)化LinodeKubernetes

2010-12-08 11:30:48

VMMOperations
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)