これは何?
私の技術メモです。
これから触るにあたって、overviewだけはふわーっと知っておきたいなと思った。
以下メモ
自分で調べてみて基本的な用語や概念など、理解したことを書いてみる。
「kubernetesってそもそも何するやつ?」はここには書いてない。
リソースやコンポーネントについてはとりあえず並べてみただけなので、もう少し学びが進んだら読み直してアップデートしていくかも。
k8sクラスタ
- k8sそのものとなるサーバ群
- 1台以上のmaster、1台以上のnodeで構成
- master : api-serverの提供やコンテナのスケーリングなど
- node : 基本的にはdockerホストに相当
- masterとnodeは同じサーバが役割を担ってることもあるかも
- dockerホストのクラスタ構成≒k8sのクラスタ構成 と思っている。
kubeadm
- k8sクラスタの構築ツール。
- kubeadmの基本的なコマンド。
- kubeadm init : masterノードで実行。クラスタを初期化する。
- kubeadm join : クラスタにノードを追加する。
kubectl
- k8sクラスタ管理のためのCLI。masterノード上で動作。
- ~/.kube/config : kubecetlの接続情報を書く。yaml形式。
- kubeconfigの構成
- clusters : 接続先クラスタ
- users : 認証情報
- contexts : clusters+users+namespaceの組み合わせ情報。これを切り替えながらkubectlを発行することで、どのクラスタに向けて発行するか決まるんだと思う。
- kubectlの基本的なコマンド。
- まだ。
マニフェストファイル
- yaml形式の設定ファイル。
- 後述する「リソース」を記述する。
- マニフェストファイルの操作
- 一括操作系:kubectl create/delete/apply
- 特定リソース操作系:kubectl set/replace/edit
- 情報取得系:kubectl get/describe/logs
- ほか:kubectl exec/kubectl port-forward
- 事実上のIaC化ということだと理解。
k8sの「リソース」
- マニフェストファイルでmasterにリソースを登録する。
- 主な登場人物を書いてみる。
- workloads : クラスタ上にコンテナを起動するリソース。
- deployment:replicaSetを管理。コンテナイメージが変更したりした場合、podを新しくしていってくれる。
- replicaSet:podを管理。指定数のpodの稼働を保証する。
- pod:複数コンテナからなる。IPアドレスがpod単位で紐づけられる。
- daemonSet
- statefulSet
- desicovery&LB : 外部からアクセスするエンドポイントなど公開・アクセスに関する。
- service
- ingress
- config&storage : その名の通り設定やボリュームなど。
- secret
- configMap
- persistentVolumeClaim
- cluster :
- namespace
- 一つのk8sクラスタを仮想的に分離させて複数のチームで利用したりできる。
- デフォルトではdefault/kube-system/kube-publicの三つが存在。
- node
- namespace
- metadata :
- horizontalPodAutoscaler
- workloads : クラスタ上にコンテナを起動するリソース。
k8sのコンポーネント
- 主な登場人物を書いてみる。
- etcd
- クラスタに関わる情報すべて。冗長化するのが基本。
- kubelet
- 実際にコンテナランタイム(docker等)と連携し、コンテナの起動/停止を行う。
- kube-proxy
- kube-scheduler
- podとnodeの紐づけをする。
- kube-apiserver
- k8sのAPIを提供する、中心となるコンポーネント。
- kube-dns
- kube-controller-manager
- etcd
Liveness Probe/Readiness Probe
- リソース(=マニフェストファイル)のPod内のcontainersで設定するコンテナのヘルスチェック。肝要そうなので別枠とした。
- liveness : コンテナが起動しているか
- readiness : コンテナがリクエストを受け付けられるか
- livenessとreadinessの使い分けの考え方は諸説あるようだ。
- k8sが取り扱う単位の最小は基本的にpodだが、これはコンテナを参照することになるようだ。
CNI(ContainerNetworkInterface)
- コンテナ間の通信を可能にするネットワークインターフェース。
- 現在の代表はflannel。
- dockerホストの異なるpodは基本的に通信できないが、CNIにより通信が可能となる。
- kube-proxyが仲介役をしているようだ。
その他
- kubeletはSELinuxを無効にする必要あり。
- クラスタ構築時は、kubeadm initの出力をもとにkubeadm joinしよう!
- minikube : ローカルでk8sを試せる。冗長構成無し。virtualBox必要。
ひとまずの感想
kubernetesの世界は広大だ。