はじめに
Istioをインストールするとロードバランサとして外部向けのServiceが展開され、そこを経由して各Serviceに割り振ることができます。
今回は自前のIngress経由ではなくistio-system
にできているingressgateway経由してClusterIPへのアクセスを通す流れについて説明します。
環境情報
- IKS v1.18.13
- Debian GNU/Linux 9
- istio-1.8.1
インストール後の状況確認
ロードバランサが以下のように起動していて
$ kubectl get service istio-ingressgateway -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer XX YY 80:xx/TCP,443:xx/TCP,xx:xx/TCP ...
中を見るとlabelにistio: ingressgateway
と記載があります。
apiVersion: v1 kind: Service ... spec: clusterIP: XX externalTrafficPolicy: Cluster ports: - name: status-port ... - name: http2 ... - name: https nodePort: ... port: 443 protocol: TCP targetPort: 8443 - name: tls ... selector: app: istio-ingressgateway istio: ingressgateway sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: YY
GatewayとVirtualServiceを作成
Gatewayとして以下のようにingressgatewayを指定した上で用意した上で
apiVersion: networking.istio.io/v1beta1 kind: Gateway ... name: istio-gateway namespace: istio-system ... spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: caCertificates: /etc/istio/ingressgateway-ca-certs/XX mode: SIMPLE privateKey: /etc/istio/ingressgateway-certs/XX serverCertificate: /etc/istio/ingressgateway-certs/XX
そのGatewayの情報とドメイン名とClusterIPを紐付けると
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: test-vs namespace: istio-system spec: hosts: - "test.hoge.com" gateways: - istio-gateway http: - match: - uri: prefix: / route: - destination: port: number: 5000 host: testsvc.testns.svc.cluster.local
istio-ingressgatewayの外部IPに向けて上記host名で接続しにいくと指定したServiceに通信が割り振られます。
終わりに
ホスト名とServiceを紐付けるのはIngressが担いますが、Istioの世界ではVirtualServiceが担います。
ちなみに外部からの通信はistio-ingressgatewayのDeploymentに紐づくPodに表示されるのでエラーが出た場合は同Podの調査が必要です。
以上です。