[k8sの基礎概念まとめ]見習いインフラエンジニアがkubernetesを本気で勉強してみている話

皆さんこんにちは!最近、インフラエンジニアとしてよりステップアップしたく、Dockerから更に発展してkubernetesを学んでいるので、学んだことをつれづれなるまゝに自分の整理の為にも綴っておこうと思います。

Kubernetesとは??使い道は??

Kubernetes(クーバネティス)は、コンテナ化されたアプリケーションの自動デプロイメント、スケーリング、管理を行うオープンソースのプラットフォームです。つまり、複数のコンテナを効果的に管理し、適切にリソースを割り当てることができます。

Kubernetesにおいて知っておくべき概念

ポッド Pod

Kubernetesを学ぶ上で、最初に触れる概念の一つが「ポッド(Pod)」です。ポッドは、Kubernetes上でコンテナ化されたアプリケーションの基本的なデプロイ単位となる重要な要素です。

ポッドは、クジラの群れ(pod of whales)やえんどう豆のさや(pea pod)などの表現と同じような意味で、1つ以上のコンテナからなるグループであり、これらのコンテナは常に共同で同じノード上で実行されます。Kubernetesはポッドを最小単位として管理し、ポッド内のコンテナに対してリソースの割り当てやネットワークの設定などを行います。

ポッドの特徴!

1.単一のアプリケーションである:

通常、1つのポッドには1つのアプリケーションが含まれます。

※特定の状況では複数の関連するアプリケーションを同じポッド内で実行することもあります。

2.共通のネットワークである:

同じポッド内のコンテナは、同じネットワーク名前空間およびIPアドレスを共有します。これにより、ポッド内のコンテナはローカルホストを介して互いに通信できます。

3.共有のストレージである:

ポッド内のコンテナは、同じボリュームを共有することができます。これにより、データを共有しながらアプリケーションをスケーリングすることが可能です。

ポッドのまとめ

ポッドはKubernetes上でアプリケーションをデプロイするためのひとまとまり 最小単位であり、コンテナ化されたアプリケーションがその中に入っており、それらを効果的に管理するための重要な概念となるわけです。複数のポッドを組み合わせることで、より複雑なアプリケーションを構築することができます。

ノード Node

Kubernetesの概念の一つである「ノード(Node)」は、クラスタ内でコンテナ化されたアプリケーションを実行する物理または仮想のマシンを指します。ノードは、クラスタの計算リソースを提供し、ポッド(Pod)を実行する場所として機能します。

ノードの役割

1.「コンテナ化されたアプリケーションを実行する場所」

各ノードは複数のポッドをホストし、それらのポッドがクラスタ全体で実行される計算リソースを提供します。

2.クラスタ管理

Kubernetesはノードを監視し、状態管理を行います。

ノードが正常に動作しているかどうかを定期的にチェックし、必要に応じて自動的に修復します。また、新しいノードがクラスタに追加された際に、そのノードをクラスタに統合します。

3.ノードのラベリング

Kubernetesでは、ノードに対してラベルを付けることができます。

これにより、特定のノードが特定のポッドを実行するように指定することができます。例えば、特定のノードに特定のハードウェアリソースが備わっている場合、そのノードに対して適切なラベルを付け、特定のポッドをそのノードにスケジューリングすることができます。

例)ノードにラベルを追加

kubectl label nodes <node-name> <label-key>=<label-value>

ノードに付与されたラベルを確認

kubectl get nodes --show-labels

4.ノードに役割を振れる

Kubernetesでは、ノードに役割を割り当てることができます。

例えば、マスターノードとワーカーノードという2つの主要な役割があります。

マスターノードは、クラスタ全体の管理を担当し、

ワーカーノードは実際のアプリケーションの実行を担当します。

ノードのまとめ

ノードはKubernetesクラスタ内でコンテナ化されたアプリケーションを実行するための物理または仮想のマシンであり、クラスタ全体の計算リソースを提供します。

ノードの追加や削除、ラベリングなどの管理操作は、Kubernetesの効果的な運用に不可欠です。

デプロイメント Deployment

デプロイメントは、Kubernetesにおいてアプリケーションをデプロイ、更新、スケーリングするためのリソースです!

一言でいうと デプロイメント その名の通りKubernetesにデプロイメントするもののことです!!

デプロイメントを使用すると、アプリケーションをクラスタに簡単にその名の通りデプロイ展開できるだけでなく、アプリケーションの更新やロールバックも容易に行うことができます。

デプロイメントの利点

・スケーリングや自動ロールバックが可能になる!

How to use

ざっくりうデプロイメントリソースを用いるにはまずはそのマニフェストファイルをyaml形式で記載し、それをKubernetesクラスタに適応します

試しにNgnix Webサーバのデプロイメントを作成するマニフェストは下記の通りです

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

spec:

replicas: 3

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:latest

ports:

- containerPort: 80

!ポイント!

・kind: を Deploymentとすることでデプロイメントのマニフェストとして機能します。

replicasselector

デプロイメントは、フィールドでインスタンスの数を指定し、フィールドで適用するポッドを選択できます。

template

今回のフィールドでは、ポッドのテンプレートが定義されており、ここではNginxのコンテナイメージが使用されます。

適用コマンド

Kubernetesクラスタに上記のデプロイメントを適用するコマンドは下記の通りです。

kubectl apply -f nginx-deployment.yaml

このことにより、NgnixのデプロイメントがKubernetesクラスタに展開されます。

確認コマンド

kubectl get deployments

このコマンドでデプロイメントのリストが表示されます。

サービス Service

 

こちらを用いることでクラスタ内のポッドへのアクセスを安定して提供するための機能で、ポッドのIPアドレスが変わっても同じエンドポイントを提供することができます。

サービスの種類

ClusterIP

デフォルトのサービスタイプ。

クラスター内の内部IPを割り当て、クラスター内の他のポッドからアクセス可能にします。

NodePort

各ノードの特定のポートを開放し、そのポートを通じてクラスター外部からアクセス可能にします。

LoadBalancer

クラウドプロバイダー(AWS、GCP、Azureなど)のロードバランサを利用し、外部アクセスを提供します。

ExternalName

外部DNS名に対してサービスを設定し、内部から外部サービスへのアクセスを提供します。

How to use

serviceリソースを用いるにはまずはそのマニフェストファイルをyaml形式で記載し、それをKubernetesクラスタに適応します。

例 ClusterIPタイプのサービス

apiVersion: v1

kind: Service

metadata:

name: my-service

spec:

selector:

app: MyApp

ports:

- protocol: TCP

port: 80

targetPort: 9376

!ポイント!

Selector(セレクタ)

selectorは、特定のリソース(例えば、PodやService)を選択するためのフィルタリング機能です。

selectorを使うことで、ラベルを基に特定のPodや他のリソースをターゲットにでき、複雑な環境でのリソースの管理や操作を簡略化できます。

例えば、Serviceが特定のラベルを持つPodにのみトラフィックをルーティングするように指定することが可能です。

簡潔にまとめると、サービスがどのポッドにトラフィックを送るかを決定するためのラベルセレクタで上記の例では、

app: MyApp というラベルを持つポッドが対象となります。

PortとTargetPort

port はサービスが公開するポート番号であり、
targetPort はポッド内のアプリケーションがリスニングしているポート番号を定義しています。

この定義があることでポッドのIPアドレスが変わっても問題なく通信できるわけですね~~

作成コマンド

上記の例のserviceリソースの作成コマンドは下記の通りです。

kubectl apply -f service.yaml

私は、偶然にも最近アサインしたプロジェクトのインフラがAWSのEKS(Kubernetesクラスターのデプロイと管理を簡素化するフルマネージドのサービス)で構成されており、ログを取ったり、改修することとなりましたが、これらの基礎概念を予め知っていたことで、戸惑うことなく作業することができました!

Kubernetesのポッド、Node、Deployment、Serviceについて学ぶことで、コンテナ化されたアプリケーションのデプロイメントと管理において非常に強力なツールを手に入れました。それぞれのコンポーネントが果たす役割や相互作用を理解することで、スケーラブルで信頼性の高いアプリケーション環境を構築できる自信がつきました。これからは、これらの知識をより実際のプロジェクトで応用し、Kubernetesの利点を最大限に活かしていきたいと思います。

 

関連記事

カテゴリー:

ブログ

情シス求人

  1. チームメンバーで作字やってみた#1

ページ上部へ戻る