Azure Kubernetes内部IP配置HTTPS的实现方案咨询
完全可以实现!你不用把证书复制到每个业务容器,也能保持服务只在Azure虚拟网络内部访问——甚至可以不用Ingress控制器,下面给你两种具体的实现思路:
方案一:不用Ingress,用Sidecar代理做TLS终止
这种方式不需要引入Ingress组件,而是给每个ASP.NET Core Pod添加一个Sidecar代理(比如Nginx、Envoy),由Sidecar来处理HTTPS终止,业务容器只需要监听HTTP端口即可,证书统一存在K8s Secret里,避免重复复制到业务容器:
将证书导入K8s TLS Secret
把你的域名证书(PEM格式)转换成K8s专用的TLS Secret:kubectl create secret tls internal-app-tls --cert=./your-cert.crt --key=./your-key.key修改Deployment,添加Sidecar代理
以Nginx作为Sidecar为例,在Deployment的Pod模板里新增一个Nginx容器,挂载TLS Secret和自定义配置,让它监听443端口并转发请求到业务容器的HTTP端口(比如5000):apiVersion: apps/v1 kind: Deployment metadata: name: aspnet-app spec: replicas: 3 selector: matchLabels: app: aspnet-app template: metadata: labels: app: aspnet-app spec: containers: - name: aspnet-app image: your-aspnet-image:latest ports: - containerPort: 5000 name: http - name: nginx-sidecar image: nginx:alpine ports: - containerPort: 443 name: https volumeMounts: - name: tls-secret mountPath: /etc/nginx/certs readOnly: true - name: nginx-config mountPath: /etc/nginx/conf.d readOnly: true volumes: - name: tls-secret secret: secretName: internal-app-tls - name: nginx-config configMap: name: nginx-sidecar-config创建Nginx配置的ConfigMap
编写Nginx的HTTPS转发配置,确保请求能正确转发到业务容器:apiVersion: v1 kind: ConfigMap metadata: name: nginx-sidecar-config data: default.conf: | server { listen 443 ssl; server_name your-internal-domain.example.com; ssl_certificate /etc/nginx/certs/tls.crt; ssl_certificate_key /etc/nginx/certs/tls.key; location / { proxy_pass http://localhost:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }更新Service为内部LB,指向Sidecar的443端口
确保Service是LoadBalancer类型,并添加Azure内部LB的专属注解(acs-engine部署的集群原生支持这个注解):apiVersion: v1 kind: Service metadata: name: aspnet-app-service annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" spec: type: LoadBalancer ports: - port: 443 targetPort: https protocol: TCP name: https selector: app: aspnet-app这样Service会分配一个Azure虚拟网络内部的IP,只有VPN或VNet内的客户端能访问,HTTPS终止在Sidecar层,业务容器完全不用处理证书相关逻辑。
方案二:用Ingress控制器但限制为内部访问(可选)
如果你愿意用Ingress但不想暴露公网IP,也可以部署内部版Nginx Ingress Controller,让它的Service只分配内部LB IP,这样既利用Ingress的TLS管理能力,又能保持服务在内部网络:
部署内部Nginx Ingress Controller
部署时通过注解指定使用内部LB,以Helm为例:helm install nginx-ingress ingress-nginx/ingress-nginx \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"="true"(不用Helm的话,也可以手动修改Ingress Controller的Service,添加上述注解)
创建TLS Secret和Ingress资源
先创建好TLS Secret(和方案一步骤1相同),再编写Ingress配置绑定域名和TLS:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: internal-app-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - your-internal-domain.example.com secretName: internal-app-tls rules: - host: your-internal-domain.example.com http: paths: - path: / pathType: Prefix backend: service: name: aspnet-app-service port: number: 5000这里的
aspnet-app-service是指向业务Pod的ClusterIP Service,Ingress Controller会处理HTTPS终止,然后转发到业务容器的HTTP端口,整个Ingress Controller的LB是内部IP,不会暴露到公网。
额外注意事项
- 确保你的内部域名能在VPN/VNet内解析到对应的内部LB IP(可以用Azure Private DNS Zone配置)
- 证书的域名要和内部访问的域名完全匹配,否则客户端会出现证书信任问题
- 如果用Sidecar方案,要注意Sidecar会额外消耗每个Pod的CPU和内存资源,根据业务负载调整配置
内容的提问来源于stack exchange,提问作者higherer

