Closed6

Kubernetes完全ガイド読書メモ

Sadayoshi Tada / taddySadayoshi Tada / taddy

はじめに

このスクラップではCKADやCKAといった資格取得のためにKubernetes完全ガイドを購入し、勉強したメモをまとめていきます。
https://www.amazon.co.jp/dp/4295009792

やり方

  • 章ごとに内容を整理する
  • 関連の技術トピックを調べたことをまとめる
Sadayoshi Tada / taddySadayoshi Tada / taddy

1章 Docker の復習と「Hello,Kubernetes」

Kubernetesをやる上でDockerについて学んでおくべきこと

  • Dockerコンテナの設計
  • Dockerfileの書き方
  • Dockerイメージのビルド
  • Dockerレジストリへのイメージのプッシュ

Dockerコンテナの設計

Dockerコンテナを使う時に気をつけること

  • Immutable Infrastructureなイメージにすること
  • 1コンテナにつき1プロセス
  • コンテナイメージは軽量にする
  • 実行ユーザーをroot以外にする
Sadayoshi Tada / taddySadayoshi Tada / taddy

2章 なぜ Kubernetes が必要か?

Kubernetes はコンテナ化されたアプリケーションのデプロイ、スケーリングなどの管理を自動化するためのプラットフォーム(コンテナオーケストレーションエンジン)

Kubernetes のメリット

  • 複数のノード管理
  • コンテナのスケジューリング
  • リソース管理
    • Kubernetes NodeのCPUやメモリの秋リソース状況に従ってスケジュールされるからコンテナ配置するのかを管理する必要はない
  • ローリングアップデート
  • スケーリング/オートスケーリング
    • コンテナを複数デプロイすることで負荷分散や耐障害性の確保が可能
  • コンテナの死活監視
  • セルフヒーリング
  • サービスディスカバリ
  • ロードバランシング
  • データの管理
  • ワークロードの管理
  • ログの管理
  • 宣言的なコードによる管理
    • Kubernetes は YAMLかJSONで宣言的なコードによってデプロイするコンテナや周辺リソースを管理できる

参考情報
https://www.slideshare.net/KoheiTokunaga/dockerkubernetes-244176142

Sadayoshi Tada / taddySadayoshi Tada / taddy

3章 Kubernetes 環境の選択肢

ローカル Kubernetes

ローカルで Kubernetes を動かすための選択肢として三つある

  • minikube
  • Docker Desktop For Mac/Windows
  • kind

あとでやりたいやつ
https://qiita.com/Kta-M/items/ce475c0063d3d3f36d5d

Kubernetes 構築ツール

kubeadm

kubeadmはKubernetes が公式に提供している構築ツール

https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

Flannel

Flannelはノード缶を繋ぐネットワーク仮想的なトンネル(オーバーレイネットワーク)を作ることでKubernetes クラスタ内の Pod 同士の実現している

https://kubernetes.io/ja/docs/concepts/cluster-administration/networking/

Rancher

Rancherはオープンソースのコンテナプラットフォームで、Kubernetes の導入ハードルを下げる

  • 複数クラスタの統合管理
  • Kubernetes クラスタを様々なプラットフォームにデプロイ
  • オンプレを含む既存のクラスタを管理
  • 複数クラスタに対するアプリケーションデプロイを可能にするMulti-cluster App機能
  • 認証、モニタリング及びWebUIを提供
  • 豊富なアプリケーションカタログ
  • Istioとの統合、連携

マネージド Kubernetes サービス

マネージドの Kubernetes サービスとしてパブリッククラウドを提供する各社が展開している

  • GKE(Google Kubernetes Engine)
  • AKS(Azure Kubernetes Service)
  • EKS(Elastic Kubernetes Service)
Sadayoshi Tada / taddySadayoshi Tada / taddy

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

https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

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

https://kubernetes.io/ja/docs/concepts/overview/kubernetes-api/

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
Sadayoshi Tada / taddySadayoshi Tada / taddy

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を設定する

5.3 ReplicaSet/ReplicationController

  • ReplicaSet/ReplicationControllerはPodのレプリカを作成し、指定した数のPodを維持し続けるリソース
このスクラップは2023/09/03にクローズされました