Kubernetes クラスターでは、Ingress はクラスターサービスへのインバウンド接続を許可するルールのコレクションで、Layer-7 Server Load Balancer 機能を提供します。 Ingress コレクションを、外部にアクセス可能な URL、Server Load Balancer、SSL および名前ベースの仮想ホストに提供することができます。

前提条件

複雑なルーティングサービスのテストのために、このページの例では Nginx アプリケーションを作成します。 ルーティングの効果を監視するため、事前にNginx デプロイのおよび複数のサービスの作成が必要です。 実際のテストでは、お使いのサーバーに置き換えて、お使いのサーバーを入力します。

root@master # kubectl run nginx --image=registry.cn-hangzhou.aliyuncs.com/acs/netdia:latest

root@master # kubectl expose deploy nginx --name=http-svc --port=80 --target-port=80
root@master # kubectl expose deploy nginx --name=http-svc1 --port=80 --target-port=80
root@master # kubectl expose deploy nginx --name=http-svc2 --port=80 --target-port80
root@master # kubectl expose deploy nginx --name=http-svc3 --port=80 --target-port=80

シンプルなルーティングサービス

シンプルな Ingress サービスを以下のコマンドにより作成します。 /svc path へのすべてのアクセスは Nginx サービスへルーティングされます。 nginx.ingress.kubernetes.io/rewrite-target: / はパス /svc をバックエンドサーバーにより認識されるパス / へリダイレクトします。

root@master # cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /svc
        backend:
          serviceName: http-svc
          servicePort: 80
EOF
root@master # kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
simple * 101.37.192.211 80 11s

http://101.37.192.211/svcに移動すると Nginx サーバにアクセスできます。

ドメイン名をベースにしたシンプルなファンアウトルーティング

異なる外部サービスに対して複数のドメイン名がある場合、以下の設定をすることにより、ドメイン名をベースにしたシンプルなファンアウト効果を実行できます。

root@master #cat <<EOF | kubectl create -f - 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple-fanout
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: http-svc1
          servicePort: 80
      - path: /bar
        backend:
          serviceName: http-svc2
          servicePort: 80
  - host: foo.example.com
    http:
      paths:
      - path: /film
        backend:
          serviceName: http-svc3
          servicePort: 80    
EOF
root@master # kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
simple-fanout * 101.37.192.211 80 11s

これで、http://foo.bar.com/foo を利用した http-svc1 サービスへのアクセス、http://foo.bar.com/bar を利用した http-svc2 へのアクセス、およびhttp://foo.example.com/film を利用した http-svc3 へのアクセスが可能です。

  • 本番環境では、ドメイン名を前出の返されたアドレス 101.37.192.211 を指します。
  • テスト環境では、hosts ファイルを変更してドメイン名マッピングルールを追加してください。
    101.37.192.211 foo.bar.com
    101.37.192.211 foo.example.com

シンプルルーティングのデフォルトドメイン名

ドメイン名がなくても問題ありません。 Container Service によりデフォルトドメイン名が Ingress サービスからバインドされます。 サービスへのアクセスにデフォルトドメイン名を使用できます。 ドメイン名は*.[cluster-id].[region-id].alicontainer.com の形式で表されます。 コンソール上のクラスター基本情報ページからアドレスを取得できます。

以下の設定を使って、2 つのサービスをデフォルトドメイン名内に公開します。

root@master # cat <<EOF | kubectl create -f - 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: shared-dns
spec:
  rules:
  - host: foo.[cluster-id].[region-id].alicontainer.com ## お使いのクラスターのデフォルトサービスアクセスドメイン名に置き換えます。
    http:
      paths:
      - path: /
        backend:
          serviceName: http-svc1
          servicePort: 80
  - host: bar.[cluster-id].[region-id].alicontainer.com ## お使いのクラスターのデフォルトサービスアクセスドメイン名に置き換えます。
    http:
      paths:
      - path: /
        backend:
          serviceName: http-svc2
          servicePort: 80    
EOF
root@master # kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
shared-dns foo.[cluster-id].[region-id].alicontainer.com,bar.[cluster-id].[region-id].alicontainer.com 47.95.160.171 80 40m

これで、http://foo.[cluster-id].[region-id].alicontainer.com/ を使用して http-svc1 サービスへのアクセス、および http://bar.[cluster-id].[region-id].alicontainer.com を利用して http-svc2 サービスへのアクセスが可能になります。

安全なルーティングサービスの設定

複数の証明書の管理は、お使いのサービスへのセキュリティ保護の提供によりサポートされます。

  1. お使いのサービスの証明書を準備します。

    利用できる証明書がない場合、テスト用の証明書を以下の方法で生成します。

    ドメイン名は、お使いの Ingress 設定と一致している必要があります。
    root@master # openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"

    上記のコマンドにより、証明書ファイル tls.crt および、秘密鍵ファイル tls.key が生成されます。

    foo.bar という名称の Kubernetes シークレットを作成し、証明書と秘密鍵を使用します。 Ingress 作成時に、シークレットが参照されている必要があります。

    root@master # kubectl create secret tls foo.bar --key tls.key --cert tls.crt
  2. 1. 安全な Ingress サービスの作成
    root@master # cat <<EOF | kubectl create -f - 
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: tls-fanout
    spec:
      tls:
      - hosts:
        - foo.bar.com
        secretName: foo.bar
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /foo
            backend:
              serviceName: http-svc1
              servicePort: 80
          - path: /bar
            backend:
              serviceName: http-svc2
              servicePort: 80
    EOF
    root@master # kubectl get ing
    NAME HOSTS ADDRESS PORTS AGE
    tls-fanout * 101.37.192.211 80 11s
  3. ドメイン名をベースにしたシンプルなファンアウトルーティングの解説に従い、hosts ファイルの設定、または TLS サービスへアクセスするドメイン名を設定します。

    http://foo.bar.com/foo を使用した http-svc1 サービスへのアクセス、および http://foo.bar.com/bar を使用した http-svc2 サービスへのアクセスが可能になります。

    HTTP を使用した HTTPS サービスへのアクセスも可能です。 デフォルトでは、Ingress は HTTPS により設定した HTTP アクセスを HTTPS アドレスにリダイレクトします。 そのため、http://foo.bar.com/foo へのアクセスは自動的に https://foo.bar.com/foo へリダイレクトされます。

Kubernetes ダッシュボードでの Ingress のデプロイ

  1. 1. 以下の yml コードを nginx-ingress.yml ファイルにセーブします。
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: simple
    spec:
      rules:
      - http:
          paths:
          - path: /svc
            backend:
              serviceName: http-svc
              servicePort: 80
  2. Container Service コンソールにログインします。 Kubernetes で、左側のナビゲーションウィンドウから [クラスター] をクリックします。 クラスターの右側の [ダッシュボード] をクリックし、Kubernetes ダッシュボードに移動します。
  3. 右上角の [作成] をクリックし、アプリケーションを作成します。
  4. [ファイルから作成] タブをクリックします。 セーブした nginx-ingress.yml ファイルを選択します。
  5. [アップロード] をクリックします。

    これで、http-svc サービスへ Ingress Layer-7 プロキシルートが作成されます。

  6. 左側のナビゲーションウィンドウの、[名前空間] から [デフォルト] をクリックします。 左側のナビゲーションウィンドウから [Ingress] をクリックします。
    作成された Ingress リソース、およびアクセスアドレス http://118.178.174.161/svc が参照できます。
  7. ブラウザにアドレスを入力し、作成された http-svc サービスにアクセスします。