KubernetesのDeploymentを試す

Pocket

k8sでDockerイメージを更新するのはどうやるのかなと思って調べたところ、 Deployments というものがあるようなので触ってみた。

これは Pod と ReplicaSet をまとめて管理できるようなもののようですね。

Deployment用のマニフェスト

mysqlは作成済み。以前作ったReplicationControllerやPodは削除しておいた。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: rails-deploy
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: rails
    spec:
      containers:
      - name: rails
        image: localhost:5000/r_takaishi/docker-mysql-rails:0.0.1
        command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
        env:
          - name: RAILS_ENV
            value: development
          - name: MYSQL_HOST
            value: mysql.default.svc.cluster.local
          - name: MYSQL_USER
            value: root
          - name: MYSQL_PASSWORD
            value: passw0rd
        lifecycle:
          postStart:
            exec:
              command:
                - /myapp/post-start.sh
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: rails
spec:
  ports:
  - port: 3000
    targetPort: 3000
    protocol: TCP
  type: LoadBalancer
  selector:
    app: rails

Deploymentを作る

Deploymentを作成します。kubectlコマンドにもそろそろ慣れてきたな。

$ kubectl apply -f ./deploy.yml
deployment "rails-deploy" created
service "rails" configured

作成するとDeploymentとReplicaSet、Pod、Serviceが作られる。

# deployment一覧
$ kubectl get deployments
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
rails-deploy   5         5         5            5           30s

# replicaset一覧
$ kubectl get replicasets
NAME                      DESIRED   CURRENT   READY     AGE
rails-deploy-3732838062   5         5         5         35s

# pods一覧
$ kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
mysql-8kd4q                     1/1       Running   4          7d
rails-deploy-3732838062-4zwgr   1/1       Running   0          37s
rails-deploy-3732838062-hzv0q   1/1       Running   0          37s
rails-deploy-3732838062-mlw93   1/1       Running   0          37s
rails-deploy-3732838062-x388m   1/1       Running   0          37s
rails-deploy-3732838062-zvxbq   1/1       Running   0          37s

# service一覧
$ kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.0.0.1     <none>        443/TCP          7d
mysql        10.0.0.253   <pending>     3306:31785/TCP   7d
rails        10.0.0.214   <pending>     3000:31640/TCP   1h

イメージを更新したらローリングデプロイされる様子を観察する

この時点ではデプロイされているイメージは0.0.1。

$ kubectl get pods -o json | jq -r '.items[] | [.metadata.name, .status.phase, .spec.containers[0].image] | @tsv'
mysql-8kd4q     Running mysql
rails-deploy-3732838062-5bpzw   Running localhost:5000/r_takaishi/docker-mysql-rails:0.0.1
rails-deploy-3732838062-c086n   Running localhost:5000/r_takaishi/docker-mysql-rails:0.0.1
rails-deploy-3732838062-dp1xl   Running localhost:5000/r_takaishi/docker-mysql-rails:0.0.1
rails-deploy-3732838062-mg55s   Running localhost:5000/r_takaishi/docker-mysql-rails:0.0.1
rails-deploy-3732838062-nn7dv   Running localhost:5000/r_takaishi/docker-mysql-rails:0.0.1

これを0.0.2などに変更すると、そのイメージにローリングデプロイされるはず。

イメージを更新するにはこうやる。簡単〜

$ kubectl set image deployment/rails-deploy rails=localhost:5000/r_takaishi/docker-mysql-rails:0.0.2
deployment "rails-deploy" image updated

デプロイの様子を見守ろう。

$ watch -n 0.5 "kubectl get pods -o json | jq -r '.items[] | [.metadata.name, .status.phase, .spec.containers[0].image] | @tsv'"

 

ちゃんと、少しずつ0.0.1から0.0.2に切り替わっていることを確認できた。すごい!

ロールバックやオートスケールなど

間違えたような場合はロールバックできる。

$ kubectl rollout undo deployment/rails-deploy

レプリカセットの台数も設定可能。

$ kubectl scale deployment rails-deploy --replicas 5

まとめ

Deployment機能を触って、イメージを簡単に更新できそうだ、というのを知ることができた。ロールバック、スケールアウトも楽々でわくわくする。ただ、起動コンテナが増えた場合やそもそものイメージサイズが大きい場合、完全に切り替わるのにどのくらい時間がかかるのかは気になるな。

1 Comment

Leave a Reply

Your email address will not be published. Required fields are marked *