SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

開発現場からお届け! Wantedlyのプロダクトを育て、支える技術

オペレーションとルールを統一化し、Kubernetesを使った変化に強いインフラを構築

開発現場からお届け! Wantedlyのプロダクトを育て、支える技術 第2回

リリースまでのオペレーションを統一化(2)

kopsを使ったQA環境で確認してProduction環境にリリースするまでのフロー

qa-deploy
qa-deploy

 Wantedlyでは、kopsを利用してKubernetes on AWS環境を構築しています。

 kops export kubecfgコマンドを実行すると、Kubernetesのconfigファイルをローカルまでエクスポートできます。

 エクスポートした後に、kubectl set imageコマンドを実行すると、そのクラスタでリリースを行うことができます。

・・・・
  - KUBECTL_VERSION=1.6.6 # kubectl の利用するバージョン
  - KOPS_VERSION=1.6.2 # kops の利用するバージョン(k8s on AWS で利用)
  - K8S_PROD_CLUSTER=prod.cluster.example.com # Production 環境のクラスタ名
  - K8S_QA_CLUSTER=qa.cluster.example.com # QA 環境のクラスタ名
・・・・
  ###### kops ######
  # travis encrypt AWS_DEFAULT_REGION=xxx
  - secure: "xxxxxxxxxxxxxxxxxxxxxxxxxx"
  # travis encrypt AWS_REGION=xxx
  - secure: "xxxxxxxxxxxxxxxxxxxxxxxxxx"
  # travis encrypt AWS_ACCESS_KEY_ID=xxx
  - secure: "xxxxxxxxxxxxxxxxxxxxxxxxxx"
  # travis encrypt AWS_SECRET_ACCESS_KEY=xxx
  - secure: "xxxxxxxxxxxxxxxxxxxxxxxxxx"
  # travis encrypt KOPS_STATE_STORE=xxx
  - secure: "xxxxxxxxxxxxxxxxxxxxxxxxxx"
・・・・
before_deploy:
  - curl -SL -o ./kubectl "https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl"
  - chmod +x ./kubectl
  - curl -SL -o ./kops "https://github.com/kubernetes/kops/releases/download/${KOPS_VERSION}/kops-linux-amd64"
  - chmod +x ./kops

deploy:
  skip_cleanup: true
  provider: script
  script: "./script/ci-deploy"
  on:
    all_branches: true

 script/ci-deployでKubernetesのconfigファイルを取得し、kubectlでイメージの入れ替えを行っています。

#!/usr/bin/env bash

set -eu
set -o pipefail

if [ "$TRAVIS_BRANCH" == "master" ]; then
  echo "Deploy ${REPO}:${TAG_COMMIT} in production"
  ./kops export kubecfg --name $K8S_PROD_CLUSTER
else
  echo "Deploy ${REPO}:${TAG_COMMIT} in qa"
  ./kops export kubecfg --name $K8S_QA_CLUSTER
fi

./kubectl set image deployment/${DEPLOYMENT_NAME} rails=${REPO}:${TAG_COMMIT} --namespace=${NAMESPACE} --record

 公開されているURLを確認するコマンドは以下の通りです。

$ kubectl get svc -o yaml -n myapp
・・・・
LoadBalancer Ingress:   your.ap-northeast-1.elb.amazonaws.com

 ブラウザで見ると、下図のように表示されます。

サンプルページの表示
サンプルページの表示

 Pull Requestをマージすると、Travis CIからProduction環境へデプロイします。

master-merge
master-merge

ローカル上でMinikubeを使って確認

 実際に本番で動いているコンテナは、ローカルに落として確認することができます。今回はKubernetesの公式ツールであるMinikubeを使用し、ローカル上にKubernetesを立てて本番に近い環境を用意した上で確認します。

kubectlをインストール
$ brew install kubectl
Minikubeをインストール
$ brew cask install minikube
Minikubeの起動
# 起動
$ minikube start
Starting local Kubernetes v1.7.5 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.

# ステータス確認
$ minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

# kubectl 現在利用している cluster の確認
$ kubectl config current-context
minikube

# 試しにnamespaceの一覧を取得
$ kubectl get namespaces
NAME          STATUS    AGE
default       Active    1m
kube-public   Active    1m
kube-system   Active    1m
Minikube上にリリースする
# Create Namespace
$ kubectl create -f kubernetes/namespace.yaml
namespace "myapp" created

# Create nginx.conf
$ kubectl create -f kubernetes/nginx-config.yaml
configmap "nginx-conf" created

# Create dotenv
$ kubectl create -f kubernetes/dotenv.yaml
secret "dotenv" created

# Create HorizontalPodAutoscaler
$ kubectl create -f kubernetes/myapp-hpa.yaml
horizontalpodautoscaler "myapp" created

# Create Service
$ kubectl create -f kubernetes/myapp-svc.yaml
service "myapp" created

# Create Database
$ kubectl create -f kubernetes/db/
service "postgres" created
deployment "postgres" created

# Create Deployment
$ kubectl create -f kubernetes/myapp.yaml
deployment "myapp" created
kubectl get all -n myappでmyappの全リソースを確認
$ kubectl get all -n myapp
NAME                           READY     STATUS    RESTARTS   AGE
po/myapp-2136627869-62hdf      2/2       Running   0          20m
po/myapp-2136627869-k2l7b      2/2       Running   0          20m
po/myapp-2136627869-nb49l      2/2       Running   0          25m
po/myapp-2136627869-r6961      2/2       Running   0          25m
po/postgres-2312165663-5vzcs   1/1       Running   0          27m

NAME           CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
svc/myapp      10.0.0.57    <pending>     80:30552/TCP     27m
svc/postgres   10.0.0.113   <nodes>       5432:31664/TCP   27m

NAME        REFERENCE          TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
hpa/myapp   Deployment/myapp   <unknown> / 50%   1         20        4          27m

NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/myapp      4         4         4            4           27m
deploy/postgres   1         1         1            1           27m

NAME                     DESIRED   CURRENT   READY     AGE
rs/myapp-1953784979      0         0         0         27m
rs/myapp-2136627869      4         4         4         25m
rs/postgres-2312165663   1         1         1         27m
ブラウザで確認
$ minikube service myapp -n myapp

QA環境に上がっているものをMinikubeで確認

 コミットしたものをMinikubeにリリースしてみます。

git commit log
5b703d4 4 days ago koudaiii fix typo
 script/ci-deploy | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
kubectl set imageコマンドでリリース
$ kubectl set image deployment/myapp rails=quay.io/koudaiii/myapp:5b703d4 -n myapp
deployment "myapp" image updated
入れ替え状況を引数-wで監視
$ kubectl get po -w -n myapp
NAME                        READY     STATUS              RESTARTS   AGE
myapp-1825034293-fd0mm      0/2       ContainerCreating   0          9m
myapp-1825034293-v2qnp      0/2       ContainerCreating   0          9m
myapp-2136627869-62hdf      2/2       Running             0          8h
myapp-2136627869-k2l7b      2/2       Running             0          8h
myapp-2136627869-nb49l      2/2       Running             0          8h
myapp-2136627869-r6961      2/2       Running             0          8h
postgres-2312165663-5vzcs   1/1       Running             0          8h
入れ替わったか確認
$ kubectl describe po -n myapp
・・・・
    Image:		quay.io/koudaiii/myapp:5b703d4
・・・・

次のページ
保守作業によるオペレーションを統一化

この記事は参考になりましたか?

開発現場からお届け! Wantedlyのプロダクトを育て、支える技術連載記事一覧

もっと読む

この記事の著者

坂部 広大(Wantedly, inc.)(サカベ コウダイ)

 Wantedlyの基盤改善および保守運用をしているインフラエンジニア。ツールを作ったり、Web Applicationを作ったり、社内情報システムの整備をしたりしています。 WANTEDLY TECH BOOKを書いています。 Site Twitter Facebook Github Wantedly Engineers Blog

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10428 2017/09/29 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー