web-dev-qa-db-ja.com

Kubernetes NGINX-INGRESS NGINXサービスを実行する必要がありますか?

NGINX-INGRESSを作成しようとしています(最初はローカルで、次にロードバランサーの背後でAWSにデプロイされます)。ただし、私はKubernetesを初めて使用し、NGINXのIngressモデルを理解しています。NGINX-INGRESSServiceIngressまたはBoth

パスでルーティングしたい複数のFlask-Appsを使用しています(/users/contentなど)。サービスの名前はuser-serviceport: 8000(それらのコンテナー)です。ポートも8000です)

this の例では、Ingressが定義されています。ただし、(Flaskと同じ名前空間に)入力を適用すると、http://localhostからの応答がありません。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
spec:
  rules:
  - http:
      paths:
      - path: /users
        backend:
          serviceName: users-service 
          servicePort: 8000
      - path: /content
        backend:
          serviceName: content-service 
          servicePort: 8000

さらに、Docker for Macの下で nginx-ingress "Deployment"のドキュメントを確認します(これは、DockerをMacOS)それら サービスを定義 のように:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https

---

これは私には機能しているようです(「localhost」を開くと、NGINXが「見つかりません」と表示されますが、これは私の名前空間とは異なる名前空間のサービスであり、ポート80/443とサービスポートの間に関連付けはありません。 。

参考までに、ここに私の展開/サービス定義の1つを示します。

---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: users-service
    labels:
        app: users-service
    namespace: example
spec:
    replicas: 1
    selector:
        matchLabels:
            app: users-service
    template:
        metadata:
            labels:
                app: users-service
        spec:
            containers:
                - name: users-service
                  image: users-service:latest
                  imagePullPolicy: Never
                  ports:
                  - containerPort: 8000
---
kind: Service
apiVersion: v1
metadata:
  name: users-service
spec:
  selector:
    app: users-service
  ports:
  - protocol: TCP
port: 8000

更新

NGINX-Controller + Ingressを設定するためのビデオをたどりましたが、ここでは「localhost/users」と入力しても機能しません。

describe-ingress:

(base) MacBook-Pro-2018-i9:microservices jordanbaucke$ kubectl describe ingress users-ingress
Name:             users-ingress
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /users   users-service:8000 (10.1.0.75:8000)
Annotations:  Events:  <none>

ユーザーサービス:

(base) MacBook-Pro-2018-i9:microservices jordanbaucke$ kubectl describe svc users-service
Name:              users-service
Namespace:         default
Labels:            <none>
Annotations:       Selector:  app=users-service
Type:              ClusterIP
IP:                10.100.213.229
Port:              <unset>  8000/TCP
TargetPort:        8000/TCP
Endpoints:         10.1.0.75:8000
Session Affinity:  None
Events:            <none>

nginx-ingress

(base) MacBook-Pro-2018-i9:microservices jordanbaucke$ kubectl describe svc nginx-ingress
Name:                     nginx-ingress
Namespace:                default
Labels:                   <none>
Annotations:              Selector:  name=nginx-ingress
Type:                     NodePort
IP:                       10.106.167.181
LoadBalancer Ingress:     localhost
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  32710/TCP
Endpoints:                10.1.0.74:80
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  32240/TCP
Endpoints:                10.1.0.74:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

NodeIP:NodePort/usersの組み合わせを入力しようとすると、接続しませんか?

nginx-ingressポッド内から、次のように呼び出します。

curl 10.1.0.75:8000またはcurl 10.100.213.229:8000は結果を返します。

1
jordan.baucke

Nginxまたはその他のイングレスが正しく動作するようにするには:

  1. Nginxイングレスコントローラーはクラスターにデプロイする必要があります
  2. LoadBalancerまたはNodePortタイプのサービスを作成して、nginx入力コントローラーがデプロイされているのと同じ名前空間でポート80および443を介してnginx入力コントローラーを公開する必要があります。LoadBalancerは、サポートされているパブリッククラウド(AWSなど)で機能します。ローカルで実行している場合、NodePortは機能します。
  3. ClusterIPタイプのサービスは、ワークロードポッドがデプロイされているネームスペースのワークロードポッドに対して作成する必要があります。
  4. ワークロードポッドはnginxイングレスを介して公開され、ワー​​クロードポッドのclusterIPサービスと同じ名前空間にイングレスリソースを作成する必要があります。
  5. LoadBalancer(nginxイングレスコントローラーがLoadBalancerを介して公開された場合)またはNodeIP:NodePort(NginxイングレスコントローラーがNodePortを介して公開された場合)を使用して、ワークロードポッドにアクセスします。

したがって、この場合、Dockerデスクトップがロードバランサータイプのサービス(ingress-nginx)を使用してnginxイングレスコントローラーを公開しているため、機能しません。これはNodePortタイプである必要があります。完了すると、ワークロードポッドにNodeIP:NodePort/usersおよびNodeIP:NodePort/contentを介してアクセスできます。 NodeIP:NodePortもnginxホームページを提供する必要があります。

3
Arghya Sadhu