文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用 Cert Manager 自动管理 Kubernetes Gateway 证书

2024-11-29 23:05

关注

GWAPI 是一种管理 Kubernetes 集群内部和集群外部流量的方法。它提供了一个更精细、更模块化的方法来描述路由和网关配置,相比于传统的 Ingress API,GWAPI 设计上更为灵活和可扩展。

cert-manager

cert-manager[7] 是一个专门为 Kubernetes 设计的自动化证书管理工具,它简化了在 Kubernetes 集群中使用 X.509 证书的管理过程。通过 cert-manager,用户可以轻松地为 Kubernetes 中的各种资源,如服务、应用程序和内部通信、自动颁发、更新和管理 SSL/TLS 证书。这对于确保数据传输的安全性非常重要。

cert-manager 主要有以下特性:

尤其是最后这点,cert-manager 可以便捷地与 Kubernetes 生态的其他组件无缝集成,比如本文要介绍的与 K8s Gateway 的整合。

Why cert-manager?

在 Kubernetes 环境中,Gateway 作为整个集群的入口,是管理入站流量的重要组件。在众多功能特性中,安全性尤为突出和重要。其中,通信加密是确保数据安全的首要措施。通过使用 TLS/SSL 证书,Gateway 确保所有进出集群的数据都是加密的。这不仅保护了数据免受窃听和篡改,还确保了客户端和服务之间的通信是安全的。除了这种单向 SSL 加密以外,还可以配置为支持双向的 SSL 加密来实现端到端的安全验证。

而使用 cert-manager 来管理 Kubernetes Gateway 的证书提供了许多优势,显著提升操作效率、增强系统安全性,并且能够以可扩展和可维护的方式支持企业级的部署和管理:

演示说明

  1. FSM Gateway[10] 作为 Gateway API 的实现[11] 之一,也是 FSM[12] 整个生态中的众多组件之一,担负着 Kubernetes 入口流量管理的重任。在这次演示中,我们将采用 FSM Gateway 作为网关实施方案,利用其 TLS 卸载[13] 功能来增强上游服务的安全性。
  2. 前面提到 cert-manager 可以支持 多种颁发源[14],这里为了操作简便,选择最简单的自签发的 CA 证书。

图片

前提条件

安装 FSM Gateway

参考 FSM Gateway 的安装文档[15],我们使用 CLI 进行安装,当前 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

执行下面的命令安装。

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

安装成功后,可以看到已经注册了 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。 注意在安装时记得安装 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 证书,在创建颁发源之前先自签 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

这里我们直接创建一个 ClusterIssuer,类型为 ca,指定为我们上面创建的 secret ca-key-pair。

cat <

一切就绪之后,接下来让我们来部署示例应用进行测试。

部署示例应用

创建一个 httpbin 服务。

kubectl create namespace httpbin
cat <

签发 TLS 证书

要签发 TLS 证书,我们需要创建一个 CR Certificate。cert-manager 会监控该资源,然后通过资源的配置签发证书,并保存在字段 secretName 指定的 secret 中。

cat <

Certificate 创建完成后,我们可以在命名空间 httpbin 下找到 cert-manager 创建的 secert,类型为 kubernetes.io/tls。

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

有了证书之后,就可以为 httpbin 服务暴露 HTTPS 的访问入口了。

创建网关和路由

为了向集群外暴露 httpbin 服务,需要为其创建网关和路由:

cat <

测试

如果不提供 CA 证书直接访问,会遇到类似下面的问题。

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 证书然后再次访问,同时添加参数 -v 可以发现请求成功。

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: **
>
< 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 内容中我们还可以找到 TLS 握手的详细信息。比如证书有效期 start date: May 8 14:59:33 2024 GMT 和 expire date: May 8 15:59:33 2024 GMT。

等待 1 分钟后再次请求,你将会看到证书信息已经更新。此时,如果检查 Certificate 资源,可以确认证书确实发生了轮换。

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

总结

使用 cert-manager 自动管理 Kubernetes Gateway 证书可以显著提升安全性和管理效率。通过自动化的证书处理,如自动续期和轮换,cert-manager 减轻了管理负担并降低了人为错误,确保了持续的系统安全。这一工具的集成和灵活性使其成为维护 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 的实现: 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] 多种颁发源: https://cert-manager.io/docs/configuration/issuers/

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

来源:云原生指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯