コンテンツにスキップ

IstioOperator@Istio

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. セットアップ

インストール

▼ チャートとして

チャートリポジトリからチャートをインストールし、Kubernetesリソースを作成する。

プロファイルは、設定済みのIstioOperatorのチャートであり、istioctlコマンドインストール時にmanifestsディレクトリ以下に同梱される。

(1)

istioctlコマンドでIstioOperatorを指定する。IstioOperatorは、デフォルトでistio-systemにIstioリソースを作成するようになっている。

$ istioctl operator init

Installing operator controller in namespace: istio-operator using image: docker.io/istio/operator:<リビジョン番号>
Operator controller will watch namespaces: istio-system
✅ Istio operator installed
✅ Installation complete
(2)

IstioOperatorが定義されたマニフェストを、istioctlコマンドまたはkubectlコマンドを使用して、Istioリソースを作成する。

その代わりにここで、IstioOperatorにHelmを使用させてIstioリソースを作成することもできる。kubectl applyコマンドでも作成できるが、成否の実行ログがわかりにくいことに注意する。

# istioctlコマンド
$ istioctl install -y -f ./istio-operator.yaml

✅ Istio core installed
✅ Istiod installed
✅ Ingress gateways installed
✅ Installation complete
Making this installation the default for injection and validation.
# kubectlコマンド
$ kubectl apply -f istio-operator.yaml

istiooperator.install.istio.io/istio-operator created

▼ チャートとして

チャートリポジトリからチャートをインストールし、Kubernetesリソースを作成する。

チャートは、istioctlコマンドインストール時のmanifestsディレクトリ以下に同梱されている。

$ helm install <Helmリリース名> manifests/charts/istio-operator -n istio-operator --version <バージョンタグ>


02. metadata

.metadata.name

リソース名はistio-operatorとする必要がある。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator


03. spec

.spec.component

▼ componentとは

IstioOperator管理でIstioリソースを作成する。

<component名>.k8s

各componentが共通的に持つ設定項目である。

各種Kubernetesリソースと同じ設定値を拡張機能として設定できる。

ただし、執筆時点 (2022/06/04) では、これを使用することは非推奨である。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    <component名>:
      enabled: "true"
      k8s:
        # HorizontalPodAutoscaler
        hpaSpec:
          maxReplicas: 10
          minReplicas: 2 # componentを冗長化する
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                    - key: node.kubernetes.io/nodetype
                      operator: In
                      # meshというNodeグループにスケジューリングさせられるようにする。
                      values:
                        - mesh

▼ base

baseコンポーネントのオプションを設定する。

baseコンポーネントを有効化しないと、カスタムリソースを作成できない。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    base:
      enabled: "true"

▼ cni

istio-cniコンポーネントのオプションを設定する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    cni:
      enabled: "true"
      namespace: kube-system

▼ egressGateways

egressGatewaysコンポーネントのオプションを設定する。

Istio EgressGatewayを直接的に作成するのではなく、IstioOperatorに作成させる。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    egressGateways:
      - name: istio-egressgateway
        enabled: "true"

▼ ingressGateways

ingressGatewaysコンポーネントのオプションを設定する。

Istio IngressGatewayを直接的に作成するのではなく、IstioOperatorに作成させる。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: "true"

.spec.ingressGateways.k8sキーでIstio IngressGatewayを設定できるが、これは非推奨である。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: "true"
        k8s:
          service:
            ports:
              - name: http
                port: 80
                protocol: TCP
                targetPort: 80

補足として、以下の方法でユーザー定義のIstio IngressGatewayを作成できる (かなり大変) 。

最終的な設定値は、kubectl getコマンドで確認できる。

$ kubectl get service istio-ingressgateway -o yaml -n istio-system
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {...} # ここにも、.json形式で設定値が記載されている。
  creationTimestamp: "2022-01-01T12:00:00Z"
  labels:
    app: istio-ingressgateway
    install.operator.istio.io/owning-resource: istio-operator
    install.operator.istio.io/owning-resource-namespace: istio-system
    istio: ingressgateway
    istio.io/rev: default
    operator.istio.io/component: IngressGateways
    operator.istio.io/managed: Reconcile
    operator.istio.io/version: 1.12.1
    release: istio
  name: istio-ingressgateway
  namespace: istio-system
spec:
  allocateLoadBalancerNodePorts: "true"
  clusterIP: *.*.*.*
  clusterIPs:
  - *.*.*.*
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http2
    nodePort: 30548
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: status-port
    nodePort: 31817
    port: 15021
    protocol: TCP
    targetPort: 15021
  - name: https
    nodePort: 32016
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: *.*.*.*

▼ istiodRemote

istiodコンポーネントのオプションを設定する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    istiodRemote:
      enabled: "false"

▼ pilot

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  components:
    pilot:
      enabled: "true"


.spec.defaultRevision

▼ defaultRevisionとは

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  defaultRevision: "true"


.spec.hub

▼ hubとは

Istioリソースを構成するコンテナのベースイメージのレジストリを設定する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  hub: docker.io/istio


.spec.namespace

▼ namespaceとは

IstioOperator管理で作成されるIstioリソースのNamespaceを設定する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  namespace: foo-namespace


.spec.profile

▼ profileとは

プロファイルを設定する。

実際には設定済みのIstioOperatorである。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  profile: default


.spec.revision

▼ revisionとは

Istiodコントロールプレーンをカナリアリリースを使用してアップグレードする場合、新しく作成するバージョンを設定する。

バージョンの表記方法がハイフン繋ぎであることに注意する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  revision: 1-10-0 # ハイフン繋ぎのバージョン表記


.spec.tag

▼ tagとは

Istioリソースを構成するコンテナのベースイメージのバージョンを設定する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  tag: 1.12.1


.spec.values

▼ valuesとは

manifests/charts/global.yamlファイルの設定値を上書きする。

▼ base

valuesファイルのbaseの項目を上書きする。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  values:
    base:
      enableCRDTemplates: "false"
      validationURL: ""

▼ gateways.istio-egressgateway

valuesファイルのistio-egressgatewayの項目を上書きする。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  values:
    gateways:
      # Istio EgressGateway
      istio-egressgateway:
        env: {}
        autoscaleEnabled: "true"
        type: ClusterIP
        name: istio-egressgateway
        secretVolumes:
          - name: egressgateway-certs
            secretName: istio-egressgateway-certs
            mountPath: /etc/istio/egressgateway-certs
          - name: egressgateway-ca-certs
            secretName: istio-egressgateway-ca-certs
            mountPath: /etc/istio/egressgateway-ca-certs

▼ gateways.istio-ingressgateway

valuesファイルのistio-ingressgatewayの項目を上書きする。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  values:
    gateways:
      # Istio IngressGateway
      istio-ingressgateway:
        env: {}
        # IstioOperatorをroot権限の実行ユーザーを使用する
        runAsRoot: "true"
        autoscaleEnabled: "true"
        type: LoadBalancer
        name: istio-ingressgateway
        secretVolumes:
          - name: ingressgateway-certs
            secretName: istio-ingressgateway-certs
            mountPath: /etc/istio/ingressgateway-certs
          - name: ingressgateway-ca-certs
            secretName: istio-ingressgateway-ca-certs
            mountPath: /etc/istio/ingressgateway-ca-certs

▼ pilot

valuesファイルのpilotの項目を上書きする。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  values:
    pilot:
      autoscaleEnabled: "true"
      autoscaleMin: 1
      autoscaleMax: 5
      replicaCount: 1
      image: pilot
      traceSampling: 1.0
      env: {}
      cpu:
        targetAverageUtilization: 80
      nodeSelector: {}
      keepaliveMaxServerConnectionAge: 30m
      enableProtocolSniffingForOutbound: "true"
      enableProtocolSniffingForInbound: "true"
      deploymentLabels:
      podLabels: {}
      configMap: "true"

▼ proxy_init

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  values:
    proxy_init:
    image: proxyv2
    resources:
      limits:
        cpu: 2000m
        memory: 1024Mi
      requests:
        cpu: 10m
        memory: 10Mi

▼ sidecarInjectorWebhook

istio-proxyコンテナごとのオプション値を設定する。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: istio-operator
spec:
  values:
    sidecarInjectorWebhook:
      templates:
        custom: |
          spec:
            containers:
            - name: istio-proxy
              ...