web-dev-qa-db-ja.com

空のアドレスkubernetesイングレス

Kubernetesクラスターでイングレスを設定しようとしました。 documentation に従って入力コントローラーをインストールし、次のコマンドを実行しました

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml

Default-http-backendとnginx-ingress-controllerが実行された後:

ingress-nginx   default-http-backend-846b65fb5f-6kwvp      1/1       Running   0          23h       192.168.2.28   node1
ingress-nginx   nginx-ingress-controller-d658896cd-6m76j   1/1       Running   0          6m        192.168.2.31   node1

イングレスをテストして、次のサービスを展開しました。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echoserver-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
        - name: my-echo
          image: gcr.io/google_containers/echoserver:1.8
---
apiVersion: v1
kind: Service
metadata:
  name: echoserver-svc
spec:
  selector:
    app: echo
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

そして、次のイングレス:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: happy-ingress
  annotations:
    INGRESS.kubernetes.io/rewrite-target: /
spec:
  rules:
    - Host: happy.k8s.io
      http:
        paths:
          - path: /echoserver
            backend:
              serviceName: echoserver-svc
              servicePort: 8080

「kubectl get ing」コマンドを実行すると、次のメッセージが表示されます。

NAME            HOSTS          ADDRESS   PORTS     AGE
happy-ingress   happy.k8s.io             80        14m

ADDRESSを解決できませんでした。すべてのポッドが実行されているため、問題が何なのかわかりません。問題が何であるかについてのヒントを教えてください。

ありがとう

15
Dorin

イングレスルールを作成する前に、次のコマンドでingress addonsを有効にする必要があります。他のコマンドを実行する前に有効にすることもできます

$ minikube addons enable ingress
ingress was successfully enabled

ポッドが稼働するまで待ちます。次のコマンドを実行して確認し、同様の出力を待つことができます

kubectl get pods -n kube-system | grep nginx-ingress-controller

nginx-ingress-controller-5984b97644-jjng2   1/1       Running   2          1h

enter image description hereDeploymentにはcontainerPortを指定する必要があり、Serviceにはhttpプロトコルを指定する必要があります。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: echoserver-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-echo
  template:
    metadata:
      labels:
        app: my-echo
    spec:
      containers:
        - name: my-echo
          image: gcr.io/kubernetes-e2e-test-images/echoserver:2.1
          ports:
          - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: echoserver-svc
spec:
  selector:
    app: my-echo
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    name: http

入力ルールの場合、ポートservicePortを8080からデフォルトのhttpポートに変更します。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: happy-ingress
  annotations:
    INGRESS.kubernetes.io/rewrite-target: /
spec:
  rules:
  - Host: happy.k8s.io
    http:
      paths:
      - path: /echoserver
        backend:
          serviceName: echoserver-svc
          servicePort: 80

これらのファイルを適用して、ポッド、サービス、およびイングレスルールを作成します。少し待ってください。イングレスルールのアドレスを取得するのに少し時間がかかります。 enter image description here これで、minikube ipアドレスを使用してサービスにアクセスできますが、ホスト名ではまだアクセスできません。そのためには、/etc/hostsファイルにホストとそれぞれのIPアドレスを追加する必要があります。お気に入りのエディターで/etc/hostsファイルを開き、以下の行を追加します。

<minikube_ip> happy.k8s.io

ここで、ホスト名を使用してサービスにアクセスします。次のコマンドであることを確認します

curl http://happy.k8s.io/echoserver

これが役立つかどうかはわかりませんが、同じ問題がありました。私はイングレスコントローラーをインストールしませんでしたし、Githubで誰かが言ったようなものは何もインストールしませんでした。サブドメインを別のサービスにポイントできるようにイングレスを作成しましたが、最初はイングレスにIPアドレスがありませんでした(空でした)。

NAME      HOSTS                            ADDRESS   PORTS   AGE
ingress   delivereo.tk,back.delivereo.tk             80      39s

フロントエンドアプリとバックエンドAPIの2つのサービスのタイプがLoadBalancerだったからだと思います。イングレスコントローラがどのURLをどこに移動するかを管理するようになったため、外部IPを必要としないため、NodePortに変更しました。

そして、サービスのタイプをNodePortに変更したとき、2〜3分後にIngressのIPアドレスが表示されました。 Cloudflare DNSに新しいIngress IPを指定すると、サブドメインをテストし、機能しました!

apiVersion: v1
kind: Service
metadata:
  name: delivereotk
spec:
  ports:
    - port: 80
  selector:
    app: delivereotk
  type: LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: delivereotk
spec:
  ports:
    - port: 80
  selector:
    app: delivereotk
  type: NodePort

イングレス

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - Host: delivereo.tk
    http:
      paths:
        - backend:
            serviceName: delivereotk
            servicePort: 80
  - Host: back.delivereo.tk
    http:
      paths:
        - backend:
            serviceName: backdelivereotk
            servicePort: 80
3

hostname happy.k8s.ioは、ロードバランサーの前面を指すnginx-ingress-controllerの実際のIPアドレスに解決される必要があります。

クラスターが動作しているIPを確認できます。

bash-3.2$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.100:8443
KubeDNS is running at https://192.168.1.100:8443/api/v1/namespaces/kube- 
system/services/kube-dns:dns/proxy

curlを使用してクラスターの入力コントローラーをテストします

bash-3.2$ curl http://192.168.1.100:8080
default backend - 404

最後に、ドメインエントリを/etc/hostsに追加するだけです。

192.168.1.100   happy.k8s.io
2
Crou

公式として document say:

NodePortサービスは定義によって割り当てられたLoadBalancerIPを取得しないため、NGINX Ingressコントローラーは管理するIngressオブジェクトのステータスを更新しません

インストールガイドの説明に従って、NGINX Ingressコントローラーを展開したので、ADDRESSが空だったのは正常です!

代わりに、外部クライアントはingress-nginxサービスに割り当てられたNodePortをHTTP要求に追加する必要があります。

追伸この質問はミニクベに関するものではありません

0
Dylan Lai