k8s保姆级教程:K8s高可用集群教程-04-自动化 HTTPS

2026-04-11 14:291阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

本章介绍如何使用 Cert-Manager 签发泛域名证书,给ingress controller使用
前情提要:

k8s保姆级教程:K8s高可用集群教程-01-使用 Kubespray 快速搭建集群(有手就行) 开发调优
第一部分:引言与架构规划 1.1 项目背景与目标 Kubernetes (K8s) 是什么就不多赘述了,最近在迁移部分服务到一个新的k8s集群中,借此机会写个部署教程 本教程将采用 Kubespray —— 一个基于 Ansible 的开源项目,来自动化部署一套生产级别的 K8s 集群。 本次部署的核心目标: 高可用性:构建 3 Master 节点的控制平面,确保单一节点故障不影响集群管理…
k8s保姆级教程:K8s高可用集群教程-02-Load Balancer和Ingress Controller 开发调优
关注的小伙伴久等了,因为工作的变动,关于k8s的教程一直没有更新,最近稍微有点时间,这就继续更新了,新刷到的小伙伴可以先看上一篇:k8s保姆级教程:K8s高可用集群教程-01-使用 Kubespray 快速搭建集群(有手就行) 废话不多说,下面开始正文 第四部分:流量入口与可视化 (Load Balancer, Traefik & Dashboard) 在我们拥有了一个健康的高可用集群后,首要…
k8s保姆级教程:K8s高可用集群教程-03-持久化存储 (Persistent Storage) 开发调优
本篇主要讲述在k8s集群中如何使用持久化存储,熟悉docker的佬友肯定对这个词不陌生,容器中的数据想要不丢失,那就需要把文件、目录挂载出来,在k8s集群中也一样,不过相对于docker,k8s可选的挂载方式和类型有很多种可供选择,我这里分享两种比较常用常见的方式,如果有跟着做的佬友,请务必看完整篇文章后再跟着操作。 感兴趣的佬友可以先看一下前两篇文章 下面开始正文 第五部分:打通数据任…

第六部分:自动化 HTTPS (Cert-Manager 泛域名证书)

在拥有了计算、网络和存储资源后,集群已经具备了完整的生产能力。本章会讲述如何利用 Cert-Manager 为集群自动签发一张受浏览器信任的 Let’s Encrypt 内网泛域名证书。

以下域名均使用示例域名,请操作时自行更换为自己的域名

6.1 核心原理解析:内网 IP 如何申请公网证书?

由于我们的负载均衡器 IP (172.16.5.194) 处于内网,外网无法访问。因此,我们将采用 DNS-01 验证方式

  1. DNS服务商 (如Cloudflare,aliyun,dnspod)控制台将自己要使用的泛域名解析到LB节点上,如:*.k8s.example.com 解析到 172.16.5.194
  2. Cert-Manager 向 Let’s Encrypt 发起 *.k8s.example.com 的证书申请。
  3. Let’s Encrypt 要求证明你拥有该域名,并给出一串验证码。
  4. Cert-Manager 调用你DNS服务商的 API,自动在 DNS 解析中添加一条 _acme-challenge 的 TXT 记录。
  5. Let’s Encrypt 验证 TXT 记录成功,下发泛域名证书。
  6. Cert-Manager 将证书保存为 Kubernetes Secret 供 Traefik 使用。

6.2 检查 Cert-Manager 状态

在第二部分的 Kubespray 配置中,我们已经启用了 cert_manager_enabled: true。首先验证它是否正常运行:

kubectl get pods -n cert-manager # 预期会看到 cert-manager, cert-manager-cainjector, cert-manager-webhook 三个处于 Running 状态的 Pod

image-202603251449498621372×200 43.7 KB

6.3 配置 DNS 供应商 API 凭证 (Secret)

为了让 Cert-Manager 能自动修改 DNS 记录,我们需要将域名提供商的 API Key 存入集群。

这里我提供aliyun-dns和cloudflare两个方案,选择其中一个即可

阿里云:

Cert-Manager默认不支持阿里云的DNS,需要对应的webhook,在签发前需要先部署一个webhook插件,如果使用cf签发可忽略此步骤

helm upgrade --install alidns-webhook alidns-webhook --repo https://wjiec.github.io/alidns-webhook --namespace cert-manager --set groupName=acme.example.com # groupName=acme.example.com 这个后面要用到

# 1. 创建存放 API Secret 的 YAML (命名为 alidns-secret.yaml) apiVersion: v1 kind: Secret metadata: name: alidns-secret namespace: cert-manager type: Opaque stringData: # 强烈建议在阿里云 RAM 访问控制中,创建一个仅拥有 DNS 修改权限的子账号 AK/SK access-key: "你的阿里云AccessKey" secret-key: "你的阿里云SecretKey"

执行应用:kubectl apply -f alidns-secret.yaml

Cloudflare:

# 1. 创建存放 API Secret 的 YAML (命名为 cloudflare-api-token-secret.yaml) apiVersion: v1 kind: Secret metadata: name: cloudflare-api-token-secret namespace: cert-manager type: Opaque stringData: api-token: "你的 CF token"

执行应用:kubectl apply -f cloudflare-api-token-secret.yaml

6.4 创建全局证书颁发机构 (ClusterIssuer)

ClusterIssuer 是一个集群级别的资源,它定义了如何向 Let’s Encrypt 申请证书,以及使用什么方式进行验证。

阿里云

# 2. 创建 ClusterIssuer (命名为 aliyun-cluster-issuer.yaml) apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-aliyun spec: acme: # Let's Encrypt 生产环境 API server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com # 你的邮箱,用于接收证书过期通知 privateKeySecretRef: name: letsencrypt-aliyun-account-key solvers: - dns01: # 这里使用阿里云的 Webhook 插件配置 (需根据实际 DNS 服务商调整) webhook: # 这里与上面 groupName=acme.example.com 对应 groupName: acme.example.com solverName: alidns config: region: "cn-beijing" accessKeySecretRef: name: alidns-secret key: access-key secretKeySecretRef: name: alidns-secret key: secret-key

执行应用:kubectl apply -f aliyun-cluster-issuer.yaml

Cloudflare

# 2. 创建 ClusterIssuer (命名为 cloudflare-cluster-issuer.yaml) apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-cloudflare spec: acme: privateKeySecretRef: name: letsencrypt-cloudflare-account-key server: https://acme-v02.api.letsencrypt.org/directory solvers: - dns01: cloudflare: email: your-email@example.com # 你的邮箱,用于接收证书过期通知 apiTokenSecretRef: name: cloudflare-api-token-secret key: api-token

执行应用:kubectl apply -f cloudflare-cluster-issuer.yaml

6.5 申请泛域名证书 (Certificate)

由于我们需要的是泛域名(Wildcard)证书,最优雅的做法是集中申请一张证书,存储在一个固定的 Secret 中,之后所有的 Ingress 直接引用这个 Secret 即可,无需每次部署服务都重新申请。

阿里云

# 3. 申请泛域名证书 (命名为 aliyun-wildcard-certificate.yaml) apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: wildcard-k8s-example-com namespace: default # 证书所在的命名空间,建议放在常用业务的 Namespace spec: secretName: wildcard-k8s-example-com-tls # 签发成功后,证书会被存入这个 Secret dnsNames: - "*.k8s.example.com" issuerRef: name: letsencrypt-aliyun kind: ClusterIssuer

执行应用:kubectl apply -f aliyun-wildcard-certificate.yaml

Cloudflare

# 3. 申请泛域名证书 (命名为 cloudflare-wildcard-certificate.yaml) apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: wildcard-k8s-example-com namespace: default spec: secretName: wildcard-k8s-example-com-tls # 最终签发出来的证书会保存在这个 Secret 里面 issuerRef: kind: ClusterIssuer name: letsencrypt-cloudflare # 引用 ClusterIssuer,指示采用 dns01 方式进行校验 dnsNames: - "*.k8s.example.com"

执行应用:kubectl apply -f cloudflare-wildcard-certificate.yaml

验证签发状态:

# 这一步通常需要 1-3 分钟,因为 DNS TXT 记录的生效需要时间 kubectl get certificate -w # 看到 READY 字段变为 True,说明证书已成功签发并自动存入 Secret!

6.6 业务实战:部署配置 HTTPS 路由

还记得上一节我们部署了longhorn分布式存储,这次我们把longhorn自带的webui通过ingressroute的方式暴漏出来,并将刚才申请到的泛域名证书挂载给它。

--- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: longhorn-webui-route-tls namespace: longhorn-system spec: entryPoints: - websecure routes: - match: Host(`longhorn.k8s.example.com`) kind: Rule services: - name: longhorn-frontend port: 80 tls: secretName: wildcard-k8s-example-com-tls # 直接引用上一节中创建的 secretName

6.7 访问测试

在你的电脑上打开浏览器,访问 https://longhorn.k8s.example.com

你将看到:

  1. 浏览器地址栏出现了一把安全的小锁,查看证书颁发者为 Let’s Encrypt。
  2. 页面成功输出了 longhorn webui的界面
  3. 如果你刷新页面,Hostname 会在两个 Pod 之间轮询变化(负载均衡生效)。

image-202603251545377545120×2362 446 KB

网友解答:
--【壹】--:

感谢大佬教程


--【贰】--:

感谢佬友教程


--【叁】--:

感谢分享, 持续关注中


--【肆】--:

感谢佬的教程


--【伍】--:

感谢大佬教程


--【陆】--:

感恩佬儿教程

问题描述:

本章介绍如何使用 Cert-Manager 签发泛域名证书,给ingress controller使用
前情提要:

k8s保姆级教程:K8s高可用集群教程-01-使用 Kubespray 快速搭建集群(有手就行) 开发调优
第一部分:引言与架构规划 1.1 项目背景与目标 Kubernetes (K8s) 是什么就不多赘述了,最近在迁移部分服务到一个新的k8s集群中,借此机会写个部署教程 本教程将采用 Kubespray —— 一个基于 Ansible 的开源项目,来自动化部署一套生产级别的 K8s 集群。 本次部署的核心目标: 高可用性:构建 3 Master 节点的控制平面,确保单一节点故障不影响集群管理…
k8s保姆级教程:K8s高可用集群教程-02-Load Balancer和Ingress Controller 开发调优
关注的小伙伴久等了,因为工作的变动,关于k8s的教程一直没有更新,最近稍微有点时间,这就继续更新了,新刷到的小伙伴可以先看上一篇:k8s保姆级教程:K8s高可用集群教程-01-使用 Kubespray 快速搭建集群(有手就行) 废话不多说,下面开始正文 第四部分:流量入口与可视化 (Load Balancer, Traefik & Dashboard) 在我们拥有了一个健康的高可用集群后,首要…
k8s保姆级教程:K8s高可用集群教程-03-持久化存储 (Persistent Storage) 开发调优
本篇主要讲述在k8s集群中如何使用持久化存储,熟悉docker的佬友肯定对这个词不陌生,容器中的数据想要不丢失,那就需要把文件、目录挂载出来,在k8s集群中也一样,不过相对于docker,k8s可选的挂载方式和类型有很多种可供选择,我这里分享两种比较常用常见的方式,如果有跟着做的佬友,请务必看完整篇文章后再跟着操作。 感兴趣的佬友可以先看一下前两篇文章 下面开始正文 第五部分:打通数据任…

第六部分:自动化 HTTPS (Cert-Manager 泛域名证书)

在拥有了计算、网络和存储资源后,集群已经具备了完整的生产能力。本章会讲述如何利用 Cert-Manager 为集群自动签发一张受浏览器信任的 Let’s Encrypt 内网泛域名证书。

以下域名均使用示例域名,请操作时自行更换为自己的域名

6.1 核心原理解析:内网 IP 如何申请公网证书?

由于我们的负载均衡器 IP (172.16.5.194) 处于内网,外网无法访问。因此,我们将采用 DNS-01 验证方式

  1. DNS服务商 (如Cloudflare,aliyun,dnspod)控制台将自己要使用的泛域名解析到LB节点上,如:*.k8s.example.com 解析到 172.16.5.194
  2. Cert-Manager 向 Let’s Encrypt 发起 *.k8s.example.com 的证书申请。
  3. Let’s Encrypt 要求证明你拥有该域名,并给出一串验证码。
  4. Cert-Manager 调用你DNS服务商的 API,自动在 DNS 解析中添加一条 _acme-challenge 的 TXT 记录。
  5. Let’s Encrypt 验证 TXT 记录成功,下发泛域名证书。
  6. Cert-Manager 将证书保存为 Kubernetes Secret 供 Traefik 使用。

6.2 检查 Cert-Manager 状态

在第二部分的 Kubespray 配置中,我们已经启用了 cert_manager_enabled: true。首先验证它是否正常运行:

kubectl get pods -n cert-manager # 预期会看到 cert-manager, cert-manager-cainjector, cert-manager-webhook 三个处于 Running 状态的 Pod

image-202603251449498621372×200 43.7 KB

6.3 配置 DNS 供应商 API 凭证 (Secret)

为了让 Cert-Manager 能自动修改 DNS 记录,我们需要将域名提供商的 API Key 存入集群。

这里我提供aliyun-dns和cloudflare两个方案,选择其中一个即可

阿里云:

Cert-Manager默认不支持阿里云的DNS,需要对应的webhook,在签发前需要先部署一个webhook插件,如果使用cf签发可忽略此步骤

helm upgrade --install alidns-webhook alidns-webhook --repo https://wjiec.github.io/alidns-webhook --namespace cert-manager --set groupName=acme.example.com # groupName=acme.example.com 这个后面要用到

# 1. 创建存放 API Secret 的 YAML (命名为 alidns-secret.yaml) apiVersion: v1 kind: Secret metadata: name: alidns-secret namespace: cert-manager type: Opaque stringData: # 强烈建议在阿里云 RAM 访问控制中,创建一个仅拥有 DNS 修改权限的子账号 AK/SK access-key: "你的阿里云AccessKey" secret-key: "你的阿里云SecretKey"

执行应用:kubectl apply -f alidns-secret.yaml

Cloudflare:

# 1. 创建存放 API Secret 的 YAML (命名为 cloudflare-api-token-secret.yaml) apiVersion: v1 kind: Secret metadata: name: cloudflare-api-token-secret namespace: cert-manager type: Opaque stringData: api-token: "你的 CF token"

执行应用:kubectl apply -f cloudflare-api-token-secret.yaml

6.4 创建全局证书颁发机构 (ClusterIssuer)

ClusterIssuer 是一个集群级别的资源,它定义了如何向 Let’s Encrypt 申请证书,以及使用什么方式进行验证。

阿里云

# 2. 创建 ClusterIssuer (命名为 aliyun-cluster-issuer.yaml) apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-aliyun spec: acme: # Let's Encrypt 生产环境 API server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com # 你的邮箱,用于接收证书过期通知 privateKeySecretRef: name: letsencrypt-aliyun-account-key solvers: - dns01: # 这里使用阿里云的 Webhook 插件配置 (需根据实际 DNS 服务商调整) webhook: # 这里与上面 groupName=acme.example.com 对应 groupName: acme.example.com solverName: alidns config: region: "cn-beijing" accessKeySecretRef: name: alidns-secret key: access-key secretKeySecretRef: name: alidns-secret key: secret-key

执行应用:kubectl apply -f aliyun-cluster-issuer.yaml

Cloudflare

# 2. 创建 ClusterIssuer (命名为 cloudflare-cluster-issuer.yaml) apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-cloudflare spec: acme: privateKeySecretRef: name: letsencrypt-cloudflare-account-key server: https://acme-v02.api.letsencrypt.org/directory solvers: - dns01: cloudflare: email: your-email@example.com # 你的邮箱,用于接收证书过期通知 apiTokenSecretRef: name: cloudflare-api-token-secret key: api-token

执行应用:kubectl apply -f cloudflare-cluster-issuer.yaml

6.5 申请泛域名证书 (Certificate)

由于我们需要的是泛域名(Wildcard)证书,最优雅的做法是集中申请一张证书,存储在一个固定的 Secret 中,之后所有的 Ingress 直接引用这个 Secret 即可,无需每次部署服务都重新申请。

阿里云

# 3. 申请泛域名证书 (命名为 aliyun-wildcard-certificate.yaml) apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: wildcard-k8s-example-com namespace: default # 证书所在的命名空间,建议放在常用业务的 Namespace spec: secretName: wildcard-k8s-example-com-tls # 签发成功后,证书会被存入这个 Secret dnsNames: - "*.k8s.example.com" issuerRef: name: letsencrypt-aliyun kind: ClusterIssuer

执行应用:kubectl apply -f aliyun-wildcard-certificate.yaml

Cloudflare

# 3. 申请泛域名证书 (命名为 cloudflare-wildcard-certificate.yaml) apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: wildcard-k8s-example-com namespace: default spec: secretName: wildcard-k8s-example-com-tls # 最终签发出来的证书会保存在这个 Secret 里面 issuerRef: kind: ClusterIssuer name: letsencrypt-cloudflare # 引用 ClusterIssuer,指示采用 dns01 方式进行校验 dnsNames: - "*.k8s.example.com"

执行应用:kubectl apply -f cloudflare-wildcard-certificate.yaml

验证签发状态:

# 这一步通常需要 1-3 分钟,因为 DNS TXT 记录的生效需要时间 kubectl get certificate -w # 看到 READY 字段变为 True,说明证书已成功签发并自动存入 Secret!

6.6 业务实战:部署配置 HTTPS 路由

还记得上一节我们部署了longhorn分布式存储,这次我们把longhorn自带的webui通过ingressroute的方式暴漏出来,并将刚才申请到的泛域名证书挂载给它。

--- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: longhorn-webui-route-tls namespace: longhorn-system spec: entryPoints: - websecure routes: - match: Host(`longhorn.k8s.example.com`) kind: Rule services: - name: longhorn-frontend port: 80 tls: secretName: wildcard-k8s-example-com-tls # 直接引用上一节中创建的 secretName

6.7 访问测试

在你的电脑上打开浏览器,访问 https://longhorn.k8s.example.com

你将看到:

  1. 浏览器地址栏出现了一把安全的小锁,查看证书颁发者为 Let’s Encrypt。
  2. 页面成功输出了 longhorn webui的界面
  3. 如果你刷新页面,Hostname 会在两个 Pod 之间轮询变化(负载均衡生效)。

image-202603251545377545120×2362 446 KB

网友解答:
--【壹】--:

感谢大佬教程


--【贰】--:

感谢佬友教程


--【叁】--:

感谢分享, 持续关注中


--【肆】--:

感谢佬的教程


--【伍】--:

感谢大佬教程


--【陆】--:

感恩佬儿教程