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を解決できませんでした。すべてのポッドが実行されているため、問題が何なのかわかりません。問題が何であるかについてのヒントを教えてください。
ありがとう
イングレスルールを作成する前に、次のコマンドで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
Deployment
には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
これらのファイルを適用して、ポッド、サービス、およびイングレスルールを作成します。少し待ってください。イングレスルールのアドレスを取得するのに少し時間がかかります。 これで、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
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
公式として document say:
NodePortサービスは定義によって割り当てられたLoadBalancerIPを取得しないため、NGINX Ingressコントローラーは管理するIngressオブジェクトのステータスを更新しません
インストールガイドの説明に従って、NGINX Ingressコントローラーを展開したので、ADDRESSが空だったのは正常です!
代わりに、外部クライアントはingress-nginxサービスに割り当てられたNodePortをHTTP要求に追加する必要があります。
追伸この質問はミニクベに関するものではありません