[k8sの基礎概念まとめ]見習いインフラエンジニアがkubernetesを本気で勉強してみている話
- 2024/9/6
- ブログ
- 2024, Kubernetes, インフラエンジニア, ブログ
- [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の利点を最大限に活かしていきたいと思います。
カテゴリー: