在AKS中创建SSL证书并配置LoadBalancer Service以支持HTTPS请求
先明确核心概念:Kubernetes的LoadBalancer Service是**四层(TCP/UDP)**负载均衡,本身不处理HTTPS(HTTPS属于七层HTTP+TLS协议)。要让服务接收HTTPS请求,有两种实用方案,先理清你困惑的两个工具:
- Ingress:Kubernetes的七层路由资源,用来定义域名、路径到后端Service的转发规则,由Ingress Controller(比如NGINX)实现这些规则,通常以LoadBalancer类型暴露,负责处理HTTPS终止。
- cert-manager:Kubernetes插件,自动申请、续期SSL证书(比如Let's Encrypt免费证书),替代手动管理证书的繁琐流程。
方案一:后端Pod直接处理HTTPS(适合测试/简单场景)
这种方式是让运行应用的Pod自己加载SSL证书,Service直接转发443端口的TCP流量到Pod。
步骤1:生成SSL证书
可以用OpenSSL生成自签证书(仅测试用,生产建议用可信CA颁发的证书):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=your-domain.com/O=your-org"
步骤2:将证书存入Kubernetes Secret
把证书和密钥放到Secret中,方便Pod挂载使用:
kubectl create secret tls my-app-tls --cert=tls.crt --key=tls.key
步骤3:修改Deployment挂载证书
更新你的应用Deployment,将Secret挂载到Pod的目录中,并配置应用使用证书(以Nginx应用为例):
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 2 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: nginx:alpine volumeMounts: - name: tls-secret mountPath: /etc/nginx/tls readOnly: true - name: nginx-config mountPath: /etc/nginx/conf.d volumes: - name: tls-secret secret: secretName: my-app-tls - name: nginx-config configMap: name: nginx-https-config
对应的Nginx配置ConfigMap(监听443端口并使用证书):
apiVersion: v1 kind: ConfigMap metadata: name: nginx-https-config data: default.conf: | server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/nginx/tls/tls.crt; ssl_certificate_key /etc/nginx/tls/tls.key; location / { root /usr/share/nginx/html; index index.html; } }
步骤4:更新LoadBalancer Service暴露443端口
修改你的Service manifest,将端口指向Pod的443端口:
apiVersion: v1 kind: Service metadata: name: my-loadbalancer-service spec: type: LoadBalancer ports: - port: 443 targetPort: 443 protocol: TCP name: https selector: app: my-app
方案二:用Ingress+cert-manager(生产环境推荐)
这种方式由Ingress Controller处理HTTPS终止,cert-manager自动管理证书,后端Service只需处理HTTP流量,更适合生产场景,也能节省LoadBalancer资源(多个服务共享一个Ingress的LoadBalancer IP)。
步骤1:安装NGINX Ingress Controller
用Helm安装官方NGINX Ingress Controller(会自动创建一个LoadBalancer类型的Service):
helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --namespace ingress-nginx \ --create-namespace
步骤2:安装cert-manager
同样用Helm安装,同时安装CRD(cert-manager需要的自定义资源):
helm upgrade --install cert-manager cert-manager \ --repo https://charts.jetstack.io \ --namespace cert-manager \ --create-namespace \ --set installCRDs=true
步骤3:创建ClusterIssuer(申请证书的凭证)
创建一个ClusterIssuer,用来向Let's Encrypt申请可信证书:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com # 接收证书过期通知的邮箱 privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx
应用这个配置:
kubectl apply -f cluster-issuer.yaml
步骤4:创建Ingress资源关联你的Service
创建Ingress规则,指定域名、证书,并转发流量到你的现有Service(建议将现有Service改为ClusterIP类型,避免浪费LoadBalancer资源):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress annotations: cert-manager.io/cluster-issuer: letsencrypt-prod # 指定用上面的ClusterIssuer申请证书 spec: tls: - hosts: - your-domain.com # 你的域名,需要解析到Ingress Controller的LoadBalancer IP secretName: my-app-ingress-tls # cert-manager会自动创建这个Secret存储证书 rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: my-existing-service # 你的后端Service名称 port: number: 80 # 后端Service暴露的HTTP端口
应用配置:
kubectl apply -f ingress.yaml
步骤5:配置域名解析
获取Ingress Controller的LoadBalancer IP:
kubectl get svc -n ingress-nginx ingress-nginx-controller
将你的域名(your-domain.com)解析到这个IP,cert-manager会自动完成证书申请和续期,Ingress会处理HTTPS请求并转发到后端Service。
内容的提问来源于stack exchange,提问作者Be you

