kubernatesチュートリアルをやってみる

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

Create a Cluster

Kubernatesは高可用性クラスタをひとつのサーバのようにあつかうことができる。 以下のふたつから構成される。

  • Clusterを制御するのがMaster
  • アプリケーションを動かすワーカーがNode

Nodeには、Masterと通信して制御をうけるための、Kubeletというアプリが動く。 また、コンテナを動かすため、Dockerないしrktが必要。 運用トラフィックをさばくため? には少なくとも3つのNodeが必要。

チュートリアルはminikubeを使っておこなう。minikubeはNodeひとつだけのミニ環境。

$ minikube version
minikube version: v0.34.1

$ minikube start
o   minikube v0.34.1 on linux (amd64)
>   Configuring local host environment ...
>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
-   "minikube" IP address is 172.17.0.13
-   Configuring Docker as the container runtime ...
-   Preparing Kubernetes environment ...
@   Downloading kubeadm v1.13.3
@   Downloading kubelet v1.13.3
-   Pulling images required by Kubernetes v1.13.3 ...
-   Launching Kubernetes v1.13.3 using kubeadm ...
-   Configuring cluster permissions ...
-   Verifying component health .....
+   kubectl is now configured to use "minikube"
=   Done! Thank you for using minikube!

kubectlで、clusterの情報や参加しているNodeの情報がわかる。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:08:12Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20:00:57Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.13:8443
KubeDNS is running at https://172.17.0.13:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME       STATUS   ROLES    AGE    VERSION
minikube   Ready    master   104s   v1.13.3

Deploy an App

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   37m   v1.13.3
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/kubernetes-bootcamp created
$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           3m16s

Deprecatedってことなので、他の書き方があるはず。

ネットワークの話としては、kubernetes上のpod間は通信ができるが、外部と通信はできない。 kubectlで操作できるのは、APIをたたいて、それ経由でアクセスしているからである。

kubectl proxyで、HTTP(REST?)で操作できるAPIサーバを起動できる。

$ kubectl proxy
Starting to serve on 127.0.0.1:8001
^C
$ curl http://localhost:8001/version
{
  "major": "1",
  "minor": "13",
  "gitVersion": "v1.13.3",
  "gitCommit": "721bfa751924da8d1680787490c54b9179b1fed0",
  "gitTreeState": "clean",
  "buildDate": "2019-02-01T20:00:57Z",
  "goVersion": "go1.11.5",
  "compiler": "gc",
  "platform": "linux/amd64"
}

kubernetesはgolangで作られてるので、golangのテンプレート構文が使えるようだ。

$ kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'
kubernetes-bootcamp-6bf84cb898-4wsck

Explore Your App

Podはひとつ以上のアプリケーションコンテナを含んでいる。 ボリューム、クラスタでユニークなIPアドレス、コンテナの動かしかた(たぶんDockerfile的なやつ)。 Podは「論理的なホスト」であり、Podの中は比較的密結合。

Nodeは、マスタに管理される各ワーカーマシン。 PodはNodeの上で動く。

kubectlのよく使われる操作には下記のようなものがある。

kubectl get
リソースの一覧出力。
kubectl describe
リソースの詳細表示。
kubectl logs
podに含まれるログの出力。
kubectl exec
podに含まれるコンテナでコマンドを実行する。

Expose Your App Publicly

Podは永久に存在するわけではなく、ライフサイクルがある。 Nodeが落ちたらPodも当然落ちる。 ReplicaSetにより、Podを復活させてアプリケーションがサービス提供しつづけられるように動作させることもできる。

PodはそれぞれクラスタでユニークなIPアドレスを持っているので、 Podの変更を意識する必要がでてしまう。

ServiceによりPodの論理セットとアクセスするためのポリシーを定義できる。 Serviceは複数の方法でアクセス方法 (通信方法) を定義できる。

ClusterIP
クラスタ内でのみ到達可能。
NodePort
NodeのIPアドレスをそのまま使う。
LoadBalancer
ロードバランサを使い固定の外部IPを作成。
ExternalName
v1.7以降のkube-dnsが必要。CNAMEレコードを返すことで名前を使えるらしい。

Scale Your App

DeploymentをスケールアウトさせることでPodが作成され、スケールアウトできる。 オートスケーリングも可能。

Update Your App

ローリングアップデート…徐々にバージョンアップする。 デフォルトではバージョンアップするPod、すなわち使用できなくなるPodは1つ。