Concept
このページについて
何を書くか:
- Kubernetesの全体アーキテクチャーや構成要素の概要
- 個別のオブジェクトによらない概念や機能等について
書かないこと:
- 著しく個々のオブジェクトに紐づく文書のボリュームが大きくなったら、独立したページに切り出す
アーキテクチャー概観
Kubernetesのコンポーネント - Kubernetesより。
- クラスタ … ノードの集合
- 少なくとも1つのワーカーノードと少なくとも1つのマスターノードがある
- ノード(Node) … コンテナ化されたアプリケーションを実行するマシン
- マスターノード … ワーカーノードとPodを管理。複数台構成によって高可用性を実現できる
- ワーカーノード … Podを動かす
各ノードで実行され、Kubernetesのクラスタ機能を成り立たせるコンポーネントを以下に記す。
Master Components
マスターコンポーネントは、クラスターのコントロールプレーンを提供する。
クラスタのどのマシンでも実行できるが、通常は全てのコンポーネントが同じマシンで起動され、そのマシンにはユーザーのPodをスケジュールしない。
- kube-apiserver
- Kubernetesを制御するフロントAPI. 水平スケール可能。参考: Building High-Availability Clusters | Kubernetes
- etcd … クラスタの管理データが保存されるので、バックアップすべし。
- kube-controller-manager
- Controllerをバックグラウンドのスレッドで動かす。
- 個々のControllerは論理的には独立した存在だが、複雑性を避けるため同一のバイナリで単一プロセスとして動作している。
- 以下のControllerが含まれる:
- Node Controller
- Replication Controller
- Endpoints Controller
- Service Account & Token Controller
- cloud-controller-manager … v1.6でalpha. クラウド基盤とやりとりするControllerを動かす。
- kube-scheduler … 生成されるPodを監視し、Podを動作させるノードを決定する。
- addons … クラスタの機能を提供するPod群。これらのPodは
kube-system
という Namespace に作られる。
Node Components
- kubelet … マスターと通信するエージェントプロセス。
- kube-proxy … ノード上でKubernetes APIによって定義されたサービスを媒介するネットワークプロキシ。
- docker, rkt … コンテナランタイム
- supervisord … ノード上でdockerやkubeletを動かし続ける。
- fluentd … cluster-level loggingを実現する。
リソースオブジェクト
APIオブジェクトとも呼ばれるようだ。
Kubernetes APIに従い、カテゴライズして記す。
NOTE:
- 以下、「*」は本サイト内のページを表すとする。
- 一旦、v1beta以下は省くか、versionを明記する
Workloads
- coreグループ:
- appsグループ:
- ReplicaSet … Replication Controllerの後継。
- Deployment * … PodやReplicaSetの状態を宣言的に記述することを可能にする。
- StatefulSet … v1.8でbeta. Deployment同様Podを管理するが、それぞれのPodを異なる個体と認識する。
- DaemonSet … ノード上でPodのコピーを動かす。典型的なユースケースとしては、cephやfluentd, collectdなどが挙げられる。
- batchグループ:
- Job … Podを実行し、正常に完了するまでをトラッキングする。定められた回数、正常に完了したら、Jobも完了となる。
- CronJob v1beta1
MEMO:
- apps, batchグループのオブジェクトを Controller と呼ぶことがあったようだ。
Discovery & LB (Service APIs)
- coreグループ:
- Service *
- Endpoints
- networking.k8s.ioグループ:
- Ingress v1beta1
- IngressClass v1beta1
- discovery.k8s.ioグループ:
- EndpointSlice v1beta1
Config & Storage
- coreグループ:
- ConfigMap
- Secret
- PersistentVolumeClaim
- Volume
- storage.k8s.ioグループ:
- CSIDriver
- CSINode
- StorageClass
- VolumeAttachment
Metadata
- coreグループ:
- Event
- LimitRange
- PodTemplate
- appsグループ:
- ControllerRevision
- autoscalingグループ:
- HorizontalPodAutoscaler * … HPAと略されることが多い
- scheduling.k8s.ioグループ:
- PriorityClass … See Pod Priority and Preemption - Kubernetes#priorityclass
- admissionregistration.k8s.ioグループ:
- MutatingWebhookConfiguration
- ValidatingWebhookConfiguration
- apiextensions.k8s.ioグループ:
- CustomResourceDefinition … CRDと略されることが多い。K8sの機能拡張によく用いられる
- policyグループ:
- PodDisruptionBudget v1beta1
- PodSecurityPolicy v1beta1
Cluster
- coreグループ:
- Binding
- ComponentStatus
- Namespace * … Kubernetesでは、複数の仮想的なクラスタを同じ物理クラスタ上に構築することができる。この仮想クラスタのことを Namespace と呼ぶ
- Node
- PersistentVolume *
- ResourceQuota
- ServiceAccount
- authentication.k8s.ioグループ:
- TokenRequest
- TokenReview
- authorization.k8s.ioグループ:
- LocalSubjectAccessReview
- SelfSubjectAccessReview
- SelfSubjectRulesReview
- SubjectAccessReview
- rbac.authorization.k8s.ioグループ:
- ClusterRole
- ClusterRoleBinding
- Role
- RoleBinding
- apiregistration.k8s.ioグループ:
- APIService
- AuditSink
- certificates.k8s.ioグループ:
- CertificateSigningRequest v1beta1
- networking.k8s.ioグループ:
- NetworkPolicy
- coordination.k8s.ioグループ:
- Lease
認証/認可
RBAC
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
- Role … 権限ロール。Namespace単位
- ClusterRole … クラスタ全体に効く権限ロール
- RoleBinding … Roleとユーザ/グループの紐付け
- ClusterRoleBinding … ClusterRoleとユーザ/グループの紐付け
参考:
- Kubernetes道場 20日目 - Role / RoleBinding / ClusterRole / ClusterRoleBindingについて - Toku’s Blog
- KubernetesのRBACについて - Qiita
オートスケール
Horizontal Pod Autoscaler
- https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
- https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
Podの水平オートスケーラー
- v1 … CPU使用率(requestsの平均)でスケール
- v2
Example:
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2alpha1
metadata:
name: WebFrontend
spec:
scaleTargetRef:
kind: ReplicationController
name: WebFrontend
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
- type: Object
object:
target:
kind: Service
name: Frontend
metricName: hits-per-second
targetValue: 1k
参考:
- Configuring a Horizontal Pod Autoscaler - GKE
- GKE クラスタの観察 | Stackdriver Monitoring | Google Cloud
- GKEでPodとNodeをAutoscaling する - Qiita
Cluster Autoscaler
https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler
Storage
PersistentVolume
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
永続化ボリューム
参考:
リソース管理
コンテナやPodへのCPU/メモリの割当て
基本:
- Podは、cpu/memory requests以上の空きリソースを持つノードにスケジュールされる
- コンテナのcpu利用量がlimit値を越えるとスロットルされる = パフォーマンス劣化する
- コンテナのmemory利用量がlimit値を越えるとOOM Killerで殺される。再起動できるときは再起動される
- Podが複数のコンテナで構成される場合、リソース指定値は全コンテナの合計値になる
- requestsを指定しないとデフォルト値になる
- limitsを指定しないとノードで利用可能な最大値になる
Tips:
- コンテナのcpu/memoryのrequestsより大きなlimitsを指定することで、突発的な負荷に耐えられるようになり、かつ、適切に制限をかけられる
ベストプラクティス:
- NamespaceでResourceQuotasやLimitRangeを設定すると良い
参考:
- コンテナおよびPodへのCPUリソースの割り当て - Kubernetes
- コンテナおよびPodへのメモリーリソースの割り当て - Kubernetes
- 例を交えてKubernetesのリミットとリクエストを理解する | Sysdigブログ - コンテナ・Kubernetes環境向けセキュリティ・モニタリング プラットフォーム
- Kubernetes best practices: Resource requests and limits | Google Cloud Blog
- 開発者のベスト プラクティス - Azure Kubernetes Service (AKS) でのリソース管理 | Microsoft Docs
Pod Eviction
Documents:
メモ:
- ノードのメモリが不足すると、Podがevictされることがある
- メモリ使用量の大きなPodからeviction対象になる
- memoryのrequets/limitsを適切に設定しておくこと
EvictしたPodは手動で削除する必要があるっぽい。 See kubectl#EvictedなPodを一括削除するワンライナー
参考:
- Kubernetes pod evictedとスケジューリングの問題を理解する | Sysdigブログ - コンテナ・Kubernetes環境向けセキュリティ・モニタリング プラットフォーム
- ノード - Kubernetes
ロギング
概念:
ソリューション:
最終更新 2021-03-04: [python,k8s/cronjob,mysql] Add some notes (e2babf2b0)