k8s保姆级教程:K8s高可用集群教程-04-自动化 HTTPS
- 内容介绍
- 文章标签
- 相关推荐
本章介绍如何使用 Cert-Manager 签发泛域名证书,给ingress controller使用
前情提要:
第一部分:引言与架构规划 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 验证方式:
- 在
DNS服务商(如Cloudflare,aliyun,dnspod)控制台将自己要使用的泛域名解析到LB节点上,如:*.k8s.example.com解析到172.16.5.194 - Cert-Manager 向 Let’s Encrypt 发起
*.k8s.example.com的证书申请。 - Let’s Encrypt 要求证明你拥有该域名,并给出一串验证码。
- Cert-Manager 调用你DNS服务商的 API,自动在 DNS 解析中添加一条
_acme-challenge的 TXT 记录。 - Let’s Encrypt 验证 TXT 记录成功,下发泛域名证书。
- 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。
你将看到:
- 浏览器地址栏出现了一把安全的小锁,查看证书颁发者为 Let’s Encrypt。
- 页面成功输出了 longhorn webui的界面
- 如果你刷新页面,Hostname 会在两个 Pod 之间轮询变化(负载均衡生效)。
image-202603251545377545120×2362 446 KB
网友解答:--【壹】--:
感谢大佬教程
--【贰】--:
感谢佬友教程
--【叁】--:
感谢分享, 持续关注中
--【肆】--:
感谢佬的教程
--【伍】--:
感谢大佬教程
--【陆】--:
感恩佬儿教程
本章介绍如何使用 Cert-Manager 签发泛域名证书,给ingress controller使用
前情提要:
第一部分:引言与架构规划 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 验证方式:
- 在
DNS服务商(如Cloudflare,aliyun,dnspod)控制台将自己要使用的泛域名解析到LB节点上,如:*.k8s.example.com解析到172.16.5.194 - Cert-Manager 向 Let’s Encrypt 发起
*.k8s.example.com的证书申请。 - Let’s Encrypt 要求证明你拥有该域名,并给出一串验证码。
- Cert-Manager 调用你DNS服务商的 API,自动在 DNS 解析中添加一条
_acme-challenge的 TXT 记录。 - Let’s Encrypt 验证 TXT 记录成功,下发泛域名证书。
- 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。
你将看到:
- 浏览器地址栏出现了一把安全的小锁,查看证书颁发者为 Let’s Encrypt。
- 页面成功输出了 longhorn webui的界面
- 如果你刷新页面,Hostname 会在两个 Pod 之间轮询变化(负载均衡生效)。
image-202603251545377545120×2362 446 KB
网友解答:--【壹】--:
感谢大佬教程
--【贰】--:
感谢佬友教程
--【叁】--:
感谢分享, 持续关注中
--【肆】--:
感谢佬的教程
--【伍】--:
感谢大佬教程
--【陆】--:
感恩佬儿教程

