入社歴の浅いメンバーで Kubernetes完全ガイド 【第2版】 読書会2 をやっている。
過去に Kubernetes完全ガイド 【第2版】 の読書会 は実施されているが、その頃は自分たちはまだ入社していなかったのでいま 読書会2 として小規模で開催している。
第1章 Docker の復習
Kubernetes 利用時に Docker に関して知っておくべき知識
- Docker コンテナの設計
- Dockerfile の書き方
- Docker イメージのビルド
- Docker レジストリへのイメージのプッシュ
第2章 なぜ Kubernetes が必要なのか?
Kubernetes はコンテナ化されたアプリケーションのデプロイやスケーリングなどの管理を自動化するためのプラットフォーム
- 実際にコンテナが起動するノード(ホストとなるVMなど)を Kubernetes Node
- Kubernetes Node を管理するノードを Kubernetes Master
Kubernetes を使うことで、自動化が可能かつシンプルなオペレーションになる
- 宣言的なコードによる管理(Infrastructure as Code)
- スケーリング / オートスケーリング
- スケジューリング
- リソース管理
- セルフヒーリング
- ロードバランシングとサービスディスカバリ
- データの管理
第3章 Kubernetes 環境の選択肢
Kubernetes クラスタを利用するには、大きく3種類の方法がある
- ローカル Kubernetes
- Minikube
- Docker Desktop
- kind (Kubernetes in Docker) : Docker コンテナを複数個起動して、そのコンテナを Kubernetes Node として利用 する
- Kubernetes 構築ツール
- kubeadm(OpenStack対応している)
- Rancher
- パブリッククラウド上のマネージド Kubernetes サービス
- GKE
- AKS
- EKS
第4章 APIリソースとkubectl
Kubernetes は2種類のノードから成り立っている
- Kubernetes Master
- API エンドポイントの提供
- コンテナのスケジューリング
- コンテナのスケーリング
- Kubernetes Node
- Docker ホストに相当し、実際にコンテナが起動するノード
Kubernetes とリソースのカテゴリ
- Workloads APIs : コンテの実行に関するリソース
- Pod
- ReplicationController
- ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job
- CronJob
- Service APIs : コンテナを外部公開するようなエンドポイントを提供するリソース
- Service
- ClusterIP
- ExternalIP(ClusterIP の1種)
- NodePort
- LoadBalancer
- Headless(None)
- ExternalName
- Node-Selector
- Ingress
- Service
- Config & Storage APIs : 設定 / 機密情報 / 永続化ボリュームなどに関するリソース
- Secret
- ConfigMap
- PersistesVolumClaim
- Cluster APIs : セキュリティやクォータなどに関するリソース
- Node
- Namespace
- PersistentVolume
- ResourceQuota
- ServiceAccount
- Role
- ClusterRole
- RoleBinding
- ClusterRoleBinding
- NetworkPolicy
- Metadata APIs : クラスタ内の他のリソースを操作するためのリソース
- LimitRange
- HorizontalPodAutoscaler
- PodDitruptionBudget
- CustomResourceDefinition
Kubernetes の Namespace は仮想的なクラスタの分離機能
初期状態では 4つの Namespace が用意されている
- kube-system : クラスタのコンポーネントやアドオンがデプロイされる
- kube-public : 全ユーザーが利用できる ConfigMap などを配置する
- kube-node-lease : ノードのハートビート情報が保存されている
- default : デフォルト
Namespace だけでは、高い分離性が確保されないので RBAC や Network Policy を利用することで分離性を高める(後述)
CLIツールと kubectl
- kubectl を使って Kubernetes Master と通信する
- kubectl は kubeconfig(~/.kube/config)に書かれた接続先サーバの情報や認証情報などを使用して接続する
- kubeconfig で設定を行うのは clusters / users /contexts の3種類
マニフェストとリソースの作成 / 削除 / 更新(create / delete / apply)
- リソース作成にも kubectl create ではなく kubectl apply を使おう
$ kubectl <create|delete|apply> -f sample-pod.yaml
Pod の再起動(rollout restart)
- Pod に対して Rollout はできないので Deployment リソースに対して行う
$ kubectl rollout restart deployment sample-deployment
Kubernetes にはアノテーションとラベルというメタデータを付与できる
- アノテーション : システムコンポーネントが利用するメタデータ
- リソースに対するメモ書きのようなもの
- システムコンポーネントのためにデータを保存する
- すべての環境では利用できない設定を行う
- 正式に組み込まれる前の機能の設定を行う
- リソースに対するメモ書きのようなもの
- ラベル : リソースの管理に利用するメタデータ
- リソースを分割するための情報のようなもの
- 開発者が利用するラベル
- 対象リソースをフィルタリングしてオペレーションを行う
- システムが利用するラベル
- ラベルの付与には方針を決めて衝突を避けるように注意する
- 開発者が利用するラベル
- リソースを分割するための情報のようなもの
kubectl コマンド
- エディターによる編集(edit)
$ kubectl edit pod sample-pod
- ローカルマニフェストと Kubernetes 上の登録情報の差分取得(diff)
- 変更差分があると exit status 1 が返る
- 変更差分がないと exit status 0 が返る
# コンテナイメージを 1.16 -> 1.15 に変更
$ kubectl set image pod sample-pod nginx-container=nginx:1.15
# クラスタの登録情報とマニフェストの差分確認
$ kubectl diff -f sample-pod
(コンテナイメージに関する差分が確認できる)
- 利用可能なリソース種別の一覧取得(api-resources)
$ kubectl api-resources
# Namespace に属しているリソース
$ kubectl api-resources --namespaced=true
# Namespace に属していないリソース
$ kubectl api-resources --namespaced=false
- リソースの情報取得(get)
$ kubectl get <pods|nodes>
$ kubectl get pod sample-pod
# 作成されているほぼすべての種類のリソース
$ kubectl get all
# label1=val1, label2 ラベルを持つPod
$ kubectl get pods -l label1=val1, label2 --show-labels
# 詳細表示
$ kubectl get pods -o <wide|yaml>
# リソースの状態の変化を出力し続ける
$ kubectl get pods --watch
$ kubectl get pods --watch --output-watch-events
- リソースの詳細情報の取得(describe)
$ kubectl describe pod sample-pod
$ kubectl describe node <Node名>
- 実際のリソースの使用量の確認(top)
$ kubectl top node
$ kubectl top pod -n kube-system
# コンテナごとのリソース使用量を確認
$ kubectl top pod --containers -n kube-system
- コンテナ上でのコマンドの実行(exec)
$ kubectl exec -it sample-pod -- /bin/bash
$ kubectl exec -it sample-pod -c nginx-container -- /bin/bash
$ kubectl exec -it sample-pod -- /bin/ls
$ kubectl exec -it sample-pod -c nginx-container -- /bin/ls
$ kubectl exec -it sample-pod -- /bin/bash -c "ls --all --classify | grep lib"
$ kubectl exec -it sample-pod -c nginx-container -- /bin/bash -c "ls --all --classify | grep lib"
- コンテナのログ確認(logs)
$ kubectl logs sample-pod
$ kubectl logs sample-pod -c nginx-container
- Stern による高度なログ確認
- 各コンテナのログを時系列で表示
- タイムスタンプの表示(--timestamps オプション)
- 特定ラベルが付与された Pod のログのみ表示(--selector オプション)
- 除外するログを正規表現で指定可能(--exclude オプション)
他にもいろいろと機能があったけど ArgoCD 管理でやると良さそうなことなどはここに書かなかった。ArgoCD も勉強しないと。
(Part2 に続く...)
参考