業務で普段使っているKubernetesにおけるクラスタやリソースについて改めて調べ整理することで、イメージと理解をより深めることを目的に書いています。
クラスタ(Cluster)
クラスタは、コンテナ化されたアプリケーションを実行するためのノードマシンの集合です。クラスタには少なくとも、1 つのコントロールプレーン(マスターノードとも呼ばれている?)と、1 つ以上のノードと呼ばれるコンピューティングマシンが含まれます。
- コントロールプレーン:どのアプリケーションが実行されているかといった、クラスタの望ましい状態を維持
- ノード:実際にアプリケーションとワークロードを実行
以下のコマンドで、configの設定で指定されている接続先クラスター情報を確認できます。
1 2 3 4 | $ kubectl config get-clusters NAME docker-desktop |
コンテキスト(Context)
コンテキストはクラスタとユーザの組み合わせです。同一クラスタでも接続ユーザが異なれば、別のコンテキストとして扱われます。
以下のコマンドでコンテキストを取得できます。同じクラスタでもコンテキストが違っています。
1 2 3 4 5 | $ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * docker-desktop docker-desktop docker-desktop docker-desktop-2 docker-desktop docker-desktop |
名前空間(Namespace)
名前空間とは、クラスタの分離機能のことで、複数のチームやユーザーでクラスターリソースを分割することができます。
名前空間を使うことで、Kubernetes内の環境に名前を付けて利用することができます。他の環境と分離させることができ、ユーザーによって権限を変えることも可能です。
1 2 3 4 5 6 7 8 | $ kubectl get namespace NAME STATUS AGE default Active xxd kube-node-lease Active xxd kube-public Active xxd kube-system Active xxd sample Active xxd |
Pod
Podは、1つまたは複数のコンテナのグループです。ストレージやネットワークの共有リソースを持ち、コンテナの実行方法に関する仕様を持っています。
Podとは、Kubernetesで実行できるアプリケーションの最小単位です。
1 2 3 4 5 | $ kubectl get pod NAME READY STATUS RESTARTS AGE sample-78d9c99bd4-kdbwx 1/1 Running 0 xxd sample-78d9c99bd4-m7mk2 1/1 Running 0 xxd |
Service
Serviceとは、Podとの通信を容易に行うためにエンドポイントの提供を行ってくれる機能です。
通常、NodeのIPアドレスは一定ではないため、通信するにはその都度IPアドレスを指定する必要があります。
Serviceという機能があることで、通信するためのDNSラベルが発行され、アプリケーションが他のPodとの通信が簡単にできるようになります。
1 2 3 4 | $ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample-service NodePort 10.102.100.87 <none> 80:31512/TCP xxd |
Deployment
DeploymentはPodやReplicaSetの宣言的なアップデート機能を提供します。
Kubernetesでは、Podを単独で起動することはほとんどなく、大抵の場合は、ReplicaSetやJobなどの管理用オブジェクトを通してPodを利用します。
ReplicaSetは、複数のPodのレプリカをセットで作成する機能で、DeploymentはさらにそのReplicaSetを管理します。
ローリングアップデート
Deploymentは、作成したPodの仕様が変更されると、自動的にReplicaSetを再作成します。
Deploymentのアップデート方法は、デフォルトでローリングアップデートとなっており、新しいReplicaSetを生成し、順に古いPodを新しいPodに入れ替えていきます。
そのため、ダウンタイムが発生しないというメリットがある代わりに、切り替えに多少時間がかかるというデメリットがあります。
上の図の例だと、下の新しいReplica Setが作成され、上の古いReplica Setで作成されたPodが、新しいReplica Setで作成されたPodに徐々に切り替わっていく感じです。
1 2 3 4 | $ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE sample 2/2 2 2 xxd |
参考記事
https://kubernetes.io/ja/docs/concepts/overview/components/
https://udemy.benesse.co.jp/development/system/kubernetes.html