You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Kubernetes内部IP配置HTTPS的实现方案咨询

实现内部HTTPS访问K8s服务的可行方案

完全可以实现!你不用把证书复制到每个业务容器,也能保持服务只在Azure虚拟网络内部访问——甚至可以不用Ingress控制器,下面给你两种具体的实现思路:

方案一:不用Ingress,用Sidecar代理做TLS终止

这种方式不需要引入Ingress组件,而是给每个ASP.NET Core Pod添加一个Sidecar代理(比如Nginx、Envoy),由Sidecar来处理HTTPS终止,业务容器只需要监听HTTP端口即可,证书统一存在K8s Secret里,避免重复复制到业务容器:

  1. 将证书导入K8s TLS Secret
    把你的域名证书(PEM格式)转换成K8s专用的TLS Secret:

    kubectl create secret tls internal-app-tls --cert=./your-cert.crt --key=./your-key.key
    
  2. 修改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
    
  3. 创建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;
          }
        }
    
  4. 更新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管理能力,又能保持服务在内部网络:

  1. 部署内部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,添加上述注解)

  2. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:44