『Kubernetesで実践するクラウドネイティブDevOps』学習メモ

Ch01 Cloud Revolution

目的

  • 3つの革命
  • → Cloud Native with OS:Kubernetes
  • revolutionのhistory, 重要性を見て,ソフトウェア deliveryへの作用を考える
    • 想定される変化
  • Cloud Native DevOpsがtheme

概要

  • (1) クラウド
    • 処理能力を買う
    • SaaS
    • Iaas
      • Undifferentiated Heavy Lifting(UHL)
  • (2) DevOps
    • developmentとoperationsの連携
      • 信頼性と正確性の責任共有
      • 拡張性Up
    • 技術ではなく組織力,人間の問題
    • merit in ビジネス
    • Infrastructure as Code
      • クラウドをautomateするソフトウェアのdeveloperが運用エンジニア
    • collaboration型でコード中心 → コンテナ
    • development, operationsの統一
  • (3) コンテナ
    • 依存関係, config
    • history, background
      • Puppet, AnsibleなどのConfig Management System
      • omnibus package
      • VM Image
        • 問題多い(コスト,不安定)
    • 特性: 可搬容量,コストdown, 規模の経済,扱いやすさ
    • イメージ fileをコンテナ runtimeで実行
    • 仮想化による実行効率downの解決 with real CPU
    • file システムのlayerをaddress指定
      • → コンテナ間でlayerの共有や再利用〇
    • コンテナは再利用の単位
      • scalingの単位,リソース配分の単位でもある
    • コンテナが依存するのは唯一OSのkernelのみ
      • 分散 システムの設計パターンを開発
      • コンテナ orchestrator
    • Kubernetes
      • history @ Borg
        • コンテナをserverのpoolで実行するための割り当てとschedulingを行う集中管理システム
    • values
      • Kubernetesによる従来のシステム 管理 taskのautomate
      • デプロイの容易さ
        • zero down time デプロイ with Rolling Update
        • canaria デプロイ, bluegreen デプロイ in Continuous デプロイ
        • auto scale
        • 冗長性とfail overでの信頼性と耐障害性up
        • cost down by 能力の浪費cut
        • クラウド providerと疎である by Kubernetesの抽象化
        • コンテナはソフトウェアを定義するための可搬性の方法 & Kubernetes リソースはソフトウェアの実行方法の可搬性のための方法
    • Kubernetesの制約
      • DBなどのステートフルなworkloadへのcost 大
      • → 代わりにmanaged serviceを使用
      • Faas, (server served platform). e.g. AWS Lambda
      • functionとコンテナのhybrid: Funtainer
        • → Knative
  • (4) クラウドネイティブ
    • 一般的用法: クラウド, コンテナ, orchestrationを活用し,多くの場合OSSをbaseとする,最先端アプリケーションやserviceを簡潔に表現する手段.
      • 自動化されたInfrastructure as Code
    • 特性
      • automate可能
      • Ubiquitous and flexible
      • resilient(弾力的) and scalable
      • dynamic
      • Obserbable
      • distribution: 分散化,非集中化
        • codeを単一のentity(monolithus)としてデプロイ
        • or multi 分散 micro servicesで構成
        • monolithusの方が理解しやすく,相互作用を追跡できる
          • but, monolithusは拡張difficult

作用

  • 運用の観点
    • Developer Productivity Engineering(Developer生産性工学), DPE team
    • Site Reliability Engineering(SRE)
    • Kubernetesの重要性 pointsのまとめ

Ch02 Kubernetes first step

概要

  • Docker
    • Dockerは複数で異なる but 関連する要素から成る
    • コンテナ イメージ format
    • コンテナ run time library
      • コンテナのlifecycleの管理
    • command line tool
    • コンテナ 管理用API
    • コンテナ イメージ: ZIP fileのようなもの
      • 実行のためには,ID or URLを指定するだけ

詳細

  • (1) コンテナ build

    • docker image build with Dockerfile
      • Dockerfile specifies all what イメージ has to have
      • 既存のイメージ(: base イメージ)にもとづいて新しいイメージをbuild
      • multi stage build
        • scratch イメージにbuilded binaryをcopy → 軽量化, attack surface(攻撃対象領域)の縮小
      • -tによるtagづけ
      • portの転送

          '''
           -p HOST_PORT:CONTAINER_PORT 
          '''
        
  • (2) コンテナ Registry

    • Docker IDをgetし,Docker Hubにオリジナル イメージをpush
    • イメージの命名とpush
      • → どこからでもコンテナ イメージを実行可能
  • (3) Kubernetes
    • Enable Kubernetes @Docker Desktop
    • demo アプリケーションの実行
      • deploymentのcreate
      • port forward
  • (4) Minikube

まとめ

  • コンテナをbuild and runの実践

Ch03 Kubernetes 環境の選択

目的

  • クラスタのbasical structureの理解
  • Kubernetesの実行方法を決定するための情報
  • managed serviceの長短

概要

  • クラスタのarchitecture
    • Kubernetesがmulti serverを接続して1つのクラスタとする
    • controll plain
      • このcomponentを実行するメンバ(ノード): master ノード
      • kube-apiserver
      • etcd: DB
      • kube-scheduler
      • kube-controller-manager
      • クラウド-controller-manager
    • ノードのcomponent @Worker ノード
      • kubelet
      • kube-proxy
      • コンテナ runtime
    • 高可用性
      • network partitionも処理〇
      • controll platformの高可用性の重要性
    • multi availability zoneへの分散
    • testの実施が重要

詳細

  • (1) self hosting Kubernetesのcost
    • buy or build
    • cost 大.engineerの給与約100万ドル
    • 初期セットアップから稼働を通してcareが必要
    • まずはmanaged service
  • (2) managed Kubernetes services
    • GKE
    • EKS
      • 後発&割高
    • AKS
    • OpenShift: PaaS
    • IBM Cloud Kubernetes サービス
    • HKs
  • (3) turnkey方式のKubernetes solution
  • (4) Kubernetes installer
    • kops @AWS
    • Kubespray with on-premised install & bare(何も導入されていない) metal server
    • TK8 with Terraform and Kubespray
    • Kubernetes The Hard Way: 教育に◎
    • kubeadm: Kubernetesのinstallに◎
    • Tarmak: 変更をノード 設定にrolloutする処理の迅速性と安全性up
    • RKE: simple & high-speed
    • Puppet Kubernetes module
    • Kubeformation: 既存のautomate toolのwrapper
  • (5) 原則
    • running ソフトウェアを減らす
      • standard technologyのuse
      • cost 大のタスクはoutsource
      • 長寿の競争優位
    • → managed Kubernetesの推奨
    • クラウドネイティブ: 差別化につながらない要素をoutsourceしビジネスを加速
    • self-hostingならkops, Kubespray
    • 限られた予算 e.g. Raspberry Pi
  • (6) clusterless コンテナ service

まとめ

Ch04 Kubernetes objectの基本操作

目的

  • Kubernetesの基本object: Pod, Deployment, サービス + Helm tool

概要

  • (1) Deployment
    • Superviserの機能 @Kubernetes
    • 個々のプログラムに対応
      • Deployment Objectを作成
        • Deployment controllerによる制御
    • Default: コンテナのrestart
    • Deployment 情報 get command
  • (2) Pod
    • 1つ以上のコンテナのグループ ← クジラの群れ
    • Podの仕様(spec: specification)のcontainers list
    • kubectl run: Deploymentを作成 → DeploymentがPodを起動
    • Deployment: 「あるコンテナを持つPodを1つ実行し続ける必要がある」といった,望ましい状態の宣言
  • (3) ReplicaSet
    • Deployment-ReplicaSet-Pod
    • ReplicaSet controllerが必要な数(同一)のPod,ReplicaSetのグループを管理
    • → DeploymentがReplicaSetを管理: ユーザのReplicaSetのupdateをcontroll

詳細

  • (1) Keep desirable state
    • 調整loop
      • Deploymentのshutdown
  • (2) Kubernetes scheduler
    • DeploymentがKubernetes DBにPod リソースを作成 & Pod into cueue
      • → schedulerがPodを取り出してrunnabeなノードを見つける
      • ⇔ Podをノードにscheduling
      • → kubeletがPodが含むコンテナを起動
  • (3) YAML形式のリソース manifest
    • Kubernetesは本質的に宣言的
      • → continuous reconcliation(調整; cal-, -cli-: 呼び集める)
    • → specを変更すればKubernetesが処理してくれる.
    • DeploymentやPodなどのKubernetesのリソースはすべて内部のDBのrecordで表現
      • 「kubectl run」でnew recordをinsert or 「リソースのmanifestを読み取るよう指示」
    • コンテナ イメージの名前とPortが重要
      • @DeploymentのYAML Manifest
      • ↑→ kubectl runで指定していた
    • kubectl applyでmanifestをクラスタに送信
    • サービス リソース
      • 単一の変化しないIP address or DNSnameを付与
        • → 対応するPodへ自動ルーティング
        • → Podにnetwork経由でconnect
      • Web proxyやload balancerのようなもの
        • backendのPodのグループにリクエストを転送
    • サービスのYAML Manifest
      • multi Pod → load balance
    • 後始末 kubectl delete -f Kubernetes/.
      • Manifestのdirectoryをdelete
    • kubectlでのクラスタへのquery
      • kubectl get
      • kubectl describe pod/dem-dev-6c...
    • YAML Manifestでの宣言的デプロイにおける繰り返しの解消 → Helm
  • (4) Helm: Kubernetes package manager
    • command line toolでDeployment リソースとサービスをHelmが作成.
      • アプリケーションをinstall and configure
      • chart: real コンテナ イメージを含まないyaml manifestのwrapper.同じクラスタ内に何度もinstall可能
        • アプリケーションをKubernetesで実行するために必要なリソースの定義がすべて格納されるHelm package
      • repository: chartの収集と共有
      • release: Kubernetes クラスタで実行されるchartの特定のinstance
      • helm install -name
      • helm list, helm status

作用

  • 何ができるかを理解
    • ↑ PodやDeploymentのメカニズム

Ch05 リソース 管理

目的

  • クラスタの最大活用
    • リソースの使用状況の管理と最適化など

概要

  • リソースの理解
    • Kubernetes schedulerの観点
      • Podが求めるリソースの量を把握
    • リソースの単位: CPU, milliCPU, MiB@memory
    • リソース要求: min
    • リソース制限: max
      • over commit〇: ノードのリソース総量を超えた制限可能
    • コンテナのminimize

詳細

  • (1) コンテナ lifecycle 管理
    • Liveness probe by HTTP
    • Probeの遅延と頻度
      • death loopの回避
      • initialDelaySeconds, periodSeconds
    • ほかのtypeのProbe
    • Readiness Probe: 「一時的にリクエスト処理不可能」を知らせる. → 常に「200 OK」を返す必要
      • zero downtime upgradeにeffective
    • file based Readiness Probe
    • minReadySeconds
    • Pod Disruption Budget: 失ってもよいPodの数
      • minAvailable, maxUnavailable
  • (2) Namespace
    • クラスタ横断でリソースの使用状況を管理
    • クラスタをpartition化
      • 別のnamespaceからは見えない
    • nest不可
    • kubectl get pods --namespace production
    • default namespaceは使わない
    • サービス間の通信
    • namespaceでのリソースのcontroll → ResourceQuota
      • kubectl get resourcequotas -n demo
    • LimitRangeでnamespaceないのdefaultを指定
      • ただし,基本はコンテナに設定する → コンテナを見ればわかるように
  • (3) クラスタ cost optimize
    • Deploymentのoptimize
      • serviceが求める処理能力と可用性のビジネス要件
      • その要件より少なく達成できるか
    • Podのoptimize
      • normal 運用のmax + α → リソースのPackman状態の回避
    • Vertical Pod Autoscalar
    • Nodeのoptimize
      • 観察
      • 典型的なPodをat least 5個実行数rのに十分なサイズ
      • stranded リソース(残されたリソース)の割合をunder 10%
      • 10個いじょうなら5%
    • Storageのoptimize
      • I/O operation 毎秒(IOPS)で観察
      • 未使用リソースのclean up
        • kubeletのgarbage collection設定を調整
      • 所有者metadata Annotationを使用し,Annotationのないリソースを強制終了候補にする
        • ↑ すべてのリソースに所有者Annotationを設定
      • 使用率が低いリソースの発見
        • 受信リクエストの数をPodがメトリクスとして公開
        • Web コンソールで各PodのCPUとメモリの使用率の数値をチェック
      • finished jobのclean up
    • 余剰capacityのcheck
    • reserved instanceのuseでのcost down
    • preemptive (spot) instance
      • preemptive ノードはクラスタ全体の2/3以下にする
      • ノード affinityでpreemptive ノードへのscheduling制御
    • Kubernetes scheduler: workloadを多くのノードに均等にassign & replicaを異なるノードにおいて高可用性
      • schedulerはノード間でPodを移動しない.
        • → Deschedulerというtoolでのmove

Ch06 クラスタの運用

概要

  • (1) クラスタのsizingとscaling
    • クラスタのcostにはノードの数とサイズが作用する
    • capacity plan
    • ノードとinstance

      • ノード size ← providerが提供するcost performanceが良いものを選択
      • クラウド instanceのtype
        • 1つのvCPU + 3~4GiBのmemoryがmin
      • special typeのノード e.g. gpu, windows
      • bare metal server
    • クラスタのscaling

      • instance グループ, ノード pool
      • scale down
      • automatic scale → 基本は不要
  • (2) 適合性チェック
  • (3) 検証と監査
    • tool
      • (kubernete Guard: Kubernetes クラスタのcommon 問題 check)
      • Copper / instrumenta / Conftest
      • kube-bench: 不要なことも多い
      • Kubernetesの監査logging
  • (4) Chaos Test
    • Chaos Monkey Test
    • 自動化と継続
      • chaos kube
      • kube-monkey
      • powerful Seal
    • → 高可用性を保証

Ch07 Kubernetes's tools

目的

  • Kubernetesの作業のためのtoolやutility
  • kubectlの高度な使い方と便利なutility

概要

  • (1) kubectl
    • shell alias
      • @.bash_profile: alias k=kubectl
    • flagの短縮形のuse
    • リソース typeの省略
    • kubectlでの自動補完 + aliasでの自動補完
    • helpの表示: kubectl -h
    • Objectのhelp: kubectl explain {pods, RESOURCE.FIELD, --recursive}
    • 詳細な出力の表示
      • kubectl get pods -o wide
    • JSON形式の出力とjqなどでのfilter (→ jqのinstall)
      • or JSON Pathでのquery
    • Objectのsupervise: kubectl get pods --watch
    • kubectl describe pods demo-xxx・・・
  • (2) リソースを使った作業
    • 命令的(←→宣言的)なkubectl command (imperative(←→declarative))
      • kubectl createでリソースをexplicitlyに作成
      • kubectl deleteでリソースを削除
      • kubectl edit
    • 本番クラスタにはimperativeは×
      • 代わりにkubectl apply
    • kubectlでのmanifestの作成
    • リソースの差分チェック: kubectl diff -f dep.yaml
      • kubectl applyの前に行う
  • (3) コンテナを使う作業
    • log: コンテナがstandard output or standard error outputのstreamに書くものすべて
    • logの閲覧: kubectl logs -n kube-システム --tail=20 --follow(-f) etcd-docker・・・
      • → supervise continuous output
      • --tail/--since/--timestamps
    • コンテナへのattach
    • KubesprayでのKubernetes リソースの監視
    • コンテナ Portの転送: kubectl port-forward
    • コンテナでのcommand execution: kubectl exec
    • debugのためのコンテナ実行
      • kubectl run NAME --イメージ=IMAGE --rm(→del after completed) --it(i: 対話型, t: terminal) --restart=Never --command --・・・
    • BusyBox(BB) commandの仕様
    • BBのコンテナへの追加
      • BBはたった1MiB
      • DockerfileでCOPY --from 命令
        • → kubectl exec -it POD_NAME /bin/busybox sh
    • コンテナへのプログラムのinstall
    • kubesquashでのlive debug(本格的debugger)
      • debuggerをコンテナにアタッチ: kubesquash
      • with goのdebugger: dlv
  • (4) ContextとNamespace
    • Context: クラスタ, ユーザ, Namespaceの組み合わせ
      • → bookmarkになる
    • kubectl: 今のContext
      • kubectl config get-context
    • kubectxとbubensでContext切り替え高速化
    • kube-ps1で現在のContextをpromptに追加
      • → [( )]
  • (5) Kubernetesのshellとtool
    • kube-shell: 補完のpopup
    • Click: 対話型kubectl
    • kubed-sh: クラスタ自体の上でプログラムを実行
    • Stern: log
  • (6) オリジナル Kubernetes toolの構築
    • client-goでkubectlができるすべてを実現

作用

  • kubectlで必要なことは何でもできる

Ch08 コンテナの実行

目的

  • ~Ch07: 運用
  • Ch08: 最も基礎的なObject in Kubernetes: コンテナ

概要

  • (1) コンテナとPod
    • Pod: Kubernetesでの{minimum デプロイ, schedule}単位
      • Pod Objectが{単一/複数のグループ} コンテナを表す
      • Kubernetesすべての実行はPodを使用する
      • 同じ実行環境上のアプリケーション コンテナ + storage volumeの集まり
        • 1つのPod内のコンテナはすべて同じマシン上に配置
    • コンテナ: 1つのソフトウェア, 依存関係, config, データなど,実行に関するものすべて
      • 実行の担保はプロセス
        • プロセス: 実行するアプリケーションのbinary codeとmemory statusを表現し,同じglobalなNamespaceに存在
          • → プロセス間のやり取り〇.同じリソースのpoolを共有
      • コンテナ: オリジナル Namespace内にある分離されたプロセス(のグループ)を表現する
      • コンテナの内外ではプロセスは隠れる
    • コンテナの構成要素
      • 軽量VM
      • 1つのことのみ実行 e.g. 単純な自己完結型service
      • entry point: 起動時に実行されるコマンド
    • Podの構成要素
      • Pod: 相互に通信してデータを共有する必要がある
        • コンテナのグループを表現
        • ともにschedule. 起動終了も同時.同じ物理マシン上で実行
          • ⇔ 常に同じノード上で実行
        • 異なるマシンで動作しないコンテナをPodでグループ化する
  • (2) コンテナのManifest
    • 複数のコンテナsのtemplate spec
      • name, イメージ
    • イメージ識別子
      • registry hostname, repository Namespace, イメージ repository, tagの4つで構成
      • tagの例
    • latest tag
      • default: latest e.g. alpine:latest
      • 本番環境ではlatestは×
    • コンテナのdigestで決定的デプロイ
      • ←→ tagでの非決定的デプロイ
    • base イメージのtag
      • 特定のtag/ digestのuse
    • Port: Kubernetes上には意味なし.しかし,Manifestには含める
    • リソース要求制限
    • イメージのpullについてのpolicy: imagePullPolicy
      • 基本はIfNotPresent
    • 環境変数の設定
  • (3) コンテナのSecurity
    • principle of least privilege
      • bug riskのminimize
    • 一般ユーザの割り当て: runAsUser
      • UID 1000: first not root ユーザ
      • security maximize: コンテナごとのUID
      • データを共有するためのアクセス: 共通UID
    • runAsNonRoot: true
    • readOnlyRootFileSystem: true
    • allowPrivilegeEscalation: false
      • setuid(権限昇格)のmechanismから守る.
    • Capability
      • 従来のnormal/super ユーザ問題への対応
      • default CapabilityのDropと特定のCapabilityのadd
    • 一部のConfigはPodのレベルでも〇
    • Pod Security Policy リソースにより,クラスタ levelでsecurityを指定
    • Podのサービス Accountの指定
      • defaultは,Namespaceのdefaultのサービス Accountが持つpermissionで実行
  • (4) Volume
    • 同じPodの別のコンテナとのデータ共有 & restart後もデータを永続保持
    • emptyDir
      • download fileや生成データのcaching
      • データ処理ジョブ用のtmpworkspace
      • Pod内コンテナのファイル共有
      • コンテナへのマウント方法
        • PodのVolumes field
        • コンテナのvolumeMounts field
      • lockはない
    • 永続Volume
  • (5) restart policy
    • restartPolicy: Always(default)/ OnFailure/ Never
    • → Job リソース
  • (6) Image Pull Secret
    • registryに認証情報を提供

まとめ

  • コンテナの概要
  • Pod内でのコンテナの連携
  • Kubernetesでのコンテナの実行のコントロール

Ch09 Pod 管理

目的

  • Podのfeatureを見る

概要

  • (1) Label
    • definition: PodなどのObjectにつくkey-value pair
      • core システムのsemanticsを直に構成しない.Object識別属性を指定するためのLabel
      • e.g. Podが属するアプリケーションをlabeling → documentation
    • selectorと組み合わせて価値が生じる
      • selector: Label(or Labelのset)との一致条件を記述
        • → リソースのグループをLabelでspecify
      • 用途
        • サービスとPodを接続
        • kubectl get ~ --selector(-lでもOK) app=demo
          • --show-labelsでLabelを確認
    • サービスは等価selectorのみ
      • デプロイやkubectlなどの高度リソースは,高度なselector
      • e.g.
        • kubectl get pods -l app!=demo
        • kubectl get pods -l "環境 in(notin) (staging, production)"
    • Labelの使い方
      • staging/real
      • カナリアデプロイ track: stable/canary
    • Label: リソースを識別 ←→ Annotation: 外部toolやservice
      • どちらもk-v pair
  • (2) Node Affinity
    • schedulingの選好性の表現
      • hard: required ...
      • soft: preferred ...
      • schedule時のみ
    • Hard Affinity
      • Podを実行させたいノードの種類を述べる. @nodeSelectorTerms
    • Soft Affinity
      • weightの指定
  • (3) PodのAffinityとAnti-Affinity
    • ノード内のPodの状態をAffinityに反映する
    • Podの同居: hard/soft Pod Affinity
    • Podの分離: podAntiAffinity
    • soft Anti-Affinity
    • Pod Affinityでしか解決できない問題にのみ使用
  • (4) Taint(汚染)とToleration
    • ノードの属性に基づき,ノードがPodを避ける
    • kubectl taint ←→ kubectl taint ~-(-: minusでdelete)
    • TolerationでTaintにも許容
    • e.g. networkが×のときのunreachable
  • (5) Pod Controller
    • 手動workのautomate
    • 主要はデプロイ → ReplicaSetを管理
    • デプロイ以外
      • DaemonSet: クラスタ内の個々のノードで,Podのcopyを1つだけ実行
        • e.g. logging
      • StatefulSet: Podを特定の順序で起動・終了
        • 番号でPodを識別 to Redis, MongoDB, Cassandra
        • Headless サービスでaddress指定
    • Job: Podを指定した回数だけ実行する
      • ←→ デプロイ Pod数を指定しcontinuousに実行
      • completions
      • parallelism
    • Cron Job
      • Jobのschedule
    • Horizontal Pod Autoscaler(HPA)
      • needsに応じてKubernetesがreplica数をautoscale
        • Vertical: replica自体を大/小化
      • CPU使用率などのメトリクス{での決定, の指定}
        • システム/service(← ユーザのdefinition) メトリクス
    • Pod Preset
      • admission controllerの一部
        • admission controller: objectへの変更を監視.変更の直前にaction
      • Pod Presetのconfigは,個々のPodのconfigとmergeされる
    • OperatorとCustom リソース Definition
      • ステートフル setを超えたcomplicateな管理が必要なアプリケーションのため.
  • (6) Ingress リソース
    • Ingress: サービスの前のload balancer
    • サービスはクラスタ内の内部trafficのルーティング
      • ←→ Ingressクラスタやmicroserviceへの入力となる外部trafficのルーティング
      • 異なるサービスへの転送: fanout
      • URL, HTTP Host headerでのルーティング
    • TLS(SSLと呼ばれていたもの)
      • 証明書の共有を単一のIngress リソースで管理: TLS終端と呼ぶ
      • KubernetesのSecretで証明書を保存
        • 既存証明書も〇
      • Cert-managerでLet's Encrypt証明書を自動取得
        • ↑ kube-legoの後継
    • Ingress Controller
      • Ingress Controllerが認識する特別なAnnotation
  • (7) Istio
    • サービス mesh: 複数アプリケーションsやサービスの相互通信のある環境の運用のための技術
  • (8) Envoy
    • 高度なload balancer

作用

  • Kubernetesの全てはPodの実行にかかわる

Ch10 Config, Secret データ

目的

  • Kubernetesのlogicとconfigの分離
    • Podのspecでdefineする環境変数で値をアプリケーションに引き渡す
    • or ConfigMapとSecret ObjectでConfigをKubernetesに直に保存

概要

  • (1) ConfigMap
    • KubernetesにConfig データを保存するためのmain Object
    • kubectl create configmap demo-config --namespace=demo --from-file=config.yaml で作成
    • kubectl getでManifestを出力
    • ConfigMapで環境変数を設定
      • アプリケーションの環境変数の読み取り
      • ConfigMapのManifest file
      • デプロイの設定
        • イメージ:のtag
        • enc: のfield
          • name-valueのpair
          • valueFromで,literalでなく別のところの値を取得
          • configMapKeyRef
      • デプロイは自身のspecが更新されたときのみPodを更新する
    • ConfigMapから環境全体を設定
      • encFromでConfigMapから全keyを取り込む
        • ←→ envがprior
    • command argumentで環境変数を使う
      • $(VARIABLE)は環境変数のVARIABLEの値で置き換える
        • → コンテナのentry pointにcommand line argumentとして与えられる
    • ConfigMapからConfig fileを作る

      '''

        データ:
        config: |
            greeting: Buongiorno
      

      '''

      • |は生データのblockを表す

      '''

        volumes:
        - name:
          configMap:
            name:
            items:
            - key: config
              path: demo.yaml
      

      '''

    • Configの変更を伴うPodの更新 @Helm

      • Annotationを設定 @デプロイのyaml
  • (2) KubernetesのSecret
    • secret データの保存のためのSecret
    • 環境変数としてSecretを使う
      • secretKeyRef ≒ configMapKeyRef
    • Secretのfileへの書き込み
    • Secretの読み取り
    • RBACによるaccess controll → 11.1.2
    • 保存データの暗号化
      • kubectl describe pod -n kube-システム -l component=kube-apiserver | grep encryption
    • HelmのAnnotationでSecretを保持〇
  • (3) Secret Data Management戦略
    • 問題
      • secret データの可用性のための保存場所
      • running アプリケーションがsecret データを使う
      • secret データの変更へのrunning アプリケーションの対応
    • version 管理でのsecret データのencrypt
      • デプロイ時にdecrypt
      • secret データのrotationがdifficult
      • 容易さ〇,柔軟さ〇
    • secret データのremote 保存
      • 一元補完
      • 手間アリ
      • 変更の管理のために監査ログが必要
      • workflow必要
    • 専用のsecret データ 管理 tool
      • 大規模組織のみ
      • infrastructureがcomplicateになる.コスト大
    • 推奨
      • SOPSなどの軽量encrypt toolのuse
  • (4) SOPSでのsecret データのencrypt
    • SOPS(Secrets OPerationS): Mozilla projectによる
      • YAML, JSON, Binary fileと組み合わせて使用〇
      • 複数のencrypt backendが使える
    • secret データの値のみencrypt
    • helm-secrets pluginでSOPSを使える
    • DGP protocol with public key
    • GnuPGのinstall
      • key fingerprint
    • SOPSのinstall
    • decrypt check: sops --decrypt xxxx.yaml
      • デプロイではSOPSをdecrypt modeで使用
        • → 平文fileは使用後必ず削除. Not check in
    • KMS backendも可能

作用

  • 必要なconfigやデータをアプリケーションと結びつける方法の理解

Ch11 Security and Backup

目的

  • Kubernetesにおけるsecurityとaccess controllの仕組みの検討
  • 脆弱性をscanするための代表的toolやservice
  • Kubernetesのデータとstateのbackup と復元方法

概要

  • (1) access controllとpermission
    • クラスタ別のaccess controll
      • クラスタ運用者/ アプリケーション developerの2group化
      • 本番/ staging
    • RBAC(Role-Based Access Control) @Kubernetes
      • 有効化
        • 確認: kubectl describe pod ...
    • Role
      • ユーザが持つpermissionの特定のsetをroleが統制
      • namespaceやクラスタを対象に
      • RoleBinding ObjectでユーザとRoleを紐づけ
      • 加法的Permission
    • 必要なrole: defined roleのクラスタ-admin, edit, viewでおおよその要件は〇
    • クラスタ-admin ≒ root
      • not クラスタ 運用者やinternetにopenなservice accountには×
    • アプリケーション専用のservice accountに対してRoleBinding Objectでroleを紐づける
    • CD toolにのみアプリケーションのデプロイを許可
      • "edit" role
    • RBACの問題の対処方法
      • API serverのログでRBAC DENYを探す
  • (2) Security Scan
    • Clair: OSSのコンテナ scanner
    • Aqua Security: 商用. free版もある.(Micro Scanner)
      • kube-hunterというOSS toolもある
    • Anchore Engine: OSS, コンテナ内すべての部品表を示す
  • (3) Backup
    • replication != backup
    • etcdのbackup: 重要
      • clustering, backup, replication
    • 必要なデプロイのためのInfrastructure as Code
      • YAML ManifestかHelm Chartをversion 管理
        • → 宣言的管理
      • Manifest fileから変更を適用
      • クラスタのsnapshotの作成
    • Veleno: OSS. クラスタのstateと永続データのbackupと復元
      • 使い方
      • 1つで完結したbackup
      • 手順書の作成と復元テスト at least once of month
      • scheduling
      • リソースとデータをクラスタ間で以降: lift&shiftもできる
  • (4) クラスタのstatusの監視
    • kubectl
      • kubectl get
        • componentstatuses → scheduler, controller-manager, etcd
        • nodes → describeでdetailを見る
        • pods { --all-namespaces, -A }
      • kubectl top { nodes, pods }
        • → CPUとメモリの使用率,capacityを見る
    • クラウド providerのconsole
    • Kubernetes Dashboard
      • securityが重要
      • never public internet
      • minimumの権限.kubectl proxy経由のaccess
      • 不要なら使わない
    • Weave Scope: クラスタの監視と視覚化
    • kube-ops-view: クラスタ内の視覚化
    • ノード-問題-detector: Kubernetesのaddon ノードの問題の検出

作用

  • 知識・思考・注意を要するcontinuous プロセス: security

Ch12 Kubernetes アプリケーションのデプロイ

目的

  • Manifest fileからアプリケーションを実行
  • アプリケーション用のHelm Chartのbuild

概要

  • (1) HelmでのManifestのbuild
    • fileの保守 + 配布の問題を解決
      • 設定値や変数を生のmanifest fileから分離
      • ほかのアプリケーションやserviceへの依存関係も公開できる
    • Chartの内部校正
      • directory
      • Chart.yaml
        • Helm Chart名とversion: 必須
      • Values.yaml
        • ユーザが修正可能
        • 自由な形式
        • chart内のどこからでも参照
    • Helm template
      • deployment.yamlとservice.yamlがtemplateになっている
      • 二重の中括弧: Goのtemplate文法
      • 変数での補完
        • loop, 式, 条件, functionも〇
      • doublequote → {{ ~ | quote }}
    • 依存関係の指定 → helm 依存関係 update
  • (2) Helm Chartのデプロイ
    • 変数の設定
      • 追加の値file. releaseにおける値の指定: helm install ~ --values...
        • 値の確認: helm inspect values
      • Helmでのアプリケーションの更新.何度でも〇
        • helm upgrade \<既存のデプロイ>
    • 指定のversionへのrollback: helm rollback \<デプロイ name> 1
      • rollforwardもrollbackで〇
      • helm-monitorによるauto rollback
    • Helm Chart Repositoryの作成
      • 普通はアプリケーション独自のrepositoryに保存のため不要
    • Secret by SOPS in Helm Chart
      • secret データを値fileにいれ,SOPSでencrypt
      • command, 適用手順
  • (3) Helm fileによる複数 Chartの管理
    • クラスタにinstallerする一式を単一のcommandでデプロイ
    • helmfile.yaml
      • repositoriesに参照するHelm Chart Repositoryのリストを定義
      • releasesでデプロイしたいアプリケーションを定義
      • 相対pathでdemo chartと値fileを指定
      • setで値の上書き
    • helmfileの適用: helmfile sync
      • CD パイプラインでhelm sync を自動実行
    • 個別/helmfileは統一
      • → a single source of truthを守る
  • (4) 高度なManifest 管理 tool
    • ksonnet: 計算やlogicが必要な大規模でcomplicateなデプロイに〇
      • → projectが中止
      • Jsonnet: JSONの拡張.KubernetesJSONも〇
      • prototypeの導入: よく使われるManifest pattern
    • Kapitan
      • 設定値の階層DB: inventory
        • → 環境やアプリケーションに合わせて異なる値でmanifest patternを再利用
    • kustomize
      • plainなYAML
      • overlayでパッチとして適用
      • kustomize build ~ | kubectl apply -f ~
    • kompose
      • docker-compose.yml: 連携して機能する一連のコンテナを定義, and デプロイ + コンテナの通信方法を定義
      • Kubernetes Manifestに変換するtool
    • Ansible
    • kubeval
      • Manifestの検証 to schema by version
      • CD パイプラインへの追加が〇
      • Conftestも〇

作用

Ch13 Development workflow

目的

  • localのdevelopmentからKubernetes クラスタへの更新のデプロイまでのアプリケーションのlifecycleを扱う

概要

  • (1) development tool
    • Skaffold: development workflowのspeed up
      • skaffold.yamlにworkflowを定義
      • → skaffold command line toolの実行でパイプライン start
    • Draft
      • Skaffoldと同様, by Azure team
      • Draft Pack: アプリケーションが使用する言語に対応したDockerfileとHelm Chart
      • draft init && draft createで言語を特定
      • リソースの適用: draft up
    • Telepresence: local machineをremote クラスタに参加させられる
    • Knative: 開発中. コンテナ化されたアプリケーションやserverless styleの機能を含めたあらゆるworkloadをKubernetesにデプロイ
      • KubernetesとIstioの両方と統合
      • build プロセスのsetup, デプロイ のautomate, Eventing
  • (2) デプロイ戦略
    • zero downtime デプロイ → ユーザのリクエストに対応するアプリケーションでは必要
    • Rolling Update( 0 downtime ) ←→ Recreate (high speed)
    • デプロイ Manifestで定義
      • default: RollingUpdate
      • minReadySecondsでroll outをPodの安定まで待機. @RollingUpdate
    • MaxSurgeとmaxUnavailable: 基本は変える必要なし
    • blue green デプロイ
      • サービスからtrafficを受信するPodを決定するため,Labelを使う
      • → サービスのselectorのdeployment fieldに設定
      • blue, green, ... → rainbow デプロイ
    • canaria デプロイ → Istioを使うと高度なデプロイが〇
  • (3) Helmでの移行
    • DBがかかわるときに必要な「移行」
      • Job リソースで実現
        • Helmのhookで可能
    • Helmのhook: デプロイ中の処理準をcontroll
      • JobのAnnotationで指定
      • 失敗にも対応〇
      • pre-upgrade以外のhook
      • hookのchain化: 複数 hooks をchain化 by order
        • helm.sh/hook-weight propertyを使う

作用

  • Kubernetes アプリケーションの開発の高速化. by tools
  • 変更の本番環境へのrooloutが容易

Ch14 KubernetesでのCD

目的

  • CDとCDのKubernetes based クラウドネイティブ 環境での実現
  • Kubernetesと連携して動くCD パイプライン
  • コンテナ化されたアプリケーションのパイプラインの典型
      1. codeの変更をgit repositoryにpush
      1. build システムがbuild & test
      1. test ok → コンテナ イメージがコンテナ Registryに対してpublish
      1. new builded コンテナがautomatically デプロイ to staging 環境
      1. automatic acceptance test in staging 環境
      1. tested コンテナ イメージ tobe デプロイ to production 環境
  • デプロイの対象の成果物は〇コンテナ, ×Source Code

対応

  • (1) CD tool
    • 既存のCDでも〇
    • Jenkins: Docker, kubectl, Helmなど〇
    • Drone: simple & 軽量.個々のビルドstepは1つのコンテナの実行
    • Google Cloud Build with Google Cloud Platform
    • Concourse: Drone や Cloud builと同じく宣言的パイプライン + 公式Helm Chartあり
    • Spinnaker: ebook for freeあり, by Netflix
    • GitLab CI
    • Codefresh: to feature branch
    • Azure Pipelines
  • (2) CDのComponent
    • 既存のCDにコンテナ用Componentの追加のe.g.
      • Docker Hub
      • Gitkube: self hosting. simple + 可搬性〇.setupも間t何
      • Flux: with GitOps extended
      • Keel ≒ Flux
  • (3) CD Pipeline のe.g. by Cloud Build
    • Google CloudとGKEのセットアップ
      • demo Repositoryのfork
      • Cloud Buildの導入
        • 1つのコンテナの実行でbuild Pipelineの各stepが構成
      • Test用コンテナのbuild
        • YAMLの説明,構成
        • docker image build --target build -tag demo:test
    • test run
    • アプリケーション コンテナのbuild → アプリケーション コンテナの作成
    • Kubernetes Manifestの検証
    • イメージのPublish
      • Git SHA tag @成果物 → Codeのsnapshotになる
    • triggerの作成: 監視target Git Repository, active化の条件, パイプライン fileの指定
      • triggerのテスト
    • CD パイプラインからのデプロイ
    • デプロイ triggerの作成
      • tagのpushでtrigger
      • 代入変数
    • Build PipelineのOptimize
      • コンテナ based CD Pipeline toolは,各stepのコンテナをminimize
        • multi stage buildでオリジナル custom イメージをbuild

作用

  • アプリケーションのためにCD Pipelineをsetup → 一貫した方法と高い信頼性でソフトウェアを迅速にデプロイ

Ch15 オブザーバビリティと監視

目的

  • オブザーバビリティと監視の関係
  • Kubernetesでの監視,logging, メトリクス tracingの扱い

概要

  • (1) オブザーバビリティ
    • 監視を超えた概念
    • 監視
      • automatic 監視 @DevOps
    • blackbox監視
      • 複雑な分散 システムとなるクラウドネイティブ アプリケーションの監視の観点
      • blackbox監視の限界: 「なぜか」に答えられない
    • up/down test
      • up: アプリケーションの耐障害性と可用性をuptimeで測定
        • 99.9%: three nines
        • ユーザの視点の計測が必要 ←→ nineの数
        • クラウドネイティブ アプリケーションは完全にupにはならない
          • gray failures 問題
    • logging: 中央DBに集約 → 問題のtrouble shoot
      • limit: developerのjudgeで作成.query difficult, signal/noise比が△
      • scale difficult
      • logを超えた方法が必要 → Metrics
    • メトリクスの導入
      • @アプリケーション's メトリクス
        • 処理中のリクエストの数, 毎分リクエスト処理数
        • リクエスト proceed中のerror数, リクエスト処理に要したaverage time
      • @Infrastructure's メトリクス
        • プロセス/コンテナのCPU使用率
        • ノードやServerのdisc I/O activity
        • machine, クラスタ, load balancerのI/O network traffic
      • メトリクス: 「なぜか」の解決に有用
        • 予測にも使える
        • アプリケーションを内部から監視
          • 実際の動作に基づいてシステムの隠れた側面に関する重要 情報を外に伝えられる
          • → 〇内からの監視/ ×reverse engineering
    • tracing @分散 システム
      • 単一のユーザ リクエストのlifecycle全体を表す: リクエストの始点
    • メトリクスやtracingなど全体をカバーした用語としてのオブザーバビリティ: システムがなぜ正しく機能しないのかの理解
      • ←→ 監視: システムが正しく機能しているかどうか
      • データについてのオブザーバビリティも重要
      • 不透明なソフトウェアを測定
      • Codeのdevelopmentとproduction 環境での大規模実行との間のloopを縮める重要 tool culture
  • (2) オブザーバビリティ Pipeline
    • bufferによる統合 with standard メトリクス style by structured データ

詳細

  • Kubernetesでの監視
    • 外部からのblackbox check
      • 監視はユーザの挙動を模倣
      • 外部からサービスの可用性を監視 vs 機能停止: Monitoring as a サービス
      • 既存サービスを使用する(安価 or freeのため)
    • 内部health check
      • ユーザ's happinessが観点となる
      • @コンテナ
        • × Liveness check
        • 〇 Readiness check to 依存関係 failures
          • circuit breaker pattern
      • elegant 劣化とする

作用

  • クラウドネイティブ環境で監視が目指すべき方向性
  • オブザーバビリティの価値 with メトリクス

Ch16 KubernetesにおけるMetrics

目的

  • Metricsの扱い方
  • Metricsとは
    • 特定の対象を測定した数値
      • → 特定の瞬間における状況のsnapshot + 変化を示す
    • 時系列データ by sampling
    • メトリクス値: Counter/Gauge
      • Counter: increment only or reset to 0.
        • 量の表現
      • Gauge: 増減〇. memory使用率など
        • 比率の表現
    • 異常やfailureの通知 + 機能状況の表示
      • → 「なぜか」の解決

概要

  • (1) 優れたメトリクスのchoice
    • メトリクスの一部へのfocus
    • 要件ごとのオブザーバビリティのためのメトリクス pattern
      • service: RED pattern
        • serviceの示す性能
        • ユーザの体験情報
        • ↑ これらの情報を得られる → 「オブザーバビリティ データ」のためのtop down 型の方法
        • REDは リクエスト駆動のシステム
          • Requestの数 → 1secあたりの受信リクエスト数
          • Errorの数 → エラーとなったリクエストの割合
          • リクエストの持続期間(Duration) ≒ レイテンシ
              • 飽和度(saturation) → 4大signal
      • リソース: USE pattern → 性能問題の分析とボトルネックの発見のためのbottom up型の方法 ←→ service
        • :システムの健全性のcheck, 高速で可視性高い
        • Utilization: 使用率
        • Saturation: 飽和度
        • Error
        • 対象は〇リソース/ ×Service
          • → システム 性能のbottleneckの発見
            • e.g. CPU, disc, networkのIFやLink
    • ビジネス メトリクス
      • 加入者についてのデータの把握
        • funnel analysis
          • 解約率
          • 収益/顧客
          • help, support pageの有効性
          • System Status pageへのtraffic量
      • 共通のdatalakeを使用 in two or more groups
    • Kubernetesのメトリクス
      • クラスタ healthのメトリクス
        • ノード数
        • ノードのhealth status
        • Pod数/ノード or Pod数 in all
        • リソース使用率, 割り当て by ノード or 全体
    • デプロイのメトリクス
      • デプロイの数
      • デプロイごとのreplicaの設定数
      • デプロイごとの利用不可のreplicaの数
    • コンテナに関するメトリクス
      • コンテナ/Podの数 by ノード or 全体
      • リソース使用率 to リソース要求/リソース制限
      • コンテナのLiveness/Readiness
      • コンテナ/Podのrestart 数
      • 各コンテナのnetwork I/O traffic and error
    • アプリケーションのメトリクス
      • アプリケーションの機能による
      • 性能や可用性の問題のため
      • アプリケーションの実行内容,頻度,処理時間
      • とりあえず不明なら記録する
      • SLOやSLAに対するアプリケーションの性能も知る
    • runtimeのメトリクス
      • プロセスのrun statusを知る
        • 6こ
      • 性能の劣化やcrashについての診断に〇
  • (2) メトリクスの分析
    • データ != 情報: 情報にするための統計処理
    • 単純な平均の問題: 大多数の人々の経験には不益
      • 外れ値の作用を受けやすい → アンスコムの通知例
        • ←→ 中央値
    • リクエスト ドリブン → レイテンシのworst値が重要 → persentile(百分位数): p90, p50(中央値), p95, p99(e.g. →p.321)
    • worstが重要
    • persentileの問題
      • averageのaverage 問題
      • 間違ったstateの監視が重要
  • (4) メトリクスのdashboardによるグラフ化
    • メトリクスのグラフ化 → dashboardにグループ化
    • すべてのserviceでstandard layout(e.g. → p.323)を使う
    • 全service横断でメトリクスを集約して表示するmaster dashboard
    • あくまで,折れ線グラフというシンプルなstyleにする
    • vitalな情報を情報 radiatorで表示
    • アラートにかからないで壊れていくものをdashboardで表示
  • (5) メトリクスに基づくアラート
    • アラートの問題
      • 分散 システムは完全upにはならない
      • S/N比を高める必要
      • アラートは,直ちに人間が対処すべきもの(という単純な事実)のみ表すべき
        • いずれ対処 → mail, chatでのアラートでよい
      • OnCallの負担の軽減の重要性
      • アラートは緊急かつ重要で対処可能なもののみ
        • → 一握りのメトリクスに限定
        • → そうでないものは非同期通知
      • 要因についてのメトリクス
  • (6) メトリクス 管理のtool, サービス
    • OSSが優秀
    • Prometheus: defact standard with Kubernetes
      • scraping(収集) プロセスでautomaticにメトリクスを収集
      • Helmでcommand 1つでKubernetes クラスタにinstallできる
      • simpleな構成・仕組み
      • pull type の監視
      • Grafanaなどで,Prometheusで収集・保存した情報を活用
        • → 時系列データのグラフ化
      • Alertmanager
        • 重複排除 → アラートのグループ化 → 通知serviceにルーティング
      • Open メトリクスのbaseとなっている
    • その他のtools

作用

  • proper データの収集 → proper方法で処理 → properな問題の解決に活 → proper方法でvisualize → properな事項をproperな対象者にアラート