Concept

このページについて

何を書くか:

  • Kubernetesの全体アーキテクチャーや構成要素の概要
  • 個別のオブジェクトによらない概念や機能等について

書かないこと:

  • 著しく個々のオブジェクトに紐づく文書のボリュームが大きくなったら、独立したページに切り出す

アーキテクチャー概観

Kubernetesのコンポーネント - Kubernetesより。

  • クラスタノードの集合
    • 少なくとも1つのワーカーノードと少なくとも1つのマスターノードがある
  • ノード(Node) … コンテナ化されたアプリケーションを実行するマシン
    • マスターノードワーカーノードとPodを管理。複数台構成によって高可用性を実現できる
    • ワーカーノード … Podを動かす

各ノードで実行され、Kubernetesのクラスタ機能を成り立たせるコンポーネントを以下に記す。

Master Components

マスターコンポーネントは、クラスターのコントロールプレーンを提供する。
クラスタのどのマシンでも実行できるが、通常は全てのコンポーネントが同じマシンで起動され、そのマシンにはユーザーのPodをスケジュールしない。

  • kube-apiserver
  • 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 Reference Docs (v1.18 at 2020-04-13)に従い、カテゴライズして記す。

NOTE:

  • 以下、「*」は本サイト内のページを表すとする。
  • 一旦、v1beta以下は省くか、versionを明記する

Workloads

  • coreグループ:
  • appsグループ:
    • ReplicaSetReplication 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グループ:
  • 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グループ:
  • scheduling.k8s.ioグループ:
  • 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とユーザ/グループの紐付け

参考:

オートスケール

Horizontal Pod Autoscaler

Podの水平オートスケーラー

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

参考:

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を指定することで、突発的な負荷に耐えられるようになり、かつ、適切に制限をかけられる

ベストプラクティス:

参考:

Pod Eviction

Documents:

メモ:

  • ノードのメモリが不足すると、Podがevictされることがある
  • メモリ使用量の大きなPodからeviction対象になる
  • memoryのrequets/limitsを適切に設定しておくこと

EvictしたPodは手動で削除する必要があるっぽい。 See kubectl#EvictedなPodを一括削除するワンライナー

参考:

ロギング

概念:

ソリューション: