一千萬個為什麽

搜索

如何從不同的yml定義向Kubernetes NGINX Ingress控制器添加規則?



我正在嘗試使用NGINX Ingress實現具有扇出模式的Kubernetes集群,NGINX Ingress將流量路由到多個不同的主機和路徑到不同的微服務。每個微服務的代碼都托管在他們自己的Git倉庫中,包括kubernetes定義yml文件,它們分別為每個服務部署pod(部署)和服務。

考慮到將有一個Ingress將流量路由到所有不同的服務,其中(按照慣例或行業標準)應該存儲定義文件?我想在git repo中保留與單個微服務相關的Ingress規則,其余的代碼是。我並不特別想要為Ingress單獨的git repo。

是否可以在文件中僅定義Ingress規則的子集,然後將其“附加”到規則列表而不是覆蓋它們。

例如,我可以使用這兩個不同的定義來創建具有兩個規則的單個Ingress(基於具有相同的名稱):

FOO-入口-rules.yml </強>

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  tls:
    - hosts:
      - foo.bar.com
      secretName: tls-secret
  rules:
    - host: foo.bar.com
      http:
        paths:
        - path: /
          backend:
            serviceName: foo-web-svc
            servicePort: 80
        - path: /api
          backend:
            serviceName: foo-rest-svc
            servicePort: 80

巴茲-入口-rules.yml </強>

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  tls:
    - hosts:
      - baz.bar.com
      secretName: tls-secret
  rules:
    - host: baz.bar.com
      http:
        paths:
        - path: /
          backend:
            serviceName: baz-web-svc
            servicePort: 80
        - path: /api
          backend:
            serviceName: baz-rest-svc
            servicePort: 80

轉載註明原文: 如何從不同的yml定義向Kubernetes NGINX Ingress控制器添加規則?

一共有 3 個回答:

一方面,你有微服務與所有相關的配置(配置為代碼)+1,但另一方面,你想創建一個單點故障(SPOF)

考慮到將有一個Ingress路由流量   所有不同的服務,按照慣例或行業   標準)應該存儲定義文件嗎?

如果入口發生故障會怎樣?然後,所有的微服務都無法訪問。如何為每個微服務使用入口,即每個git repo一個入口文件?

我可以將這兩個不同的定義創建為單個   Ingress有兩條規則(基於同名)?

讓我們調查一下是否可能。

根據

https://kubernetes.io/docs/concepts/services-networking/ingress/

可以更新現有的入口yaml,然後運行 kubectl replace -f 。從微服務的角度來看,可以在每個git倉庫中存儲一個代碼段,例如:

- host: microservice01.domain.com
  http:
    paths:
    - backend:
        serviceName: ms01
        servicePort: 80
      path: /microservice01

並使用ssh手動或自動部署它,並將其與已部署的另一個入口文件合並

spec:
  rules:
  
  
  and so on and so on

一旦部署了微服務的片段,就運行 kubectl replace -f

我能夠通過首先將它們轉換為JSON來組合您的兩個示例文件。

foo.json </強>

{
  "apiVersion": "extensions/v1beta1",
  "kind": "Ingress",
  "metadata": {
    "name": "nginx-ingress"
  },
  "spec": {
    "tls": [
      {
        "hosts": [
          "foo.bar.com"
        ],
        "secretName": "tls-secret"
      }
    ],
    "rules": [
      {
        "host": "foo.bar.com",
        "http": {
          "paths": [
            {
              "path": "/",
              "backend": {
                "serviceName": "foo-web-svc",
                "servicePort": 80
              }
            },
            {
              "path": "/api",
              "backend": {
                "serviceName": "foo-rest-svc",
                "servicePort": 80
              }
            }
          ]
        }
      }
    ]
  }
}

baz.json </強>

{
  "apiVersion": "extensions/v1beta1",
  "kind": "Ingress",
  "metadata": {
    "name": "nginx-ingress"
  },
  "spec": {
    "tls": [
      {
        "hosts": [
          "baz.bar.com"
        ],
        "secretName": "tls-secret"
      }
    ],
    "rules": [
      {
        "host": "baz.bar.com",
        "http": {
          "paths": [
            {
              "path": "/",
              "backend": {
                "serviceName": "baz-web-svc",
                "servicePort": 80
              }
            },
            {
              "path": "/api",
              "backend": {
                "serviceName": "baz-rest-svc",
                "servicePort": 80
              }
            }
          ]
        }
      }
    ]
  }
}

然後,您可以使用 jq 組合每個規則。

[email protected]:~$ jq 'reduce inputs as $i (.; .spec.rules += $i.spec.rules)' foo.json baz.json
{
  "apiVersion": "extensions/v1beta1",
  "kind": "Ingress",
  "metadata": {
    "name": "nginx-ingress"
  },
  "spec": {
    "tls": [
      {
        "hosts": [
          "foo.bar.com"
        ],
        "secretName": "tls-secret"
      }
    ],
    "rules": [
      {
        "host": "foo.bar.com",
        "http": {
          "paths": [
            {
              "path": "/",
              "backend": {
                "serviceName": "foo-web-svc",
                "servicePort": 80
              }
            },
            {
              "path": "/api",
              "backend": {
                "serviceName": "foo-rest-svc",
                "servicePort": 80
              }
            }
          ]
        }
      },
      {
        "host": "baz.bar.com",
        "http": {
          "paths": [
            {
              "path": "/",
              "backend": {
                "serviceName": "baz-web-svc",
                "servicePort": 80
              }
            },
            {
              "path": "/api",
              "backend": {
                "serviceName": "baz-rest-svc",
                "servicePort": 80
              }
            }
          ]
        }
      }
    ]
  }
}

雖然yaml更常見,但JSON對Kubernetes API完全有效。 jq邏輯的所有功勞都歸功於@Jeff Mercado和他的答案