TT Lab
はじめる
学ぶ 学習パス コース

Istioサービスメッシュ

入れる前に何が入るかを読む — プロファイルとメッシュ設定

TT Labで続きを見る

目標

istioctl manifest generateで、4つのインストールプロファイルをクラスターなしでレンダリングして、構成要素の違いを表にまとめ、--set meshConfig.…で入れたメッシュ全体の設定が、レンダリングされたConfigMap istioの中に実際に現れるかを確認します。最後に、ネームスペース1つだけを上書きするProxyConfigを本物のAPIサーバーに適用して、スキーマが何を強制するかを見ます。

なぜ重要なのか

メッシュの導入で、元に戻すコストが最も高い決定が2つあります。プロファイルと、メッシュ全体の設定です。プロファイルは何を立ち上げるかを決め(ゲートウェイを置くのか、アンビエントにするのか)、メッシュ全体の設定は、すべてのプロキシのデフォルト値になります。outboundTrafficPolicy.modeを1つREGISTRY_ONLYに変えると、プロキシは、登録されていない外部の宛先へのトラフィックを拒否します。すべての通信経路を制御するセキュリティ境界とは違いますが、サービスには即座に影響を与えうるものです。そのため、これらの値は、インストールする前に読む必要があります。ありがたいことに、istioctlは、クラスターがなくてもインストール結果を丸ごとレンダリングしてくれます。マニフェストは、それ自体が読めるドキュメントで、プロファイルを変えながらレンダリングして比較すれば、何が増えて何が減るかが一目でわかります。値を間違えると、クラスターに届く前に拒否されることも、ここで確認します。

ステップ

  1. /root/ist-profilesを作成して、istioctl manifest generate --set profile=defaultの出力を/root/ist-profiles/default.yamlに保存してください。そのあと、そのファイルに含まれるオブジェクトを種類別に数えて、/root/ist-profiles/default-kinds.tsvに<kind>\t<개수>の形式で(プレースホルダーは種類名と個数です)、種類名の昇順で書いてください。
  2. --set profile=minimalのレンダリングを/root/ist-profiles/minimal.yamlに保存してください。そして、defaultにはあってminimalにはないオブジェクトを、/root/ist-profiles/minimal-missing.tsvに<kind>|<이름>の形式で(プレースホルダーは種類名と名前です)1行ずつ、ソートして書いてください。
  3. --set profile=demoのレンダリングを/root/ist-profiles/demo.yamlに保存し、demoにだけあってdefaultにはないオブジェクトを、/root/ist-profiles/demo-extra.tsvに<kind>|<이름>の形式で(プレースホルダーは種類名と名前です)ソートして書いてください。
  4. defaultプロファイルをそのまま使いつつ、--set values.gateways.istio-ingressgateway.autoscaleMin=3を加えてレンダリングした結果を、/root/ist-profiles/gw-scaled.yamlに保存してください。そして、上書きする前と後のHorizontalPodAutoscaler istio-ingressgatewayのspec.minReplicasの値を、/root/ist-profiles/hpa-before-after.tsvにbefore\t<값>とafter\t<값>の2行で書いてください(プレースホルダーは値です)。
  5. minimalプロファイルに、4つのメッシュ設定を加えてレンダリングしてください。meshConfig.outboundTrafficPolicy.modeはREGISTRY_ONLY、meshConfig.accessLogFileは/dev/stdout、meshConfig.trustDomainはlab.internal、meshConfig.defaultConfig.holdApplicationUntilProxyStartsはtrueです。レンダリング結果から、名前がistioのConfigMapオブジェクトだけを取り出して/root/ist-profiles/mesh-cm.yamlに保存し、そのConfigMapのdata.mesh文字列だけを/root/ist-profiles/mesh.yamlに保存してください。
  6. わざと3回間違えて、そのエラー文を/root/ist-profiles/rejected.txtに順番に集めてください。(1)minimalプロファイルにmeshConfig.outboundTrafficPolicy.modeをBLOCK_ALLで渡す、(2)--set profile=sidecarlessで存在しないプロファイルを呼び出す、(3)--profile=minimalのように、フラグの形でプロファイルを渡す、の3つです。標準エラー出力も一緒に入れてください。
  7. ネームスペースprofile-labを作成して、その中にProxyConfig ns-defaultを実際に適用してください。spec.concurrencyは2で、spec.environmentVariablesにISTIO_META_LAB_TIER: "gold"を置きます。マニフェストは/root/ist-profiles/proxyconfig.yamlに置いてください。そのあと、/root/ist-profiles/proxyconfig-negative.yamlに、ns-negativeをconcurrency: -1で書いて、サーバー側の試験適用で拒否されるようにし、その拒否文を/root/ist-profiles/proxyconfig-reject.txtに保存してください。
  8. /root/ist-profiles/profile-matrix.tsvに、<프로파일>\t<kind>|<이름>\t<yes|no>の形式で書いてください(プレースホルダーはプロファイル名と種類名と名前です)。プロファイルはdefault・demo・minimal・ambientの4つがすべて出てくる必要があり、コンポーネントはDeployment|istiod・Deployment|istio-ingressgateway・Deployment|istio-egressgateway・DaemonSet|ztunnel・DaemonSet|istio-cni-nodeの5つがすべて出てくる必要があります(20行)。/root/ist-profiles/check-profiles.shは、この表を読んでプロファイルをもう一度レンダリングし、合っていればOK …、間違っていればMISMATCH …を標準出力にだけ出力し、1行でも間違っていれば、0ではない終了コードで終わる必要があります。その出力を、/root/ist-profiles/matrix-result.txtに保存してください。

参考

デフォルトプロファイルが何を作るのかを先に数える

/root/ist-profilesを作成して、istioctl manifest generate --set profile=defaultの出力を/root/ist-profiles/default.yamlに保存してください。そのあと、そのファイルに含まれるオブジェクトを種類別に数えて、/root/ist-profiles/default-kinds.tsvに<kind>\t<개수>の形式で(プレースホルダーは種類名と個数です)、種類名の昇順で書いてください。

レンダリング結果は、複数のドキュメントがつながったYAMLです。yq -N e '.kind' 파일で、ドキュメントごとにkindを取り出せます(プレースホルダーはファイル名です)。そこにsortとuniq -cをつなげれば、個数が出ます。列の区切りはタブです。

minimalに下げると、正確に何がなくなるのか

--set profile=minimalのレンダリングを/root/ist-profiles/minimal.yamlに保存してください。そして、defaultにはあってminimalにはないオブジェクトを、/root/ist-profiles/minimal-missing.tsvに<kind>|<이름>の形式で(プレースホルダーは種類名と名前です)1行ずつ、ソートして書いてください。

2つのファイルから[.kind, .metadata.name] | join("|")を取り出して、それぞれsort -uで整理し、commで比較すると、片方にだけある行が出ます。なくなるのは、1つのコンポーネントに付随するオブジェクトのまとまりです。

demoはdefaultの上に何を追加するのか

--set profile=demoのレンダリングを/root/ist-profiles/demo.yamlに保存し、demoにだけあってdefaultにはないオブジェクトを、/root/ist-profiles/demo-extra.tsvに<kind>|<이름>の形式で(プレースホルダーは種類名と名前です)ソートして書いてください。

ステップ2と同じ方法ですが、方向が逆です。commは、-23と-13で、互いに反対側だけが残ります。demoが追加するのは、外へ出ていくトラフィックを1か所に集めるコンポーネントです。

プロファイルを選ぶことと値を1つ上書きすることは、別のつまみである

defaultプロファイルをそのまま使いつつ、--set values.gateways.istio-ingressgateway.autoscaleMin=3を加えてレンダリングした結果を、/root/ist-profiles/gw-scaled.yamlに保存してください。そして、上書きする前と後のHorizontalPodAutoscaler istio-ingressgatewayのspec.minReplicasの値を、/root/ist-profiles/hpa-before-after.tsvにbefore\t<값>とafter\t<값>の2行で書いてください(プレースホルダーは値です)。

--set profile=はまとまりを選び、--set values.…はそのまとまりの中の値を1つ変えます。レンダリングされたHPAは、yq -N e 'select(.kind=="HorizontalPodAutoscaler")' 파일で取り出せます(プレースホルダーはファイル名です)。beforeは、ステップ1ですでに取り出してあるファイルから読めば済みます。

メッシュ全体の設定は、ConfigMap1枚としてレンダリングされる

minimalプロファイルに、4つのメッシュ設定を加えてレンダリングしてください。meshConfig.outboundTrafficPolicy.modeはREGISTRY_ONLY、meshConfig.accessLogFileは/dev/stdout、meshConfig.trustDomainはlab.internal、meshConfig.defaultConfig.holdApplicationUntilProxyStartsはtrueです。レンダリング結果から、名前がistioのConfigMapオブジェクトだけを取り出して/root/ist-profiles/mesh-cm.yamlに保存し、そのConfigMapのdata.mesh文字列だけを/root/ist-profiles/mesh.yamlに保存してください。

MeshConfigは、別のCRDではなく、istio-systemのConfigMap istioの中のmeshキーに入るYAMLのかたまりです。yq -N e 'select(.kind=="ConfigMap" and .metadata.name=="istio")' -でオブジェクトを、.data.meshで文字列を取り出します。

レンダリングの段階で拒否される3つのケース

わざと3回間違えて、そのエラー文を/root/ist-profiles/rejected.txtに順番に集めてください。(1)minimalプロファイルにmeshConfig.outboundTrafficPolicy.modeをBLOCK_ALLで渡す、(2)--set profile=sidecarlessで存在しないプロファイルを呼び出す、(3)--profile=minimalのように、フラグの形でプロファイルを渡す、の3つです。標準エラー出力も一緒に入れてください。

3回とも、0ではない終了コードで終わります。명령 >> rejected.txt 2>&1のように、標準出力と標準エラー出力を同じファイルに追記すれば済みます(プレースホルダーはコマンドです)。3つは、それぞれ違う層で引っかかります。値の列挙型、ファイル名、コマンドラインの文法です。

メッシュ全体の設定を、ネームスペース1つだけ上書きする

ネームスペースprofile-labを作成して、その中にProxyConfig ns-defaultを実際に適用してください。spec.concurrencyは2で、spec.environmentVariablesにISTIO_META_LAB_TIER: "gold"を置きます。マニフェストは/root/ist-profiles/proxyconfig.yamlに置いてください。そのあと、/root/ist-profiles/proxyconfig-negative.yamlに、ns-negativeをconcurrency: -1で書いて、サーバー側の試験適用で拒否されるようにし、その拒否文を/root/ist-profiles/proxyconfig-reject.txtに保存してください。

ProxyConfigは、networking.istio.io/v1beta1のCRDで、MeshConfigのdefaultConfigを、ネームスペースやワークロード単位で上書きします。適用せずに、APIサーバーに問い合わせだけをするには、kubectl apply --dry-run=serverを使います。負の数の検査は、istioctlではなく、CRDスキーマが行います。

4つのプロファイルの構成要素の表を作り、自分で検証させる

/root/ist-profiles/profile-matrix.tsvに、<프로파일>\t<kind>|<이름>\t<yes|no>の形式で書いてください(プレースホルダーはプロファイル名と種類名と名前です)。プロファイルはdefault・demo・minimal・ambientの4つがすべて出てくる必要があり、コンポーネントはDeployment|istiod・Deployment|istio-ingressgateway・Deployment|istio-egressgateway・DaemonSet|ztunnel・DaemonSet|istio-cni-nodeの5つがすべて出てくる必要があります(20行)。/root/ist-profiles/check-profiles.shは、この表を読んでプロファイルをもう一度レンダリングし、合っていればOK …、間違っていればMISMATCH …を標準出力にだけ出力し、1行でも間違っていれば、0ではない終了コードで終わる必要があります。その出力を、/root/ist-profiles/matrix-result.txtに保存してください。

同じプロファイルを何度もレンダリングすると遅くなります。プロファイルごとに1回だけレンダリングして、一時ファイルに入れておき、それを使い回してください。スクリプトが受講者の出力物を直接書き換えると、採点が再実行されたときに値が変わってしまうので、標準出力にだけ出力します。