Kubernetesクラスタのセットアップ

このモジュールでは、IstioがインストールされたKubernetesクラスタと、チュートリアル全体で使用する名前空間をセットアップします。

  1. Kubernetesクラスタにアクセスできることを確認してください。Google Kubernetes EngineまたはIBM Cloud Kubernetes Serviceを使用できます。

  2. チュートリアルコマンドを実行するときに使用する名前空間の名前を保存する環境変数を作成します。任意の名前(たとえば、tutorial)を使用できます。

    $ export NAMESPACE=tutorial
    
  3. 名前空間を作成します

    $ kubectl create namespace $NAMESPACE
    
  4. Istioをインストールする際は、demoプロファイルを使用してください。

  5. この例では、KialiPrometheusのアドオンを使用するため、インストールする必要があります。すべてのアドオンは以下のコマンドでインストールします。

    Zip
    $ kubectl apply -f @samples/addons@
    
  6. 以下のkubectlコマンドを使用して、これらの一般的なIstioサービス用のKubernetes Ingressリソースを作成します。このチュートリアルでは、現時点ではこれらの各サービスに精通している必要はありません。

    kubectlコマンドは、各サービスのIngressリソースを作成するために、インライン構成を受け入れることができます。

    $ kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: istio-system
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.class: istio
    spec:
      rules:
      - host: my-istio-dashboard.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: grafana
                port:
                  number: 3000
      - host: my-istio-tracing.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: tracing
                port:
                  number: 9411
      - host: my-istio-logs-database.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus
                port:
                  number: 9090
      - host: my-kiali.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kiali
                port:
                  number: 20001
    EOF
    
  7. istio-system名前空間への読み取りアクセスを提供するロールを作成します。このロールは、以下の手順で参加者の権限を制限するために必要です。

    $ kubectl apply -f - <<EOF
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: istio-system-access
      namespace: istio-system
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["*"]
      verbs: ["get", "list"]
    EOF
    
  8. 参加者ごとにサービスアカウントを作成します。

    $ kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    EOF
    
  9. 各参加者の権限を制限します。チュートリアル中、参加者は自分の名前空間にリソースを作成し、istio-system名前空間からリソースを読み取るだけで済みます。自分のクラスタを使用する場合でも、クラスタ内の他の名前空間に干渉しないようにすることが推奨されます。

    各参加者の名前空間への読み取り/書き込みアクセスを許可するロールを作成します。参加者のサービスアカウントを、このロールとistio-systemからリソースを読み取るためのロールにバインドします。

    $ kubectl apply -f - <<EOF
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ${NAMESPACE}-access
      namespace: $NAMESPACE
    rules:
    - apiGroups: ["", "extensions", "apps", "networking.k8s.io", "networking.istio.io", "authentication.istio.io",
                  "rbac.istio.io", "config.istio.io", "security.istio.io"]
      resources: ["*"]
      verbs: ["*"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ${NAMESPACE}-access
      namespace: $NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: ${NAMESPACE}-access
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: ${NAMESPACE}-istio-system-access
      namespace: istio-system
    subjects:
    - kind: ServiceAccount
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: istio-system-access
    EOF
    
  10. 各参加者は、独自のKubernetes構成ファイルを使用する必要があります。この構成ファイルは、クラスタの詳細、サービスアカウント、認証情報、参加者の名前空間を指定します。kubectlコマンドは、構成ファイルを使用してクラスタを操作します。

    参加者ごとにKubernetes構成ファイルを生成します。

    $ cat <<EOF > ./${NAMESPACE}-user-config.yaml
    apiVersion: v1
    kind: Config
    preferences: {}
    
    clusters:
    - cluster:
        certificate-authority-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
        server: $(kubectl config view -o jsonpath="{.clusters[?(.name==\"$(kubectl config view -o jsonpath="{.contexts[?(.name==\"$(kubectl config current-context)\")].context.cluster}")\")].cluster.server}")
      name: ${NAMESPACE}-cluster
    
    users:
    - name: ${NAMESPACE}-user
      user:
        as-user-extra: {}
        client-key-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}')
        token: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath={.data.token} | base64 --decode)
    
    contexts:
    - context:
        cluster: ${NAMESPACE}-cluster
        namespace: ${NAMESPACE}
        user: ${NAMESPACE}-user
      name: ${NAMESPACE}
    
    current-context: ${NAMESPACE}
    EOF
    
  11. ${NAMESPACE}-user-config.yaml構成ファイルのKUBECONFIG環境変数を設定します。

    $ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
    
  12. 現在の名前空間を出力して、構成が有効になったことを確認します。

    $ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}"
    tutorial
    

    出力に自分の名前空間の名前が表示されるはずです。

  13. 自分でクラスタをセットアップする場合は、前の手順で説明した${NAMESPACE}-user-config.yamlファイルを自分のローカルコンピュータにコピーします。ここで、${NAMESPACE}は前の手順で指定した名前空間の名前です。たとえば、tutorial-user-config.yamlのようになります。このファイルは後でチュートリアルで使用する必要があります。

    インストラクターの方は、生成された構成ファイルを各参加者に送信してください。参加者は、自分の構成ファイルをローカルコンピュータにコピーする必要があります。

おめでとうございます、チュートリアルのためのクラスタを構成しました!

これでローカルコンピュータの設定を行う準備ができました。

この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!