IstioOperatorを使ってIstioを導入する

AvatarPosted by

この記事は GRIPHONE Advent Calendar 2020 12日目の記事です。

こんにちは、SREの川野です。
今回はIsitoOperatorを使ってIstioを導入する方法についてご説明します。

IstioOperatorについて

IstioOperatorは、Istioの導入や更新のようなオペレーションを手動で行わずに管理することができます。

また、IstioOperator APIを使ってIstioの各コンポーネントのKubernetes設定を管理することができます。

https://github.com/istio/istio/tree/master/operator

IstioOperatorを使ったIstioの導入

ドキュメントにある手順に沿ってやっていきます。

1. Kubernetesクラスタを用意

任意のk8sクラスタを用意してください。今回はGKEでやろうと思います(Minikubeで試したところ2GBでしたがメモリ不足でIstioの導入ができませんでした)。

$ kubectl get nodes
NAME                                        STATUS   ROLES    AGE   VERSION
gke-istio-default-pool-546b6b03-02ft   Ready    <none>   17m   v1.16.15-gke.4300
gke-istio-default-pool-546b6b03-4njz   Ready    <none>   17m   v1.16.15-gke.4300
gke-istio-default-pool-546b6b03-k29j   Ready    <none>   17m   v1.16.15-gke.4300

2. IstioOperatorのチャートをローカルにダウンロード

こちらを参考に以下のようにIstioの最新リリースをダウンロードします。

curl -L https://istio.io/downloadIstio | sh -
cd istio-1.8.0/

バイナリやサンプルアプリケーションのマニフェストなどが含まれていて、今回使用したいIstioOperatorのチャートがあることが確認できます。

istio-1.8.0$ ls 
LICENSE       README.md     bin           manifest.yaml manifests     samples       tools
istio-1.8.0$ ls manifests/charts/
README-helm3.md    README.md          UPDATING-CHARTS.md base               gateways           global.yaml        istio-cni          istio-control      istio-operator     istiocoredns       istiod-remote

3. IstioOperatorを導入

先ほどダウンロードしたIstioOperatorのチャートをhelmを使ってインストールします。

istio-1.8.0$ helm install istio-operator manifests/charts/istio-operator \
  --set hub=docker.io/istio \
  --set tag=1.8.0 \
  --set operatorNamespace=istio-operator

少し待つとistio-operatorのリソースが作成されます。

$ kubectl get deploy,po -n istio-operator
NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-operator   1/1     1            1           2m26s

NAME                                  READY   STATUS    RESTARTS   AGE
pod/istio-operator-6f55bc86b7-pcz4z   1/1     Running   0          2m26s

4. Istioを導入

IstioOperatorリソースを使ってIstioを導入します。

まずネームスペースを作成します。

kubectl create ns istio-system

IstioOperatorでIstioをインストールするには、以下のマニフェストを作成して適用します。

$ cat istio.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio
spec:
  profile: default
kubectl apply -f istio.yaml

profile: default は、Istioが用意しているプロファイルの1つで、istiodとistio-ingressgatewayの2つのコンポーネントの設定マニフェストが含まれています。

(補足)istiodはIstioのコアコンポーネントの1つで、コントロールプレーンとしてistio-ingressgatewayなど他コンポーネントを制御する役割を持っています。Istioのアーキテクチャ図が参考になるかと思います。

しばらくするとistiodと、ingressgatewayが順番に作成されます。

$ kubectl get svc,deploy,po -n istio-system
NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                      AGE
service/istio-ingressgateway   LoadBalancer   10.52.10.219   34.85.24.84   15021:31081/TCP,80:32659/TCP,443:31093/TCP,15012:31977/TCP,15443:31447/TCP   2m20s
service/istiod                 ClusterIP      10.52.5.0      <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        2m30s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-ingressgateway   1/1     1            1           2m20s
deployment.apps/istiod                 1/1     1            1           2m31s

NAME                                        READY   STATUS    RESTARTS   AGE
pod/istio-ingressgateway-7d47447b67-c7rqx   1/1     Running   0          2m20s
pod/istiod-66bb7cb55c-vmjb7                 1/1     Running   0          2m30s

これでIstioOperatorを使ってIstioの導入を行うことができました。

今のままだとデフォルトの設定値になっているのでServiceやDeploymentリソースの設定をこちらのAPIリファレンスを参考にマニフェストに書き加えていくことでカスタマイズすることができます。

(例)components フィールドを追加してistio-ingressgatewayのDeploymentのReplicasの数を増やす

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio
spec:
  profile: default
  components:
    ingressGateways:
    - name: istio-ingressgateway
      k8s:
        replicaCount: 3
$ kubectl get deploy,po -n istio-system
NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-ingressgateway   3/3     3            3           6m24s
deployment.apps/istiod                 1/1     1            1           6m34s

NAME                                        READY   STATUS    RESTARTS   AGE
pod/istio-ingressgateway-7d47447b67-b69c7   1/1     Running   0          15s
pod/istio-ingressgateway-7d47447b67-c7rqx   1/1     Running   0          6m24s
pod/istio-ingressgateway-7d47447b67-f487r   1/1     Running   0          15s
pod/istiod-66bb7cb55c-vmjb7                 1/1     Running   0          6m34s

おわりに

いかがでしたでしょうか。IstioOperatorを使ってIstioの導入が簡単にできるのを確認していただけたかと思います。

是非参考にしていただけると嬉しいです。