Closed14

k8sに入門した(その2)「deployments, node, pod, service等の基本的概念を理解する」

🤨🤔😑😨😱🤨🤔😑😨😱

kubectlのバージョンを確認

kubectl version

clientはkubectlのバージョンを表示、serverはmasterノードのk8sバージョンを表す。

🤨🤔😑😨😱🤨🤔😑😨😱

クラスタの詳細情報を確認

kubectl cluster-info

ノードの情報の状態を確認

kubectl get nodes

nodeとはマシンを表すのかな。
このチュートリアルではずっとシングルノード。

🤨🤔😑😨😱🤨🤔😑😨😱

サービスをデプロイ

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

動いてるのを確認

kubectl get deployments
🤨🤔😑😨😱🤨🤔😑😨😱

Pod=コンテナだと思ってたけどそうではないのか。
Pod比較的密に結合されたコンテナを含み、Pod内は常に同じNodeで動く。

podの詳細情報を確認

kubectl describe pods
🤨🤔😑😨😱🤨🤔😑😨😱

Pod nameを取得

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')

podのlogを確認

kubectl logs $POD_NAME

pod内に入る

kubectl exec -ti $POD_NAME -- bash
🤨🤔😑😨😱🤨🤔😑😨😱

ServiceはPod間をつなぐ概念?Podのportを外に出したり、Pod間をつなぐ通信などが出来る。

serviceで確認

kubectl get services

Podの8080番を外に出す。

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

新たにサービスが追加出来たことを確認

kubectl get services

公開されたportを取得

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')

外からでもアクセス出来る

curl $(minikube ip):$NODE_PORT
🤨🤔😑😨😱🤨🤔😑😨😱

labelをつけれる。

kubectl label pods $POD_NAME version=v1

labelのついたコンテナを取り出したりとか。

kubectl get pods -l version=v1
🤨🤔😑😨😱🤨🤔😑😨😱

サービスを消す

kubectl delete service -l app=kubernetes-bootcamp

消えてることを確認

kubectl get services
curl $(minikube ip):$NODE_PORT

引き続きpodは動いてる

kubectl exec -ti $POD_NAME -- curl localhost:8080

serviceやらlabelは大量のPodを管理するには便利なんだろうなぁ。

🤨🤔😑😨😱🤨🤔😑😨😱

レプリカを作って、serviceが不可をそれに等分配するような機能がある。

deploymentsを確認

kubectl get deployments

nameがdeploymentsの名前

レプリカの設定(Replica Sets略してrs)を確認

kubectl get rs

rsの名前は、[deploymentsの名前-ランダム文字列]
DESIREDは望ましいレプリカ数。CURRENTは現在動いてるレプリカの数。

4つにスケールさせてみる。

kubectl scale deployments/kubernetes-bootcamp --replicas=4

状態を確認

kubectl get deployments
kubectl get rs

変更履歴を確認

kubectl describe deployments/kubernetes-bootcamp
🤨🤔😑😨😱🤨🤔😑😨😱

実際に4つのレプリカがあることを確認する。

外部に公開されてるPortを取得。

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')

何度も以下を実行して毎回Podが異なることを確認。

curl $(minikube ip):$NODE_PORT

2つに変更すると、残りの2つが止まっていることが確認出来る。

kubectl scale deployments/kubernetes-bootcamp --replicas=2
kubectl get pods -o wide
🤨🤔😑😨😱🤨🤔😑😨😱

アップデートしてみる

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

新しいのが立ち上がった後に古いのが消えてくのがわかる。

kubectl get pods

アップデートに失敗しても戻れる

kubectl rollout undo deployments/kubernetes-bootcamp
🤨🤔😑😨😱🤨🤔😑😨😱

チュートリアルはこれで終了。

deployments: masterで動く状態を定義する設計図みたいな?
Node: 仮想マシンやら実マシンやら、Podが動く土台。
Pod: いくつかのコンテナを纏めた密なコンテナの群?
Service: Pod: 同士を疎結合させる。PodのPortを外部に出したりレプリカにリクエストを分散出来たり。
あとはレプリカ作ったりアップデートを管理出来たりする。

確かに、dockerのみでサービスを運用するとアップデートのために一旦コンテナ止めたりが必要だった。
レプリカとかも簡単には作れない。
Portを外に出すとかもコンテナの設定に一箇所に書いてるし。
確かに大規模サービスの場合はk8s使って運用するのが良いのはわかった。

このスクラップは2022/02/20にクローズされました