Kubernetes Ingress のリソースは、クラスタ外からクラスタ内の 1 つ以上のサービスに HTTP または HTTPS ルーティングを提供します。TKG クラスタは、Contour などのサードパーティ製コントローラを介した入力をサポートします。

このチュートリアルは、TKG クラスタ内のサービスに外部トラフィックをルーティングするための、Contour 入力方向コントローラをデプロイする方法を示しています。Contour は、VMware が参加しているオープンソース プロジェクトです。

前提条件

  • Kubernetes のドキュメントで、Ingressのリソースについて確認します。
  • Contour Ingress コントローラを確認します。
  • TKG クラスタをプロビジョニングします。
  • TKG クラスタに接続します。

手順

  1. ClusterRoleBinding を作成し、サービス アカウントでクラスタのすべてのリソースを管理できるようにします。
    kubectl create clusterrolebinding default-tkg-admin-privileged-binding 
    --clusterrole=psp:vmware-system-privileged --group=system:authenticated
    注: セキュリティを強化する必要がある場合は、 projectcontour 名前空間で RoleBinding を使用します。 TKG サービス クラスタへのデフォルトのポッド セキュリティ ポリシーの適用を参照してください。
  2. projectcontour という名前の名前空間を作成します。
    これが、Contour 入力方向コントローラのデプロイで使用するデフォルトの名前空間になります。
    kubectl create ns projectcontour
  3. Contour 入力方向コントローラの最新の YAML である Contour Ingress Deployment をダウンロードします。
  4. テキスト エディタで contour.yaml ファイルを開きます。
  5. 次の 2 つの行の前に # 記号を付加して、各行をコメントアウトします。
    行 1632:
    # service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    
    行 1634:
    # externalTrafficPolicy: Local
    
  6. contour.yaml ファイルを適用して Contour をデプロイします。
    kubectl apply -f contour.yaml
  7. Contour 入力方向コントローラと Envoy ロード バランサ サービスがデプロイされていることを確認します。
    kubectl get services -n projectcontour
    NAME      TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
    contour   ClusterIP      198.63.146.166   <none>          8001/TCP                     120m
    envoy     LoadBalancer   198.48.52.47     192.168.123.5   80:30501/TCP,443:30173/TCP   120m
  8. Contour および Envoy ポッドが実行中であることを確認します。
    kubectl get pods -n projectcontour
    NAME                       READY   STATUS      RESTARTS   AGE
    contour-7966d6cdbf-skqfl   1/1     Running     1          21h
    contour-7966d6cdbf-vc8c7   1/1     Running     1          21h
    contour-certgen-77m2n      0/1     Completed   0          21h
    envoy-fsltp                1/1     Running     0          20h
  9. 外部 IP アドレスを使用してロード バランサを ping します。
    ping 192.168.123.5
    PING 192.168.123.5 (192.168.123.5) 56(84) bytes of data.
    64 bytes from 192.168.123.5: icmp_seq=1 ttl=62 time=3.50 ms
    
  10. ingress-nihao.yaml という名前の入力方向リソースを作成します。
    YAML を作成します。
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-nihao
    spec:
      rules:
      - http:
          paths:
          - path: /nihao
            backend:
              serviceName: nihao
              servicePort: 80
    
    YAML を適用します。
    kubectl apply -f ingress-nihao.yaml
    入力方向リソースが作成されたことを確認します。
    kubectl get ingress
    入力方向オブジェクトでは、Envoy LoadBalancer の外部 IP アドレス(この例では 192.168.123.5)が使用されます。
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       192.168.123.5     80      17s
  11. バックエンド アプリケーションを使用してテスト サービスをデプロイします。
    ingress-nihao-test.yaml という名前の YAML ファイルを作成します。
    kind: Service
    apiVersion: v1
    metadata:
      name: nihao
    spec:
      selector:
        app: nihao
        tier: backend
      ports:
      - protocol: TCP
        port: 80
        targetPort: http
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nihao
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nihao
          tier: backend
          track: stable
      template:
        metadata:
          labels:
            app: nihao
            tier: backend
            track: stable
        spec:
          containers:
            - name: nihao
              image: "gcr.io/google-samples/hello-go-gke:1.0"
              ports:
                - name: http
                  containerPort: 80
    
    YAML を適用します。
    kubectl apply -f ingress-nihao-test.yaml
    nihao サービスが作成されたことを確認します。
    kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    nihao        ClusterIP   10.14.21.22     <none>        80/TCP     15s
    
    バックエンド デプロイが作成されたことを確認します。
    kubectl get deployments
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nihao   3/3     3            3           2m25s
    
    バックエンド ポッドが存在することを確認します。
    kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nihao-8646584495-9nm8x   1/1     Running   0          106s
    nihao-8646584495-vscm5   1/1     Running   0          106s
    nihao-8646584495-zcsdq   1/1     Running   0          106s
  12. Contour 入力方向コントローラで使用されるロード バランサのパブリック IP アドレスを取得します。
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       10.19.14.76     80      13m
  13. ブラウザを使用してパブリック IP アドレスに移動し、Ingress のパスを含めます。
    http://10.19.14.76/nihao
    「hello」というメッセージが返されます。
    {"message":"Hello"}

結果

クラスタ内で実行されているサービスの背後にあるバックエンド アプリケーションに外部からアクセスするには、ロード バランサの外部 IP アドレスを使用して、Ingress コントローラを介してブラウザからアクセスします。