Kubernetes Ingress のリソースは、クラスタ外からクラスタ内の 1 つ以上のサービスに HTTP または HTTPS ルーティングを提供します。TKG クラスタは、NGINX などのサードパーティ製コントローラを介した入力をサポートします。
このチュートリアルは、Tanzu Kubernetes クラスタ内のサービスに外部トラフィックをルーティングする際に、NGINX に基づく Kubernetes Ingress サービスをデプロイする方法を示しています。Ingress サービスには Ingress コントローラが必要です。NGINX Ingress Controller は、Helm を使用してインストールします。Helm は Kubernetes のパッケージ マネージャです。
注: このタスクを実行する方法はいくつかあります。ここに記載されている手順では、1 つの方法を示します。環境によっては、他の方法が適している場合があります。
前提条件
- Kubernetes のドキュメントで、Ingressのリソースについて確認します。
- NGINX Ingress Controller のドキュメントを確認してください。
- TKG クラスタをプロビジョニングします。
- 必要に応じてポッド セキュリティ ポリシーを有効にします。
- TKG クラスタに接続します。
手順
- Helm ドキュメントを参照して、Helm をインストールします。
- Helm を使用して NGINX Ingress Controller をインストールします。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx
- NGINX Ingress Controller が LoadBalancer タイプのサービスとしてデプロイされていることを確認します。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.16.18.20 10.19.14.76 80:30635/TCP,443:30873/TCP 59m
ingress-nginx-controller-admission ClusterIP 10.87.41.25 <none> 443/TCP 59m
- 外部 IP アドレスを使用してロード バランサを ping します。
Pinging 10.19.14.76 with 32 bytes of data:
Reply from 10.19.14.76: bytes=32 time<1ms TTL=62
Reply from 10.19.14.76: bytes=32 time=1ms TTL=62
- NGINX Ingress Controller が実行されていることを確認します。
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7c6c46898c-v6blt 1/1 Running 0 76m
- Ingress ルールと
ingress-hello.yaml
という名前のパスを含む Ingress リソースを作成します。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-hello
spec:
rules:
- http:
paths:
- path: /hello
backend:
serviceName: hello
servicePort: 80
-
ingress-hello
リソースをデプロイします。
kubectl apply -f ingress-hello.yaml
ingress.networking.k8s.io/ingress-hello created
- Ingress リソースがデプロイされたことを確認します。
IP アドレスは Ingress コントローラの外部 IP アドレスにマッピングされることに注意してください。
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-hello <none> * 10.19.14.76 80 51m
- hello テスト アプリケーションおよび ingress-hello-test.yaml という名前のサービスを作成します。
kind: Service
apiVersion: v1
metadata:
name: hello
spec:
selector:
app: hello
tier: backend
ports:
- protocol: TCP
port: 80
targetPort: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 3
selector:
matchLabels:
app: hello
tier: backend
track: stable
template:
metadata:
labels:
app: hello
tier: backend
track: stable
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-go-gke:1.0"
ports:
- name: http
containerPort: 80
-
ingress-hello-test
リソースをデプロイします。
kubectl apply -f ingress-hello-test.yaml
service/hello created
deployment.apps/hello created
-
hello
デプロイを使用できることを確認します。
NAME READY UP-TO-DATE AVAILABLE AGE
hello 3/3 3 3 4m59s
ingress-nginx-controller 1/1 1 1 3h39m
- NGINX Ingress Controller によって使用されるロード バランサのパブリック IP アドレスを取得します。
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-hello <none> * 10.19.14.76 80 13m
- ブラウザを使用してパブリック IP アドレスに移動し、Ingress のパスを含めます。
「hello」というメッセージが返されます。
{"message":"Hello"}
結果
クラスタ内で実行されているサービスの背後にあるバックエンド アプリケーションに外部からアクセスするには、ロード バランサの外部 IP アドレスを使用して、Ingress コントローラを介してブラウザからアクセスします。