Kubernetes こと始め (1)
フロントエンドエンジニア向けにKubernetesの勉強会を軽くすることになったので、それ用のメモ。 Google Container Engineで動かすこと前提。
gcloudのinstall
https://cloud.google.com/sdk/docs/quickstart-mac-os-x で。
設定
# ログイン $ gcloud auth login # デフォルトproject設定 $ gcloud config set project PROJECT_ID` # デフォルトリージョン設定 $ gcloud config set compute/zone asia-east1-a
リージョンについては下にあるものを選ぶ。 https://cloud.google.com/compute/docs/regions-zones/regions-zones
kubectlのインストール
$ gcloud components install kubectl
クラスタを作成する
$ gcloud container clusters create --machine-type=f1-micro kube-test-cluster Creating cluster kube-test-cluster...done. Created [https://container.googleapis.com/v1/projects/ <PROJECT_ID>/zones/asia-east1-a/clusters/kube-test-cluster]. kubeconfig entry generated for kube-test-cluster. NAME ZONE MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS kube-test-cluster asia-east1-a 1.3.6 104.199.203.122 f1-micro 1.3.6 3 RUNNING
machine-type で性能を選ぶ。 クラスタが立ち上がるとnodeができる。 デフォルトだとnodeが3つできる。
$ kubectl get nodes NAME STATUS AGE gke-kube-test-cluster-default-pool-0bed821e-795n Ready 4m gke-kube-test-cluster-default-pool-0bed821e-iac7 Ready 4m gke-kube-test-cluster-default-pool-0bed821e-mxu9 Ready 4m
Container Registry にimageを登録する
Docker Imageのプライベートな置き場所としてGoogle Container Registry というのがあるので、そこのイメージを置いてみる。
$ docker pull nginx $ docker tag nginx gcr.io/ <PROJECT_ID>/nginx $ gcloud docker push grc.io/ <PROJECT_ID>/nginx
とりあえずオフィシャルの nginx を取得して、自分の環境のタグをつけてPushをしている。
Container Registryのイメージをpullしてくる
ちなみにレジストリにあるイメージをGCP外の自分の環境で取得したい場合は gcloud docker
が使える。
$ gcloud docker pull gcr.io/ <PROJECT_ID>/nginx
docker run
クラスタ内部でdocker containerを作成する
$ kubectl run test-1 --image=gcr.io/ <PROJECT_ID>/nginx:latest --port=80 deployment "test-1" created
これで Deployment
と Replication Controller
Pods
が作成される。
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE test-1 1 1 1 1 59s $ kubectl get pods NAME READY STATUS RESTARTS AGE test-1-4012555373-4cptm 1/1 Running 0 1m
リソースタイプ
PodやReplication Controllerなど構成する上で知る必要があるものがいくつかある。
すべて kubectl から生成できる。
これらは引数で直接値を渡していたが、-f
を使って設定を丸ごと渡せる。
kubectl create -f example.yml
Pods
いくつかのコンテナをグループ化したもの。 Kubernetesの操作は必ずこの単位で操作を行う(コンテナ単位じゃない)。
Pod内コンテナは同一ホスト上に配備される。 Pod内は仮想NICやプロセステーブルを共有。
apiVersion: v1 kind: Pod metadata: name: nginx-1 spec: containers: - name: nginx-1-1 image: gcr.io/ <PROJECT_ID>/nginx:latest ports: - containerPort: 80
こんな設定をしておけば、kubectl create -f dev.yml
kubectl delete -f dev.yml
などの操作が可能になる。
Replication Controlles(RCs)
Podのレプリカ数を維持するための機能。
apiVersion: v1 kind: ReplicationController # kindをReplicationControllerに metadata: name: nginx-rc-1 spec: replicas: 2 # レプリカ数の定義 selector: # どのPodを監視対象にするかの設定 app: petshop # labelにpetshop があるやつ template: metadata: labels: # labelにペットショップを設定 app: petshop spec: containers: - name: nginx-1-1 image: gcr.io/ <PROJECT_ID>/nginx:latest ports: - containerPort: 80
これでReplication Controllerが出来て、podsができる
$ kubectl create -f dev-rc.yml $ kubectl get rc NAME DESIRED CURRENT AGE nginx-rc-1 2 2 3m $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-rc-1-igrbw 1/1 Running 0 1m nginx-rc-1-mi9jg 1/1 Running 0 1m
これでpodsだけ消してもすぐに立ち上がるようになる。
$ kubectl delete pods nginx-rc-1-mi9jg pod "nginx-rc-1-mi9jg" deleted $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-rc-1-hi59s 1/1 Running 0 4s # 新しくなった nginx-rc-1-igrbw 1/1 Running 0 3m
Deployments
http://kubernetes.io/docs/user-guide/deployments/
kubectrl run
で実行すると、Pods
ReplicationController
の他に
Deployment
まで作成される。
Deploymentは、RollbackやDeployの停止や状態などを管理している。
serviceを作ってアクセス可能にする
今のままでは、外部からのアクセスができない。なのでServiceを作って外からアクセスできるようにする。
$ kubectl expose deployment test-1 --type="LoadBalancer" service "test-1" exposed $ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.3.240.1 <none> 443/TCP 5h test-1 10.3.241.155 104.199.150.106 80/TCP 21s
これで curl http://104.199.150.106
でnginxにアクセスできるようになる。
$ curl http://104.199.162.243 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
詳細は(2) で。
deployment の削除
Deploymentが削除できればReplication ControllerもPodも削除できる。
$ kubectl delete service test-1 service "test-1" deleted $ kubectl delete deployment test-1 deployment "test-1" deleted $ gcloud container clusters delete kube-test-cluster The following clusters will be deleted. - [kube-test-cluster] in [asia-east1-a] Do you want to continue (Y/n)? Y Deleting cluster kube-test-cluster...done. Deleted [https://container.googleapis.com/v1/projects/ <PROJECT_ID>/zones/asia-east1-a/clusters/kube-test-cluster].
まとめ
ざっくり動く環境を持ちたいならこんな感じ。 次は Service と Networking についてまでまとめられれば、事始め的には良さそう。
(追記) 書きました。