harukin721

主に学習記録 🔗 wantedly.com/id/harukin721

Kubernetes完全ガイド 【第2版】 読書会2 Part1

入社歴の浅いメンバーで Kubernetes完全ガイド 【第2版】 読書会2 をやっている。

過去に Kubernetes完全ガイド 【第2版】 の読書会 は実施されているが、その頃は自分たちはまだ入社していなかったのでいま 読書会2 として小規模で開催している。

tech.pepabo.com

第1章 Docker の復習

Kubernetes 利用時に Docker に関して知っておくべき知識

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

第2章 なぜ Kubernetes が必要なのか?

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

Kubernetes を使うことで、自動化が可能かつシンプルなオペレーションになる

  • 宣言的なコードによる管理(Infrastructure as Code)
  • スケーリング / オートスケーリング
  • スケジューリング
  • リソース管理
  • セルフヒーリング
  • ロードバランシングとサービスディスカバリ
  • データの管理

第3章 Kubernetes 環境の選択肢

Kubernetes クラスタを利用するには、大きく3種類の方法がある

第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
  • 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
# コンテナイメージを 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 オプション)

github.com

他にもいろいろと機能があったけど ArgoCD 管理でやると良さそうなことなどはここに書かなかった。ArgoCD も勉強しないと。

(Part2 に続く...)

参考

book.impress.co.jp