首先,使用cert-manager快速生成自签证书:安装cert-manager后,创建ClusterIssuer yaml:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-issuer
spec:
selfSigned: {}
然后创建Certificate:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-selfsigned-cert
spec:
secretName: my-selfsigned-cert-tls
issuerRef:
name: selfsigned-issuer
kind: ClusterIssuer
dnsNames:
- example.com
应用到Ingress:apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
- hosts:
- example.com
secretName: my-selfsigned-cert-tls
使用OpenSSL手动生成自签证书
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes -keyout tls.key -out tls.crt -subj "/CN=*.local"
创建Secret:kubectl create secret tls my-tls-secret --cert=tls.crt --key=tls.key
在Deployment或Ingress中引用这个secret,实现HTTPS加密。
cert-manager一键部署自签CA
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
创建SelfSigned ClusterIssuer,然后Certificate会自动签发证书到secret中,直接用在service中。
本地K8s Minikube部署TLS
minikube tunnel # 暴露LoadBalancer
使用mkcert生成本地信任证书:brew install mkcert
mkcert -install
mkcert localhost 127.0.0.1 ::1
kubectl create secret tls mkcert --cert=localhost+2.pem --key=localhost+2-key.pem
验证证书生效
kubectl get certificate
kubectl describe secret my-tls-secret
curl -k https://your-app.local 检查是否返回加密响应。
小tips:浏览器信任自签证书
将crt文件导入浏览器信任根证书列表,或用mkcert生成系统信任证书,避免浏览器警告。
Q: 自签证书安全吗?
A: 适合本地开发测试,不适合生产环境暴露公网,用Let's Encrypt免费ACME证书更好。
Q: cert-manager怎么卸载?
A: helm uninstall cert-manager -n cert-manager。
Q: 证书过期怎么续期?
A: cert-manager支持自动续期,设置renewBefore=30d即可。
Q: 支持通配符域名吗?
A: 是,在dnsNames添加*.example.com即可。