マイクロサービスのお勉強

特に、最後の "The Scale Cube" はとてもいいフレームワーク(思考法的なほうの意味)だと思う。 こんなヤツ。

https://microservices.io/i/DecomposingApplications.021.jpg

Kubernetesチュートリアル

Kubernetesチュートリアルやってみました。
https://kubernetes.io/docs/tutorials/kubernetes-basics/

上記チュートリアルでは、すでに用意されてるMinikube環境+Katacoda(web上で使えるターミナル)を使う構成になってますが、僕は自分の勉強も含め、自分のMac上で、手元のターミナルとMinikubeを使ってやりました。

要するに、こちらでやられてるのと全く一緒です。
https://dev.classmethod.jp/cloud/kubernetes-tutorial-1/

Interactive Tutorial - Creating a Cluster

$ minikube version
minikube version: v0.28.2

$ minikube start
けっこう時間かかります

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-08T16:30:58Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

Interactive Tutorial - Deploying an App

$ kubectl get nodes --help

$ kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    4h        v1.10.0

$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            1           3s

$ kubectl proxy

$ curl http://localhost:8001/version

$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

Interactive Tutorial - Exploring Your App

$ kubectl get pods
$ kubectl describe pods
$ kubectl proxy

$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

$ kubectl logs $POD_NAME

$ kubectl exec $POD_NAME env

$ kubectl exec -ti $POD_NAME bash
# cat server.js
# curl localhost:8080
# exit

Interactive Tutorial - Exposing Your App

$ kubectl get pods
$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   22h

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

$ kubectl describe services/kubernetes-bootcamp

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-mb9b8 | v=1

$ kubectl describe deployment
...
Labels:                 run=kubernetes-bootcamp
...

$ kubectl get pods -l run=kubernetes-bootcamp
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running   1          18h

$ kubectl label pod kubernetes-bootcamp-5c69669756-mb9b8 app=v1
$ kubectl get pods -l app=v1
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running   1          18h

$ kubectl describe pods
...
Labels:         app=v1
                pod-template-hash=1725225312
                run=kubernetes-bootcamp
...

$ kubectl delete service -l run=kubernetes-bootcamp

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   23h

$ kubectl exec -ti kubernetes-bootcamp-5c69669756-mb9b8 curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-mb9b8 | v=1

Interactive Tutorial - Scaling Your App

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            1           18h

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

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4         4         4            4           18h

$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-48p5b   1/1       Running   0          1m        172.17.0.5   minikube
kubernetes-bootcamp-5c69669756-7p2l5   1/1       Running   0          1m        172.17.0.7   minikube
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running   1          18h       172.17.0.2   minikube
kubernetes-bootcamp-5c69669756-slf49   1/1       Running   0          1m        172.17.0.6   minikube

$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-48p5b   1/1       Running   0          1m
kubernetes-bootcamp-5c69669756-7p2l5   1/1       Running   0          1m
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running   1          18h
kubernetes-bootcamp-5c69669756-slf49   1/1       Running   0          1m

$ kubectl describe deployments/kubernetes-bootcamp
...
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
...

$ kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}'
Error from server (NotFound): services "kubernetes-bootcamp" not found

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

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

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

$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-mb9b8 | v=1

$ curl $(minikube ip):$NODE_PORT
$ curl $(minikube ip):$NODE_PORT
$ curl $(minikube ip):$NODE_PORT

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-mb9b8 | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-slf49 | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-48p5b | v=1
...

$ kubectl scale deployments/kubernetes-bootcamp --replicas=2

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           18h

$ kubectl get pods -o wide
NAME                                   READY     STATUS        RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-48p5b   1/1       Running       0          8m        172.17.0.5   minikube
kubernetes-bootcamp-5c69669756-7p2l5   1/1       Terminating   0          8m        172.17.0.7   minikube
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running       1          18h       172.17.0.2   minikube
kubernetes-bootcamp-5c69669756-slf49   1/1       Terminating   0          8m        172.17.0.6   minikube

ちょっと待つと、

$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-48p5b   1/1       Running   0          9m        172.17.0.5   minikube
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running   1          18h       172.17.0.2   minikube

Interactive Tutorial - Updating Your App

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2         2         2            2           22h

$ kubectl get pods

$ kubectl describe pods

$ kubectl get svc

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-48p5b | v=1

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

$ kubectl get pods -o wide
NAME                                   READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-5c69669756-48p5b   1/1       Running   0          3h        172.17.0.5   minikube
kubernetes-bootcamp-5c69669756-fshmp   1/1       Running   0          3s        172.17.0.6   minikube
kubernetes-bootcamp-5c69669756-j5bxj   1/1       Running   0          3s        172.17.0.7   minikube
kubernetes-bootcamp-5c69669756-mb9b8   1/1       Running   1          22h       172.17.0.2   minikube

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

$ kubectl describe services/kubernetes-bootcamp

$ kubectl get pods -o wide

$ kubectl rollout status deployment/kubernetes-bootcamp

$ kubectl describe pods

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

$ kubectl get deployments
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   4         5         2            3           22h

$ kubectl get pods
NAME                                   READY     STATUS             RESTARTS   AGE
kubernetes-bootcamp-5f76cd7b94-7rrg7   0/1       ImagePullBackOff   0          33s
kubernetes-bootcamp-5f76cd7b94-sdvbr   0/1       ErrImagePull       0          33s
kubernetes-bootcamp-7799cbcb86-5mblm   0/1       Terminating        0          14m
kubernetes-bootcamp-7799cbcb86-6pwd7   1/1       Running            0          21m
kubernetes-bootcamp-7799cbcb86-7w9zk   1/1       Running            0          21m
kubernetes-bootcamp-7799cbcb86-gjbrb   1/1       Running            0          21m

ダメなので...

$ kubectl rollout status deployment/kubernetes-bootcamp

$ kubectl get pods
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-7799cbcb86-6pwd7   1/1       Running   0          23m
kubernetes-bootcamp-7799cbcb86-7w9zk   1/1       Running   0          23m
kubernetes-bootcamp-7799cbcb86-gjbrb   1/1       Running   0          23m
kubernetes-bootcamp-7799cbcb86-jt8zn   1/1       Running   0          36s

$ kubectl describe pods

gitの過去コミットメッセージの修正

いつも覚えてなくて検索するので、メモ。

$ git rebase -i HEAD~5

"pick" -> "edit"

$ git commit --amend
$ git rebase --continue

こちら参考(というかそのまま)にさせていただきました。

https://www.granfairs.com/blog/staff/git-commit-fix

Kubernetes Tutorials

Kubernetesのお勉強。

- https://dev.classmethod.jp/cloud/kubernetes-tutorial-1/
- https://dev.classmethod.jp/cloud/minikube/

と、本家チュートリアル

- https://kubernetes.io/docs/tutorials/

 

----

 

こっちに、実際にやったコマンドも貼っときました。

Automationとか、DevOpsとか

最近読んだwebのテキストをメモっといてみます。

英語です。読むのに時間かかりました。

主に、O'reillyのニュースレターに載ってたものたちです。

 

8/21追加