【问题标题】:Different ingress in different Namespace in kubernetesKubernetes不同命名空间中的不同入口
【发布时间】:2019-10-16 07:50:55
【问题描述】:

我为不同的环境创建了两个不同的命名空间。一个是 devops-qa,另一个是 devops-dev。我在不同的命名空间中创建了两个入口。因此,在 devops-qa 命名空间中创建 qa env 的入口时,编写在 qa 入口内的规则运行良好。意味着我可以访问 qa env 的网页。我将在 devops-dev 命名空间中创建 dev env 的入口的那一刻,我将能够访问 dev env 的网页,但无法访问 qa 的网页。当我再次删除开发入口时,我将能够访问 qa env 网站

下面是 dev 和 qa env 的 ingree。

开发入口

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

入口文件中提到的令牌是每个命名空间的。并且 nginx 入口控制器在 QA 命名空间中运行 我怎样才能同时运行 ingress 并能够在 dev 和 qa 环境中部署所有网站?

【问题讨论】:

  • 你用的是什么入口控制器?
  • 我正在使用 nginx-plus
  • 每个令牌 default-token-jdnqfdefault-token-drk6n 是您自己创建并自签名的 TLS 证书吗?

标签: namespaces kubernetes


【解决方案1】:

我实际上解决了我的问题。我做的一切都是正确的。但我唯一没有做的就是在 Route53 中使用相同的 ip 映射主机名。我没有使用主机名访问该网站,而是从 IP 访问它。现在从主机名访问该网站后,我可以访问它了:)

【讨论】:

    【解决方案2】:

    好像你发布了here and got your answer。解决方案是为每个命名空间部署不同的 Ingress。但是,部署 2 个 Ingress 会使事情变得复杂,因为一个实例必须在非标准端口(例如 8080、8443)上运行。

    我认为使用 DNS 可以更好地解决这个问题。创建 CNAME 记录 cafe-qa.example.comcafe-dev.example.com 都指向 cafe.example.com。相应地更新每个 Ingress 清单。使用 DNS 在某种程度上是分隔 Dev/QA/Prod 环境的标准方法。

    【讨论】:

    • 嘿尤金,我仍然无法解决问题。我尝试给不同的主机,但我仍然无法访问这两个命名空间的网站。 nginx 入口控制器正在 QA 中运行。
    • “不同的主机”是否意味着您使用cafe-qa.example.comcafe-dev.example.com?你能用你的新配置更新问题吗?
    • 还有一件事,我使用的是 Nginx 提供的 nginx-plus,而不是 kubernetes 提供的...所以它会支持这个功能吗?
    • 我不知道为什么。我有类似的 Ingress manifests,但我的工作完美无缺。不过我用的是 Traefik。您问题中的清单是否与您的部署中的清单完全相同?另外,您是否使用@radek-goblin-pieczonka 提供的教程部署了 nginx 入口控制器?
    • 嗨 Eugene,我想我遇到了问题,因为我使用的是 Nginx Inc 提供的入口控制器,而不是 kubernetes Nginx。我现在正在设置它。如果您有任何博客可以帮助我顺利设置 kuberenetes nginx ingress 的 nginx 控制器,请与我分享,因为官方文档(github)没有解释清楚。
    【解决方案3】:

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

    您只需将“--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
    

    【讨论】:

    • 你可以通过以下方式完成隔离: - 使用不同的命名空间(你有 devops-dev 和 devops-qa) - 每个命名空间使用不同的入口类: kubernetes.io/ingress.class: "nginx- dev" kubernetes.io/ingress.class: "nginx-qa" - 在入口部署 template.spec.containers.args 中使用 - "--watch-namespace=$(POD_NAMESPACE)" 这为我完成了这项工作。跨度>
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2020-07-04
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多