Kubestronautへの道 ~CKAD編その1~

tech article

CKA, CKADを受ける人はほぼ100%使用しているんじゃないかというほど有名な教材がこちらです。

Kubernetes Certified Application Developer (CKAD) Training
Learn concepts and practice for the Kubernetes Certification with hands-on labs right in your browser - DevOps - CKAD


めちゃくちゃ高いですが、だいたいセールで9割引きしてるらしいので数千円で買えるんじゃないかと思います。筆者は会社から払い出されているudemyのアカウントを利用して無料で受講しています(ありがたい)。

コースの内容

コースの内容は基本的に
レクチャー → 実践問題 → 解説
という構成になっています。

CKAを受講していた時は動画すべてをチェックしていましたが、今回はCKAとかなり中身がかぶっているのと、業務でそれなりに知識がついていることから問題をひたすら解くスタイルで進めていきます。

本記事の内容

この記事では、udemy
#1 Introduction
#2 Core Consepts
#3 Configuration
を受講していた中で気になったところをメモしていきます。

勉強記

kubectl edit

podに対してkubectl editで編集する場合、編集可能な項目は以下のみ

  • spec.containers[*].image
  • spec.initContainers[*].image
  • spec.activeDeadlineSeconds
  • spec.tolerations
  • spec.terminationGracePeriodSeconds

ハイライトしたimage, tolerationsが編集できる、と覚えておけばよさそう。

それ以外の箇所を編集したい場合は、

kubectl get po <pod name> -o yaml > definition.yaml

で一旦マニフェストファイルを書き起こして、マニフェストファイル自体を修正する。
kubectl applyで更新できない場合はkubectl replace –forceで強制更新する。

deploymentはどのような値であっても編集することが可能。

nodeの情報もkubectl editで編集することが可能。

docker

dockerコマンドに慣れていないので基礎的なコマンドを理解できていなかった。

使用可能なイメージを知りたいとき

docker images

名前を付けてイメージをビルドしたいとき
-t は tag かな?

docker build -t <container name> <directory>

ホストの8282ポートへのアクセスをコンテナの8080ポートに流すオプション付きでコンテナを立ち上げたいとき
-p は port

docker run -p 8282:8080 <image name>

コンテナOSのイメージを確認したいとき

docker run -it <image>:<tag> /bin/bash 

でコンテナを立ち上げて

cat /etc/os-release

でOSを確認する

ENTRYPOINT/CMD

ENTRYPOINTとCMDはコンテナに関する用語。Dockerfileに記述される。

ENTRYPOINT

  • コンテナが実行されるときに最初に実行されるメインプロセスを指定する
  • 基本的には必ず実行するものだが、docker runコマンドの--entrypointフラグでオーバーライドすることもできる

CMD

  • ENTRYPOINTが指定されていない場合に実行されるデフォルトコマンドを指定する
  • CMDdocker runコマンドの引数でオーバーライドすることができる

# ENTRYPOINTで指定された部分が必ず実行される
ENTRYPOINT ["python", "app.py"]

# CMDで指定された部分はデフォルトの引数
CMD ["--default-arg"]

この場合、docker run myimageと実行すると、python app.py --default-argが実行される。
docker run myimage --custom-argと実行すると、python app.py --custom-argが実行される。

command/args

commandとargsはPodに関する用語。マニフェストファイルに記述される。

command

  • Podが起動する際に実行されるコマンドを指定する
  • commandコンテナイメージのENTRYPOINTを上書きする
  • commandはKubernetesのPod定義におけるspec.containers.commandフィールドに設定する

args

  • commandに渡される引数を指定する
  • argsコンテナイメージのCMDを上書きする
  • argsはKubernetesのPod定義におけるspec.containers.argsフィールドに設定する

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: myimage
    command: ["sleep"]  # ENTRYPOINTを上書き
    args: ["3600"]      # CMDを上書き

secrets

kubectl create secret generic
Synopsis Create a secret based on a file, directory, or specified literal value. A single secret may package one or more key/value pairs. When creating a secret...
kubectl create secret generic <secrets name>

で作成する。文字列を直接埋め込むときは

--from-literal=DB_Host=sql01 \
--from-literal=DB_User=root \
--from-literal=DB_Password=password123 

のように--from-literalフラッグを使用して指定する
これらの内容はBASE64でエンコードされる

security context

Podとコンテナにセキュリティコンテキストを設定する
セキュリティコンテキストはPod・コンテナの特権やアクセスコントロールの設定を定義します。 セキュリティコンテキストの設定には以下のものが含まれますが、これらに限定はされません。 任意アクセス制御: user ID (UID) と group ID (GID)に基づいて、ファイルなどのオブジェクトに対する許可を行います...

securityContextセクションのcapabilitiesフィールドを利用することで、プロセスに対してrootユーザーの全権を渡すことなく特定の権限を与えることができる。

→これ、コンテナ内rootとかコンテナ外rootがあってややこしい

コンテナ内外の root について理解する
コンテナを root として実行しているか、それとも一般ユーザーとして実行しているか。これは一見、極めて単純な質問です。すぐに答えたくなるかもしれませんが、ちょっと待ってください。あなたは脅威モデルを明確に理解できているでしょうか。実はそうでもないのでは?

あんまり分かってないので深追いはしない。
とりあえず、securityContextセクションのcapabilitiesフィールドを利用すればコンテナ内のユーザーの権限を追加できる、までわかればOKということにする。

ちなみに、NET_ADMINはネットワークインターフェースやルーティングテーブルに対する権限、SYS_TIMEはシステムの時刻を変更する権限。

コンテナ内に範囲を限定して権限を与えてるのか、ホスト全体に対する権限が与えられてるのかはコンテナランタイムなどの設定によるらしい。こちらも深追いはしない。

taint/tolarance

TaintとToleration
ノードアフィニティは Podの属性であり、あるノード群を引きつけます(優先条件または必須条件)。反対に taint はノードがある種のPodを排除できるようにします。 toleration はPodに適用され、一致するtaintが付与されたノードへPodがスケジューリングされることを認めるものです。ただしそのノードへ必...

コマンドでノードに対してtaintを設定できる

kubectl taint node <node name> KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N

podに対するtolerationはコマンドでは設定できないので、マニフェストファイルを修正する。
kubectl editでもよい。

operatorのデフォルトはEqual

tolerationがtaintと合致するのは、keyeffectが同一であり、さらに下記の条件のいずれかを満たす場である

  • operatorExistsvalueを指定すべきでない場合)
  • operatorEqualであり、かつvalueが同一である場合

node affinity

operator

Assigning Pods to Nodes
You can constrain a Pod so that it is restricted to run on particular node(s), or to prefer to run on particular nodes. There are several ways to do this and th...
タイトルとURLをコピーしました