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

如何通过Kubernetes集群代理访问需HTTP代理的内部网站

解决方案:代理内部网站并替换页面链接

针对你的需求,以下两种方案可实现通过Kubernetes Ingress访问内部网站,同时替换页面内链接以支持正常导航:

方案一:利用Nginx Ingress Controller内置功能

如果集群使用Nginx Ingress Controller,可直接通过注解配置反向代理和内容替换,无需额外部署Pod。

步骤1:准备空占位服务

Ingress规则必须指向一个Service,创建无头服务作为占位:

apiVersion: v1
kind: Service
metadata:
  name: dummy-internal-service
spec:
  ports:
    - port: 80
      targetPort: 80
  clusterIP: None

步骤2:创建Ingress规则

配置反向代理并通过sub_filter替换页面中的内部域名:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: internal-site-proxy-ingress
  annotations:
    # 转发请求到内部网站
    nginx.ingress.kubernetes.io/proxy-pass: "https://internal.url"
    # 重写路径,保留原请求路径结构
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    # 替换页面内的内部域名到集群访问域名
    nginx.ingress.kubernetes.io/sub-filter: 'https://internal.url https://my-internal-website.kubernetes-cluster.com'
    # 指定需要替换的内容类型
    nginx.ingress.kubernetes.io/sub-filter-types: "text/html text/css text/javascript application/json"
    # 开启全局替换,默认仅替换第一个匹配项
    nginx.ingress.kubernetes.io/sub-filter-once: "false"
spec:
  rules:
    - host: my-internal-website.kubernetes-cluster.com
      http:
        paths:
          - path: /(.*)
            pathType: Prefix
            backend:
              service:
                name: dummy-internal-service
                port:
                  number: 80

步骤3:配置节点代理(若需要)

如果集群节点必须通过HTTP代理才能访问https://internal.url,需修改Nginx Ingress Controller的Deployment,添加代理环境变量:

# 编辑Ingress Controller的Deployment
kubectl edit deployment -n ingress-nginx ingress-nginx-controller

# 在.spec.template.spec.containers[0].env下添加:
- name: HTTP_PROXY
  value: "http://your-node-proxy:port"
- name: HTTPS_PROXY
  value: "http://your-node-proxy:port"

方案二:自定义Nginx代理Pod

若不想修改Ingress Controller配置,可单独部署Nginx Pod作为反向代理,负责请求转发和内容替换。

步骤1:创建Nginx配置ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: internal-site-nginx-config
data:
  nginx.conf: |
    events {}
    http {
      server {
        listen 80;

        location / {
          # 转发请求到内部网站
          proxy_pass https://internal.url;
          # 保留原请求的Host头
          proxy_set_header Host internal.url;
          # 传递客户端IP信息
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          # 替换页面内的内部域名
          sub_filter 'https://internal.url' 'https://my-internal-website.kubernetes-cluster.com';
          # 替换所有匹配项
          sub_filter_once off;
          # 指定需要处理的内容类型
          sub_filter_types text/html text/css text/javascript application/json;
        }
      }
    }

步骤2:部署代理Pod和Service

apiVersion: apps/v1
kind: Deployment
metadata:
  name: internal-site-proxy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: internal-site-proxy
  template:
    metadata:
      labels:
        app: internal-site-proxy
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          # 若需要代理,添加环境变量
          # env:
          #   - name: HTTP_PROXY
          #     value: "http://your-node-proxy:port"
          #   - name: HTTPS_PROXY
          #     value: "http://your-node-proxy:port"
      volumes:
        - name: nginx-config
          configMap:
            name: internal-site-nginx-config
---
apiVersion: v1
kind: Service
metadata:
  name: internal-site-proxy-service
spec:
  selector:
    app: internal-site-proxy
  ports:
    - port: 80
      targetPort: 80

步骤3:创建Ingress指向代理Service

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: internal-site-ingress
spec:
  rules:
    - host: my-internal-website.kubernetes-cluster.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: internal-site-proxy-service
                port:
                  number: 80

为什么ExternalName Service不适用?

ExternalName Service仅将Service域名映射为外部DNS别名,客户端请求时会直接被引导到https://internal.url,但你无法直接访问该域名。因此需要反向代理而非DNS重定向,让集群内组件替你完成请求转发和内容处理。

内容的提问来源于stack exchange,提问作者gemorra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:25:01