
この記事は 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の導入が簡単にできるのを確認していただけたかと思います。
是非参考にしていただけると嬉しいです。