【问题标题】:Kubernetes: add ingress internal ip to environmentKubernetes:向环境添加入口内部 ip
【发布时间】:2020-01-11 13:28:49
【问题描述】:

对于 .net 核心应用程序,我需要 nginx 入口的内部 IP 地址来信任代理并处理其转发的标头。

这是通过我的应用程序中的以下代码完成的:

forwardedHeadersOptions.KnownProxies.Add(IPAddress.Parse("10.244.0.16"));

现在它是硬编码的。但是如何才能将此 IP 地址放入容器的环境变量中?

给定的 IP 地址似乎是 ingress-nginx 服务在 ingress-nginx 命名空间中的端点:

❯ kubectl describe service ingress-nginx -n ingress-nginx
Name:                     ingress-nginx
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/part-of=ingress-nginx
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/par...
Selector:                 app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
Type:                     LoadBalancer
IP:                       10.0.91.124
LoadBalancer Ingress:     40.127.224.177
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  30756/TCP
Endpoints:                10.244.0.16:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  31719/TCP
Endpoints:                10.244.0.16:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     32003
Events:                   <none>

仅供参考:这是我的部署:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: uwgazon-web
spec:
  replicas: 1
  paused: true
  template:
    metadata:
      labels:
        app: uwgazon-web
    spec:
      containers:
      - name: uwgazon-web
        image: uwgazon/web
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        env:
        - name: UWGAZON_RECAPTCHA__SITEKEY
          valueFrom:
            secretKeyRef:
              name: uwgazon-recaptcha
              key: client-id
        - name: UWGAZON_RECAPTCHA__SERVERKEY
          valueFrom:
            secretKeyRef:
              name: uwgazon-recaptcha
              key: client-secret
        - name: UWGAZON_MAILGUN__BASEADDRESS
          valueFrom:
            secretKeyRef:
              name: uwgazon-mailgun
              key: base-address
        - name: UWGAZON_APPLICATIONINSIGHTS__INSTRUMENTATIONKEY
          valueFrom:
            secretKeyRef:
              name: uwgazon-appinsights
              key: instrumentationkey
        - name: APPINSIGHTS_INSTRUMENTATIONKEY
          valueFrom:
            secretKeyRef:
              name: uwgazon-appinsights
              key: instrumentationkey
        - name: UWGAZON_MAILGUN__APIKEY
          valueFrom:
            secretKeyRef:
              name: uwgazon-mailgun
              key: api-key
        - name: UWGAZON_MAILGUN__TOADDRESS
          valueFrom:
            secretKeyRef:
              name: uwgazon-mailgun
              key: to-address
        - name: UWGAZON_BLOG__NAME
          valueFrom:
            configMapKeyRef:
              name: uwgazon-config
              key: sitename
        - name: UWGAZON_BLOG__OWNER
          valueFrom:
            configMapKeyRef:
              name: uwgazon-config
              key: owner
        - name: UWGAZON_BLOG__DESCRIPTION
          valueFrom:
            configMapKeyRef:
              name: uwgazon-config
              key: description

还有我的入口配置

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: uwgazon-web-ingress
  annotations:
    cert-manager.io/issuer: "uwgazon-tls-issuer"
spec:
  tls:
  - hosts:
    - uwgazon.sdsoftware.be
    secretName: uwgazon-sdsoftware-be-tls
  rules:
  - host: uwgazon.sdsoftware.be
    http:
      paths:
      - backend:
          serviceName: uwgazon-web
          servicePort: 80

【问题讨论】:

  • 友情提示,不存在“the nginx-ingress Pod IP”之类的东西,因为 Pod 根据定义是短暂的,可以随负载扩展和缩减;您需要将 Pod CIDR 列入白名单,或者,如果安全性对您来说很重要,请查看网络策略以限制集群内的流量
  • @mdaniel 谢谢,我信任我的应用程序中的整个内部网络。我在下面发布了答案。

标签: asp.net-core kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

我找到了解决方案,专门针对 Asp.net 核心。

首先,您必须将代理列入白名单,否则转发的标头中间件将不起作用。

我发现,您实际上可以将整个网络列入白名单。这样,您就信任集群内的所有内容。 Kubernetes 使用 10.0.0.0/8 网络(子网掩码 0.255.255.255)。信任它,可以使用以下代码完成:

services.Configure<ForwardedHeadersOptions>(forwardedHeadersOptions =>
{
    forwardedHeadersOptions.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    forwardedHeadersOptions.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8));
});

【讨论】:

  • 所以我可以将其限制为集群 CIDR,我明白了。更窄是不可能的,因为 POD 可以有任何 IP。我可以自动获取这个值吗?
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2017-06-22
相关资源
最近更新 更多