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
サービスへのアクセスが可能になります。
安全なルーティングサービスの設定
複数の証明書の管理は、お使いのサービスへのセキュリティ保護の提供によりサポートされます。
- お使いのサービスの証明書を準備します。
利用できる証明書がない場合、テスト用の証明書を以下の方法で生成します。
注 ドメイン名は、お使いの 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
- 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
- ドメイン名をベースにしたシンプルなファンアウトルーティングの解説に従い、
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. 以下の yml コードを
nginx-ingress.yml
ファイルにセーブします。apiVersion: extensions/v1beta1 kind: Ingress metadata: name: simple spec: rules: - http: paths: - path: /svc backend: serviceName: http-svc servicePort: 80
- Container Service コンソールにログインします。 Kubernetes で、左側のナビゲーションウィンドウから [クラスター] をクリックします。 クラスターの右側の [ダッシュボード] をクリックし、Kubernetes ダッシュボードに移動します。
- 右上角の [作成] をクリックし、アプリケーションを作成します。
- [ファイルから作成] タブをクリックします。 セーブした
nginx-ingress.yml
ファイルを選択します。 - [アップロード] をクリックします。
これで、
http-svc
サービスへ Ingress Layer-7 プロキシルートが作成されます。 - 左側のナビゲーションウィンドウの、[名前空間] から [デフォルト] をクリックします。 左側のナビゲーションウィンドウから [Ingress] をクリックします。
作成された Ingress リソース、およびアクセスアドレス
http://118.178.174.161/svc
が参照できます。 - ブラウザにアドレスを入力し、作成された
http-svc
サービスにアクセスします。