クラスタを調べて扱う
目標
クラスターに初めて入ったときに行う7つのことを、手に覚えさせます。調査、ネームスペース、ラベルとアノテーション、コンテキストの切り替え、ノードへのラベル付け、kubectl explain、dry-runによるマニフェスト生成です。
なぜ重要なのか
CKAは120分で17問です。1問あたり7分です。マニフェストを最初から手で書いていると、時間が足りません。そのため、--dry-run=client -o yamlで骨格を取り出し、必要なフィールドだけを直す方法が、事実上の標準戦略です。
kubectl explainは、その次の半分です。試験会場で見られるドキュメントはKubernetesの公式ドキュメントだけですが、フィールド1つの正確なスペルと位置を確認するには、explainのほうがはるかに速いです。ラベルとアノテーションの違いも、同じ文脈です。ラベルはセレクターが選べる識別子なので、サービスやコントローラーが参照し、アノテーションは選べない付加情報なので、ツールがメタデータを載せて運びます。両者を取り違えて使うと、静かに何もつながりません。
ステップ
- ネームスペース
cka-basicsを作成し、ラベルenv=labを付けてください。 - クラスターのすべてのノード名を、1行に1つずつ
/root/cka-basics/nodes.txtに保存してください。ファイルには名前だけを含め、ヘッダーやnode/の接頭辞を含めないでください。 cka-basicsにConfigMapapp-metaを作成してください。データはenv=lab、ラベルはtier=backend、アノテーションはowner=cka-studentです。- 現在使っているclusterとuserをそのまま再利用しながら、デフォルトのネームスペースが
cka-basicsであるコンテキストcka-basics-ctxを作成し、そのコンテキストに切り替えてください。 - ノード
lab-node-1に、ラベルdisktype=ssdとtopology.kubernetes.io/zone=rack-a、アノテーションowner=cka-studentを付けてください。 - Podのトレラレーションの
effectフィールドの説明を、kubectl explainで取り出して/root/cka-basics/explain.txtに保存してください。 - dry-runで、Deployment
web(イメージnginx:1.27、レプリカ3)のマニフェストを作成し、/root/cka-basics/web.yamlに保存してください。このステップでは、まだ適用しないでください。 - そのマニフェストを
cka-basicsに適用し、Deploymentオブジェクトにラベルtier=backendを付けたあと、3/3 Readyを確認してください。
参考
kubectl get nodes -o custom-columns=NAME:.metadata.name --no-headersのように、ヘッダーを除くオプションがあります。- コンテキストは
kubectl config set-context <이름> --cluster=... --user=... --namespace=...で作成し、use-contextで切り替えます(プレースホルダーはコンテキスト名です)。 - よくあるミス1: ラベルをPodテンプレートにだけ付けて、Deployment自体には付けないことです。ステップ8は、Deploymentオブジェクトのラベルを見ます。
- よくあるミス2: コンテキストを作るときに、clusterやuserの名前を新しく作り出してしまうことです。既存の名前をそのまま使ってはじめて、接続が維持されます。
ネームスペースを作成してラベルを付ける
ネームスペースcka-basicsを作成し、ラベルenv=labを付けてください。
ネームスペースを作成したあとにラベルを別途付けてもよく、最初からマニフェストに入れてもかまいません。ラベルはmetadata.labelsの下に入ります。
ノード一覧をファイルに取り出す
クラスターのすべてのノード名を、1行に1つずつ/root/cka-basics/nodes.txtに保存してください。ファイルには名前だけを含め、ヘッダーやnode/の接頭辞を含めないでください。
ファイルには、ノード名だけを1行に1つずつ入れる必要があります。出力からヘッダーやnode/の接頭辞を取り除く方法を考えてみてください。jsonpathのrangeや-o custom-columnsが役に立ちます。
ラベルとアノテーションを区別して付ける
cka-basicsにConfigMapapp-metaを作成してください。データはenv=lab、ラベルはtier=backend、アノテーションはowner=cka-studentです。
ラベルはセレクターで選べる識別子で、アノテーションは選べない付加情報です。保存される位置が違います(metadata.labelsとmetadata.annotations)。
kubeconfigのコンテキストを作成して切り替える
現在使っているclusterとuserをそのまま再利用しながら、デフォルトのネームスペースがcka-basicsであるコンテキストcka-basics-ctxを作成し、そのコンテキストに切り替えてください。
コンテキストは、cluster + user + namespaceの3つの組です。新しいclusterやuserを作る必要はなく、既存の名前をそのまま再利用してください。先にkubectl config get-clustersとget-usersで、名前を確認します。
ノードにラベルとアノテーションを付ける
ノードlab-node-1に、ラベルdisktype=ssdとtopology.kubernetes.io/zone=rack-a、アノテーションowner=cka-studentを付けてください。
ノードもオブジェクトなので、label/annotateコマンドがそのまま通用します。スラッシュを含むキーも、そのまま書いてかまいません。
kubectl explainでフィールドの説明を取り出す
Podのトレラレーションのeffectフィールドの説明を、kubectl explainで取り出して/root/cka-basics/explain.txtに保存してください。
explainは、ドット表記で入れ子のフィールドをたどります。Podのspecのトレラレーションの配列の中にあるフィールドを、指名してみてください。
dry-runでマニフェストを作成する
dry-runで、Deploymentweb(イメージnginx:1.27、レプリカ3)のマニフェストを作成し、/root/cka-basics/web.yamlに保存してください。このステップでは、まだ適用しないでください。
kubectl create系のコマンドに--dry-run=client -o yamlを付けると、APIには触れずにYAMLだけが出力されます。レプリカ数は、createのオプションで指定できます。
適用してラベルまで仕上げる
そのマニフェストをcka-basicsに適用し、Deploymentオブジェクトにラベルtier=backendを付けたあと、3/3 Readyを確認してください。
前のステップで作成したファイルを、そのまま適用します。ラベルは、Podテンプレートではなく、Deploymentオブジェクト自体に付ける必要があります。PodがReadyになるまで、少し時間がかかります。