如何通过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
相关产品推荐
相关产品推荐

