前提条件
k8s集群<1.19
cert-manager
ingress-nginx
安装cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml
官方安装文档
安装ingress-nginx
注意安装镜像地址,改为国内地址,建议使用lank8s.cn,使用文档在官网,修改一下地址即可。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml
kubectl apply -f deploy.yaml
查看ingressclass
kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 5d
##
启动一个http服务
kind: Service
apiVersion: v1
metadata:
name: demo
spec:
selector:
app: demo
ports:
- name: http-port
port: 80
protocol: TCP
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
labels:
app: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: nginx
image: nginx:1.21.6
env:
- name: TZ
value: Asia/Shanghai
ports:
- containerPort: 80
颁发机构(CA)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory #生产证书地址
email: example@vsoul.cn # 接收证书申请信息邮箱
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx #填写安装的ingressclass名称
ACME:自动证书管理环境 协议来确定您是否拥有某个域名,进而确定能否被颁发 Let’s Encrypt 证书。对于这个 challenge,需要传递以下参数:
metadata.name:ClusterIssuer 名称,在 Kubernetes 安装中需要是唯一的。这个名称将在后面的证书颁发示例中用到。
spec.acme.email:这是您为生成证书而使用 Let’s Encrypt 注册的电子邮件地址。这应该是您的电子邮件。
spec.acme.privateKeySecretRef:这是您将用来存储私钥的 Kubernetes secret 的名称。
spec.acme.solvers:这应保持不变——它指出了您所使用的 challenge 类型(或者 ACME 所说的解析程序)(HTTP-01 或 DNS-01),以及它应该应用于哪种 Ingress 类型(在这种情况下,将是 nginx)。
签发证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod # ClusterIssuer名称
spec:
ingressClassName: nginx
tls:
- secretName: test-tls # 证书名
hosts:
- vsoul.cn # 域名
rules:
- host: vsoul.cn # 域名
http:
paths:
- path: /
#pathType: ImplementationSpecific
pathType: Prefix
backend:
service:
name: demo # 服务名
port:
number: 80 # 服务的端口号 service port,非pod port
验证HTTPS
故障排查
Certificate => CertificateRequest => Order => Challenge
以此使用kubectl get、describe查看状态和日志
参考链接:HTTP Validation - cert-manager Documentation、验证方式 - Let's Encrypt - 免费的SSL/TLS证书 (letsencrypt.org)