k8sに入門した(その2)「deployments, node, pod, service等の基本的概念を理解する」
「Kubernetesの基本を学ぶ」(https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/ )をやる
バージョンを確認して
minikube version
minikubeを始める。
minikube start
minikubeはk8sが動いてる仮想環境を作成するツールらしい。
これでkubectl
等のコマンドが使えるようになる。
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
別のterminalでプロキシを実行
kubectl proxy
アクセス出来る。
curl http://localhost:8001/version
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使って運用するのが良いのはわかった。