Kubernetesクラスタのセットアップ
このモジュールでは、IstioがインストールされたKubernetesクラスタと、チュートリアル全体で使用する名前空間をセットアップします。
Kubernetesクラスタにアクセスできることを確認してください。Google Kubernetes EngineまたはIBM Cloud Kubernetes Serviceを使用できます。
チュートリアルコマンドを実行するときに使用する名前空間の名前を保存する環境変数を作成します。任意の名前(たとえば、
tutorial
)を使用できます。$ export NAMESPACE=tutorial
名前空間を作成します
$ kubectl create namespace $NAMESPACE
Istioをインストールする際は、
demo
プロファイルを使用してください。この例では、KialiとPrometheusのアドオンを使用するため、インストールする必要があります。すべてのアドオンは以下のコマンドでインストールします。
$ kubectl apply -f @samples/addons@
以下の
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
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
参加者ごとにサービスアカウントを作成します。
$ kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: ${NAMESPACE}-user namespace: $NAMESPACE EOF
各参加者の権限を制限します。チュートリアル中、参加者は自分の名前空間にリソースを作成し、
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
各参加者は、独自の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
${NAMESPACE}-user-config.yaml
構成ファイルのKUBECONFIG
環境変数を設定します。$ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
現在の名前空間を出力して、構成が有効になったことを確認します。
$ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}" tutorial
出力に自分の名前空間の名前が表示されるはずです。
自分でクラスタをセットアップする場合は、前の手順で説明した
${NAMESPACE}-user-config.yaml
ファイルを自分のローカルコンピュータにコピーします。ここで、${NAMESPACE}
は前の手順で指定した名前空間の名前です。たとえば、tutorial-user-config.yaml
のようになります。このファイルは後でチュートリアルで使用する必要があります。インストラクターの方は、生成された構成ファイルを各参加者に送信してください。参加者は、自分の構成ファイルをローカルコンピュータにコピーする必要があります。
おめでとうございます、チュートリアルのためのクラスタを構成しました!
これでローカルコンピュータの設定を行う準備ができました。