本記事の内容
前回に引き続いてUdemyのKubernetes Certified Application Developer (CKAD) with Testsというコースを受講していた中で気になったところをメモしていきます。
……と言っていますが、こちらは基本的にはCKAの範囲となっています。そのため、CKAD対策としてはあまり必要のない知識です。参考程度にご覧ください。
今回は以下のセクションに基づいています
#9 Security
勉強記
kubeconfig
クラスターにおいて、ユーザー、名前空間、認証の仕組みに関する情報を管理するためのファイル。
kubectlは、kubeconfigファイルによってクラスターを選択するために必要な情報を判断し、クラスターのAPIサーバーと通信する。
kubeconfigと呼ばれているが、ファイルの名前がkubeconfigというわけではない。
デフォルトでは、kubectlは$HOME/.kube
ディレクトリ内にあるconfig
という名前のファイルを探索する。
KUBECONFIG環境変数を設定するか、kubectlコマンド実行時に--kubeconfig
フラグで指定することで、別のkubeconfigファイルを指定することもできる。
kubectl config
kubeconfigファイルの内容を変更するためのコマンド。
このコマンドを使わずに実際にファイルを編集して設定を変更することもできる。
マージされたファイルの編集時のみ少し注意が必要。
既存の値を変更するときは、その値が存在するファイルの内容が変更される。
新しい値を追加するときは、最初のファイルに内容が追記される。
Role Base Access Control
Role Base Access Control(RBAC)は、個々のユーザーに対してリソースへのアクセス権限をきめ細やかに制御する方法。
/etc/kubernetes/manifests/kube-apiserver.yaml のspec.containers.command
の--authorization-mode
に認可モードの設定を記載する。
RBACを利用する場合は--authorization-mode=RBAC
と設定する。
role/clusterRole
権限のセットを表すルールを設定するリソース。
権限は許可ルールのみが存在する。拒否ルールはない。
role/clusterRoleの違いは、権限の範囲がnamespaceに限定されるか、クラスター全体に影響するのかの違い。
rolebinding/clusterRoleBinding
role/clusterRoleをユーザーに割り当てるリソース。
目には目を、歯には歯を、roleにはrolebindingを、clusterroleにはclusterrolebindingを紐づける。
バインディングを作成した後、それが参照する Role または ClusterRoleは変更不可となる。
バインディングの を変更しようとすると、roleRef
検証エラーが発生する。roleRef
バインディングの を変更する場合は、バインディング オブジェクトを削除して、代わりのものを作成しなければならない。
admission controller
Kubernetes API サーバーへのリクエスト(基本的にkubectlで送るやつ)の認証と認可が行われた後に、内容をインターセプトするコード。
リクエストの検証、変更、またはその両方ができる。ただし読み取り操作(get, watch, list)はブロックできない。
大きく分けてMutatingAdmissionWebhook, ValidatingAdmissionWebhookという2種類のタイプが存在する。
MutatingAdmissionWebhook
リソースがAPIサーバーに送信された際に、そのリソースを変更(mutate)するためのWebhook。
例:Podが作成される前に特定のラベルを追加する、リソースのフィールドを設定する、など。
ValidatingAdmissionWebhook
リソースがAPIサーバーに送信された際に、そのリソースが特定のルールに従っているかどうかを検証(validate)するためのWebhook。
例:Podが特定のラベルを持っているかどうかを確認する、リソースのフィールドが正しい値を持っているかどうかを検証する、など。
順序としてはMutatingAdmissionWebhook
→ ValidatingAdmissionWebhook
の順でチェックが行われる。
/etc/kubernetes/manifests
ディレクトリ構造の話。
ぶっちゃけCSPを利用してKubenetesクラスターを構築する場合はあまり気にすることはない。
さらに、CKADじゃなくてCKAの範囲なのでCKADを受ける際はあまり気にしなくてよい(はず)。
まあそれを言えばこの記事全体としてそうなのだけれども。
/etc/kubernetes/manifests/
静的pod(Kubeletが直接管理するpod)に関するマニフェストファイルを配置するディレクトリ。
以下のマニフェストファイルが存在する。
etcd.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
/etc/kubernetes/
コントロールプレーンコンポーネントのID情報が記述されている kubeconfigファイルを配置するディレクトリ。
kubelet.conf
(bootstrap-kubelet.conf
TLS ブートストラップ中)controller-manager.conf
scheduler.conf
admin.conf
クラスタ管理者とkubeadm自体super-admin.conf
RBACをバイパスできるクラスタスーパー管理者向け
ちなみに……
ChatGPTに質問したところ、
- kube-apiserver、kube-scheduler、kube-controller-managerなどのコントロールプレーンコンポーネントは、ホストシステム上で直接プロセスとして実行されます。
ということらしいのですが、ソースが見つけられなくて困ってます。
公式ソースで記述を見つけた方、教えてください!
コメントはスパムまみれでちゃんと見てないのでお問い合わせからメールで教えてください。
API version
APIを使えるようにするには/etc/kubernetes/manifests/kube-apiserver.yaml のspec.containers.command
の--runtime-config
に使用したいAPIを記述する。
Custom Resources
そもそもリソースとは、Kubernetes APIのエンドポイントで、特定のAPIオブジェクトのコレクションを保持するものである。
ちょっと難しくてよくわからないが、podとかserviceとかって感じで抽象化されたエンティティを、利用者が独自に設定して使えるようにする、みたいなことだと理解している。
よくわからんからわかりやすく解説してるサイトとかあったら教えてほしいです。お願いします。
CustomResourceDefinition(CRD)
カスタムリソースを定義するリソース。ややこしい。
クラスター内でどんなカスタムリソースが使えるの確認したいときは
kubectl describe crd <custom resource name>
で確認できる。
以下がCRDの例。
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: internals.datasets.kodekloud.com
spec:
group: datasets.kodekloud.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
internalLoad:
type: string
range:
type: integer
percentage:
type: string
scope: Namespaced
names:
plural: internals
singular: internal
kind: Internal
shortNames:
- int