Open10

重い腰をあげてk8s入門

でゅらたたたんでゅらたたたん

k8sちょっと触ってみる

k8sというものがあることはかなり前から知っていたが、業務上必要を感じなかったので、概要レベルしか知らなかった。今回業務で初めてk8sの必要性を感じたので触ってみる。ただし実際に業務で本当にk8sを採用になるかどうかはわからない。

でゅらたたたんでゅらたたたん

インストール

なにはともあれhello world的なことをしてみる。
PCはm2mac。

kubectlとminikuteをいれろとのことなので、入れる

  1. brew install kubectl
  2. brew install minikube
でゅらたたたんでゅらたたたん

何が違う?

kubectlとminikubeは、Kubernetesを操作するためのツールですが、役割が異なります。

kubectl(クーブコントロール)は、Kubernetesクラスターの管理と操作を行うコマンドラインツールです。これを使って、アプリケーションのデプロイ、クラスターリソースの監視、ログの取得などができます。基本的には、KubernetesのAPIと通信して命令を実行します。
minikubeは、ローカル環境でシングルノードのKubernetesクラスターを簡単に立ち上げて実験や開発ができるツールです。minikubeを使うと、PC上に仮想環境を作成し、その中でKubernetesクラスターを動かすことができます。つまり、大規模なサーバーセットアップなしで、ローカルでKubernetesを試せるわけです。
簡単に言うと、kubectlはKubernetesクラスターを操作するためのツールで、minikubeはローカルにKubernetesクラスターを作成するためのツールです。

でゅらたたたんでゅらたたたん

dockerに例えると?

Dockerにたとえると、このように理解できます:

kubectlはdocker cliに似ています。docker cliを使ってDockerエンジンとやり取りし、コンテナを起動、停止、管理するように、kubectlはKubernetesクラスターとやり取りし、そこで動くコンテナやサービスの管理を行います。
minikubeはDocker Desktopに近いです。Docker Desktopを使うと、個人のPC上でDocker環境全体を簡単に設定し、使用することができます。同様に、minikubeも個人のPC上でKubernetesクラスター全体を簡単に立ち上げて使用することが可能です。
つまり、kubectlはコマンドを実行するツールで、minikubeは実際の環境(クラスター)を提供するツールというわけです。

というわけでなんとなく理解した。

でゅらたたたんでゅらたたたん

Minikubeクラスタの起動

minikube start --driver=docker

をすると、Minikubeクラスタが起動する

・・容量がいっぱい?
掃除します・・

でゅらたたたんでゅらたたたん

クラスタの状態確認

$ kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
minikube   Ready    control-plane   6m22s   v1.30.0

nginxをデプロイ

$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

なにしてるか整理

kubectl create deployment nginx --image=nginx を実行すると
Deployment がKubernetesクラスター上に作成され、それに基づいて Pod がクラスター内に配置されます。Podは、実際にコンテナが実行される場所です。
このコマンドによって、nginx イメージを使った1つ以上のPodがクラスター内に作成されます。

混乱してきたので、mermaidでgpt先生に整理してもらう。

Kubernetes クラスターは全体を管理するトップレベルのエンティティで、マスターノードとワーカーノードを含んでいます。
マスターノードはクラスターの制御面を担当し、APIサーバー、コントロールマネージャー、スケジューラー、etcdが含まれます。
ワーカーノードは実際のワークロード(Pod)が実行される場所で、Node、kubelet、kube-proxy、コンテナランタイムを含んでいます。
DeploymentsはPodの作成と管理を担当し、ServiceはPod群に対する安定したアクセスポイントを提供します。
Ingress コントローラは外部からのトラフィックをクラスター内の適切なServiceにルーティングします。

Serviceの作成

$ kubectl expose deployment nginx --type=NodePort --port=80
service/nginx exposed

以下のようなServiceが作成されます:

Deployment名: nginx
サービスタイプ: NodePort
内部ポート: 80(このポートで動作しているPodへのトラフィックがリダイレクトされます)

NodePortとは?

NodePort はKubernetesのServiceの一種で、クラスター外から内部のPodにアクセスするための方法の一つです。このタイプのServiceを使用すると、Kubernetesクラスターの各ノードに外部からアクセス可能なポート(NodePort)が割り当てられます。このポートを通じて、外部のクライアントがServiceにリンクされたPod群にアクセスできるようになります。

つまり、クラスター内で動作している nginx Deploymentに紐づけられたPodへのトラフィックをルーティングする役割を持つサービスがつくられる

でゅらたたたんでゅらたたたん

まだわからんので詳細

Serviceが作成されると、Kubernetesは各ノードに対して30000-32767の範囲内でランダムに外部ポート(NodePort)を割り当てます。このポートを通じて、クラスターの外部から nginx Serviceにアクセスできるようになります。

任意のノードのIPアドレスと割り当てられたNodePortを指定してアクセスします。たとえば、ノードのIPが 192.168.1.100 で、割り当てられたNodePortが 31000 だった場合、http://192.168.1.100:31000 をブラウザで開くことで nginx Serviceにアクセスできます。
アクセスがノードに到達すると、NodePortはそのリクエストをクラスター内の nginx Podの80番ポートに転送します。
このように、NodePort Serviceは、Kubernetesクラスターの各ノードに外部から直接アクセスできるポートを提供し、それを介してクラスター内の特定のPodにトラフィックをルーティングする機能を持っています。

でゅらたたたんでゅらたたたん

実際にnginxにアクセス

$ minikube service nginx
|-----------|-------|-------------|---------------------------|
| NAMESPACE | NAME  | TARGET PORT |            URL            |
|-----------|-------|-------------|---------------------------|
| default   | nginx |          80 | http://192.168.49.2:30865 |
|-----------|-------|-------------|---------------------------|
🏃  nginx サービス用のトンネルを起動しています。
|-----------|-------|-------------|------------------------|
| NAMESPACE | NAME  | TARGET PORT |          URL           |
|-----------|-------|-------------|------------------------|
| default   | nginx |             | http://127.0.0.1:61340 |
|-----------|-------|-------------|------------------------|
🎉  デフォルトブラウザーで default/nginx サービスを開いています...

・・なるほど、確かに30865 ポートなので、gptさんの説明と合致してるかな

でゅらたたたんでゅらたたたん

pod数を増やす

$ kubectl scale deployment/nginx --replicas=2

削除

# deploymentの削除
$ kubectl delete deployment nginx
# サービスの削除
$ kubectl delete service nginx
# クラスタの削除
$ minikube stop
でゅらたたたんでゅらたたたん

感想

完全ブラックボックスだったのがちょっとワカル程度にはなったかもしれない。
ただyml書いて設定するみたいなイメージだったが、その辺りまだよくわからない。
あとGKEではどう設定するのかとか・・