Closed6
Kubernetes完全ガイド読書メモ
はじめに
このスクラップではCKADやCKAといった資格取得のためにKubernetes完全ガイドを購入し、勉強したメモをまとめていきます。
やり方
- 章ごとに内容を整理する
- 関連の技術トピックを調べたことをまとめる
1章 Docker の復習と「Hello,Kubernetes」
Kubernetesをやる上でDockerについて学んでおくべきこと
- Dockerコンテナの設計
- Dockerfileの書き方
- Dockerイメージのビルド
- Dockerレジストリへのイメージのプッシュ
Dockerコンテナの設計
Dockerコンテナを使う時に気をつけること
- Immutable Infrastructureなイメージにすること
- 1コンテナにつき1プロセス
- コンテナイメージは軽量にする
- 実行ユーザーをroot以外にする
2章 なぜ Kubernetes が必要か?
Kubernetes はコンテナ化されたアプリケーションのデプロイ、スケーリングなどの管理を自動化するためのプラットフォーム(コンテナオーケストレーションエンジン)
Kubernetes のメリット
- 複数のノード管理
- コンテナのスケジューリング
- リソース管理
- Kubernetes NodeのCPUやメモリの秋リソース状況に従ってスケジュールされるからコンテナ配置するのかを管理する必要はない
- ローリングアップデート
- スケーリング/オートスケーリング
- コンテナを複数デプロイすることで負荷分散や耐障害性の確保が可能
- コンテナの死活監視
- セルフヒーリング
- サービスディスカバリ
- ロードバランシング
- データの管理
- ワークロードの管理
- ログの管理
- 宣言的なコードによる管理
- Kubernetes は YAMLかJSONで宣言的なコードによってデプロイするコンテナや周辺リソースを管理できる
参考情報
3章 Kubernetes 環境の選択肢
ローカル Kubernetes
ローカルで Kubernetes を動かすための選択肢として三つある
- minikube
- Docker Desktop For Mac/Windows
- kind
あとでやりたいやつ
Kubernetes 構築ツール
kubeadm
kubeadm
はKubernetes が公式に提供している構築ツール
Flannel
Flannel
はノード缶を繋ぐネットワーク仮想的なトンネル(オーバーレイネットワーク)を作ることでKubernetes クラスタ内の Pod 同士の実現している
Rancher
Rancher
はオープンソースのコンテナプラットフォームで、Kubernetes の導入ハードルを下げる
- 複数クラスタの統合管理
- Kubernetes クラスタを様々なプラットフォームにデプロイ
- オンプレを含む既存のクラスタを管理
- 複数クラスタに対するアプリケーションデプロイを可能にするMulti-cluster App機能
- 認証、モニタリング及びWebUIを提供
- 豊富なアプリケーションカタログ
- Istioとの統合、連携
マネージド Kubernetes サービス
マネージドの Kubernetes サービスとしてパブリッククラウドを提供する各社が展開している
- GKE(Google Kubernetes Engine)
- AKS(Azure Kubernetes Service)
- EKS(Elastic Kubernetes Service)
4章 APIリソースとkubectl
kubectl インストール をmacOSに入れていく
$ OS_TYPE=darwin
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl"
$ chmod +x kubectl
$ sudo mv kubectl /usr/local/bin/kubectl
$ echo 'source <(kubectl completion zsh)' >> ~/.zshrc
4.2 Kubernetesの基礎
- Kubernetes は Master と Node の2種類のノードから構成されている
- Master はAPIエンドポイントの提供、コンテナスケジューリング、コンテナのスケーリングを担うノードに対し、NodeはDockerが起動するノード
- マニフェストファイルはYAMLかJSONでかき、Masterにリソースの登録をする
4.3 Kubernetes とリソース
- Kubernetesのリソースは多数の種類があり、リソースのカテゴリが存在する
- Workloads APIs :コンテナの実行感するリソース
- Pod,ReplicationController,ReplicaSet,Deployment,DaemonSet,StatefulSet,Job,CronJob
- Service APIs:コンテナを外部公開するようなエンドポイントを提供するリソース
- ClusterIP,ExternalIP,NodePort,LoadBalancer,Headless,ExternalName,Node-Selector,Ingress
- Config & Storage APIs : 設定、機密情報、永続化ボリュームなどに関するリソース
- Secret,ConfigMap,PersistesVolumClaim
- Cluster APIs :セキュリティやクォータなどに関するリソース
- Node,Namespace,PersistentVolume,ResourceQuota,ServiceAccount,Role,ClusterRole,RoleBinding,ClusterRoleBinding,NetworkPolicy
- Metadata APIs : クラスタ内の他のリソースを操作するためのリソース
- LimitRange,HorizontalPodAutoscaler,PodDitruptionBudget,CustomResourceDefinition
- Workloads APIs :コンテナの実行感するリソース
4.4 Namespaceによる仮想的なクラスタの分離
- Namespaceは仮想的なクラスタの分離機能
- 複数チームでの利用、環境分離が可能
- 初期状態では4つのNamespaceが用意されている
- kube-system
- kube-public
- kube-node-lease
- default
- Namespaceの分割粒度は開発するチームごとに分ける
- 環境分割だとアップデートの時に全環境に影響が出る
- prd-nsl/stg-nslのようになることでマニフェストの再利用性が低下する
- Serviceの名前解決時に異なる宛先に通信を行う必要が出る
4.5 CLIツールkubectl
- kubectlの認証情報は
~/.kube/config
に書いている- 編集方法は直接か、
kubectl config
でおこなう -
kubectl config get-context
で一覧取得 -
kubectl config use-context xxx
でcontext切り替え -
kubectl config current-context
で現在のcontext表示
- 編集方法は直接か、
- マニフェストの作成/削除/更新
kubectl create -f yaml
kubectl delete -f yaml
kubectl apply -f yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name: myapp
spec:
containers:
- name: nginx-containers
image: nginx:1.16
5章 Workloads APIs カテゴリ
5.1 Workloads APIs カテゴリの概要
- Workloads APIs カテゴリに分類されるリソースはクラスタ上にコンテナを起動させるのに利用するリソース
- Pod
- ReplicationController
- ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job
- CronJob
5.2 Pod
- Podは1つ以上のコンテナから構成されており、同じPodに含まれるコンテナ同士はネットワークが隔離せず、Pod単位でIPアドレスを共有している
- 多くの場合は1Podにつき1コンテナ
- Podのデザインパターンは大きく3種類
- サイドカーパターン
- アンバサダーパターン:外部システムとのやりとりの代理を行う
- Podないにつのコンテナが含まれるからメインコンテナからは接続先にlocalhostで指定してアンバサダーコンテナにつなげる
- ユースケース:メインコンテナがDBにつなぐときの中継に使うことで疎結合になる
- アダプタパターン:外部からのアクセスのインターフェースとなる
- Prometheusなどの監視ツールで必要データ形式にフォーマットするやつ
- Podの作成
- Pod のテンプレート
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
spec:
containers:
- name: nginx-container
image: nginx:1.16
- 単一Pod の作成
% kubectl apply -f sample-pod.yaml
pod/sample-pod created
% kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-pod 1/1 Running 0 41s
% kubectl get pods --output wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sample-pod 1/1 Running 0 87s 10.1.0.141 docker-desktop <none> <none>
- 複数Podの作成テンプレート
apiVersion: v1
kind: Pod
metadata:
name: sample-2pod
spec:
containers:
- name: nginx-container
image: nginx:1.16
- name: redis-container
image: redis:3.2
- 複数Podの作成とログイン
% kubectl apply -f sample-2pod.yaml
pod/sample-2pod created
% kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-2pod 2/2 Running 0 57s
% kubectl exec -it sample-2pod -- /bin/bash
Defaulted container "nginx-container" out of: nginx-container, redis-container
root@sample-2pod:/#
- hostNetworkを使とNodeのIPアドレスを利用する関係上ポート番号を衝突させられない
- DNSはClusterFirstがデフォルトで、クラスタないDNSを使った名前解決している
- 個別にクラスタ外のDNSを参照可能で、
spec.dnsPolicy:None
を設定する
- 個別にクラスタ外のDNSを参照可能で、
5.3 ReplicaSet/ReplicationController
- ReplicaSet/ReplicationControllerはPodのレプリカを作成し、指定した数のPodを維持し続けるリソース
このスクラップは2023/09/03にクローズされました