在Kubernetes中,不同命名空间中的Ingress有什么不同?

17
我为不同的环境创建了两个不同的命名空间,一个是devops-qa,另一个是devops-dev。我在不同的命名空间中创建了两个ingress。因此,当我在devops-qa命名空间中创建qa环境的ingress时,写在qa ingress内部的规则能够正常工作,也就是说,我能够访问qa环境的网页。一旦我在devops-dev命名空间中创建dev环境的ingress,我将能够访问dev环境的网页,但无法访问qa环境的网页。当我删除dev ingress后,我再次能够访问qa环境的网站。
以下是dev和qa环境的ingress: Dev Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: cafe-ingress-dev
  namespace: devops-dev
spec:
  tls:
  - hosts:
    - cafe-dev.example.com
    secretName: default-token-drk6n
  rules:
  - host: cafe-dev.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: miqpdev-svc
          servicePort: 80

质量保证入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx" 
  name: cafe-ingress-qa
  namespace: devops-qa
spec:
  tls:
  - hosts:
    - cafe-qa.example.com
    secretName: default-token-jdnqf
  rules:
  - host: cafe-qa.example.com
    http:
      paths:
      - path: /greentea
        backend:
          serviceName: greentea-svc
          servicePort: 80
      - path: /blackcoffee
        backend:
          serviceName: blackcoffee-svc
          servicePort: 80

在ingress文件中提到的令牌是每个命名空间的。而nginx ingress控制器正在QA命名空间中运行。如何同时运行ingress并能够获取部署在开发环境和QA环境的所有网站?


你正在使用哪个Ingress Controller? - Radek 'Goblin' Pieczonka
我正在使用nginx-plus。 - Nikit Swaraj
每个令牌 default-token-jdnqfdefault-token-drk6n 是否都是您自己创建并自签名的 TLS 证书? - daniely
4个回答

11

我实际上解决了我的问题。我做的一切都是正确的。但是我没有做的唯一一件事就是在Route53中将主机名与相同的IP映射起来。而且我不是通过主机名访问网站,而是通过IP访问它。现在,在使用主机名访问网站后,我能够访问它 :)


4
似乎你已经在这里发帖并得到回答。解决方案是为每个命名空间部署不同的Ingress。然而,部署2个Ingress会使事情变得复杂,因为一个实例必须运行在非标准端口(例如8080、8443)上。
我认为使用DNS更好地解决这个问题。创建CNAME记录cafe-qa.example.comcafe-dev.example.com,它们都指向cafe.example.com。然后相应地更新每个Ingress清单。使用DNS有点像将开发/质量保证/生产环境分离的标准方式。

嗨 Eugene,我仍然无法解决这个问题。我尝试使用不同的主机,但我仍然无法访问两个命名空间的网站。Nginx Ingress控制器正在QA中运行。 - Nikit Swaraj
嗨,尤金,我试图按照文档进行操作,但在运行traefik pod之后,我尝试查看该pod的日志,然后出现以下错误:“ERROR: logging before flag.Parse: E0801 11:58:08.036915 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Secret: Get https://10.254.0.1:443/api/v1/secrets?resourceVersion=0: dial tcp 10.254.0.1:443: i/o timeout” - Nikit Swaraj
你是否曾经遇到过这种问题? - Nikit Swaraj
Traefik是否正确为您提供站点服务?错误是由于Traefik没有权限(即RBAC策略)访问kube-apiserver上的Secrets。如果您的设置正常工作,则可以忽略此错误。我记得开发人员已经意识到了这个问题。 - Eugene Chow
一个命名空间可以有多个 Ingress 控制器吗?我尝试通过创建两个并将静态 IP 地址分配给我的各自的 CNAME 记录来解决此问题,但遇到了上述详细说明的相同问题。这只适用于每个命名空间一个 Ingress 吗? - gutscdav000
显示剩余5条评论

1

我曾遇到同样的问题,找到了解决方法:

您只需要在与您的入口资源相关联的入口服务下添加"--watch-namespace"参数即可。然后它将仅绑定到与入口服务及其Pod所属的相同命名空间中的服务。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace:  my-namespace
name: nginx-ingress-controller
spec: 
  replicas: 1
selector:
  matchLabels:
    name: nginx-ingress-lb
template: 
  metadata: 
    labels: 
      name: nginx-ingress-lb
  spec:
    serviceAccountName: ingress-account
    containers: 
      - args: 
          - /nginx-ingress-controller
          - "--default-backend-service=$(POD_NAMESPACE)/default-http-backend"
          - "--default-ssl-certificate=$(POD_NAMESPACE)/secret-tls"
          - "--watch-namespace=$(POD_NAMESPACE)"
        env: 
          - name: POD_NAME
            valueFrom: 
              fieldRef: 
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom: 
              fieldRef: 
                fieldPath: metadata.namespace
        name: nginx-ingress-controller
        image: "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1"
        livenessProbe: 
          httpGet: 
            path: /healthz
            port: 10254
            scheme: HTTP
        ports: 
          - containerPort: 80
            name: http
            protocol: TCP
          - containerPort: 443
            name: https
            protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
namespace:  my-namespace
name: nginx-ingress
spec:
  type: LoadBalancer
  ports:
  - name: https
    port: 443
    targetPort: https
  selector:
    name: nginx-ingress-lb

1
您可以通过以下方式实现隔离:
  • 使用不同的命名空间(例如devops-dev和devops-qa)
  • 每个命名空间使用不同的入口类: kubernetes.io/ingress.class: "nginx-dev" kubernetes.io/ingress.class: "nginx-qa"
  • 在入口部署模板.spec.containers.args中使用“--watch-namespace=$(POD_NAMESPACE)” 这对我来说很有用。
- Med Ali Difallah

0

您可以在kube-system命名空间中创建nginx ingress控制器,而不是在QA命名空间中创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接