在没有 cert-manager 的情况下,你需要手动申请证书、创建 Kubernetes Secret,并在证书到期前重复这一流程,过程繁琐且容易出错。
cert-manager 的核心价值在于:
自动化:它会自动向 Let's Encrypt 等证书颁发机构(CA)申请证书,并在到期前自动续期。
集成:它将获得的证书自动存储为 Kubernetes Secret,供 Ingress 直接使用。
灵活性:它支持多种证书来源,如 Let's Encrypt (ACME协议)、HashiCorp Vault 或自签名证书我们是非云场景,外网IP直接绑定到一张网卡上,另外我们使用Ingress自签证书
1.安装cert-manager
helm repo add jetstack https://charts.jetstack.io/
helm repo update我们可以查看下目前所有的版本
helm search repo cert-manager --versions我们选择v1.19.2这个版本进行安装
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.19.2 \
--set crds.enabled=true2.查看安装状态
kubectl get pods --namespace cert-manager
要让 cert-manager 帮你管理证书,你需要告诉它去哪个机构(CA)申请,以及通过哪种方式验证你对域名的所有权。这里以最常用的 Let's Encrypt 为例。
Issuer 和 ClusterIssuer 的区别:
Issuer:作用域仅限于某个命名空间。
ClusterIssuer:作用于整个集群,所有命名空间都可以使用。
Let's Encrypt 提供了两种验证域名所有权的方式,你需要根据自己的网络环境选择一种。
HTTP-01 服务有公网 IP,且域名已正确解析。 通过访问一个临时路径(/.well-known/acme-challenge/)来验证。实现简单,但不能申请通配符证书 *.example.com
DNS-01 服务在内部网络,或需要申请通配符证书。 通过在域名的 DNS 记录中添加一个 TXT 记录来验证。配置稍复杂,但功能强大,可以申请通配符证书这里由于环境限制和场景我们选择使用Issuer自签证书
3.安装ingress
Ingress 是 Kubernetes 中的一种 API 对象,用于管理从集群外部到集群内部服务的 HTTP 和 HTTPS 流量。它通过定义规则,将外部请求路由到集群内的不同服务。Ingress 提供了负载均衡、SSL 终结以及基于名称的虚拟主机等功能。
基本功能
Ingress 允许通过配置以下功能来管理流量:
外部访问 URL:为服务提供可访问的外部 URL。
负载均衡:在多个后端服务之间分配流量。
SSL/TLS 支持:通过 Secret 配置 TLS 证书以加密流量。
基于路径或主机名的路由:根据请求的路径或主机名将流量路由到不同的服务。使用helm安装
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace4.创建Issuer和Certificate
创建一个自签名的 Issuer(类型为 selfsigned),或使用 ca 类型的 Issuer 搭建内部 CA。
在 Certificate 中引用这个内部 Issuer,cert-manager 会直接签发证书,无需任何公网验证。
cat selfsigned.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned-issuer
namespace: default
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-app-cert
namespace: default
spec:
secretName: my-app-tls
dnsNames:
- app.example.com
issuerRef:
name: selfsigned-issuer
kind: Issuer5.创建ingress规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
cert-manager.io/force-renew: "true"
spec:
ingressClassName: nginx # 替换为你的 Ingress Class,通过kubectl get ingressclass 获取
tls:
- hosts:
- app.example.com # 你的域名
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service # 业务svc的名字
port:
number: 806.发布业务deployMent和svc
这里就不举例子了,可以根据自己的项目自己撰写7.注意事项
由于我们使用的是非云场景,所以需要修改ingress-nginx-controller,这个pod网络需要修改成hostnetworkkubectl edit deploy -n ingress-nginx ingress-nginx-controller添加
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true最后再解析域名到Ingress中绑定的域名,网络的流向就是这样的
用户流量->Ingress-nginx pod->Ingress规则->应用svc->应用pod
内容版权声明:除非注明,否则皆为本站原创文章。
评论列表