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

これで DeploymentReplication 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 についてまでまとめられれば、事始め的には良さそう。

(追記) 書きました。

taizo.hatenablog.jp

参考

Kubernetes - User Guide qiita.com