リリースまでのオペレーションを統一化(2)
kopsを使ったQA環境で確認してProduction環境にリリースするまでのフロー
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環境へデプロイします。
ローカル上でMinikubeを使って確認
実際に本番で動いているコンテナは、ローカルに落として確認することができます。今回はKubernetesの公式ツールであるMinikubeを使用し、ローカル上にKubernetesを立てて本番に近い環境を用意した上で確認します。
$ brew install kubectl
$ brew cask install 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
# 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 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にリリースしてみます。
5b703d4 4 days ago koudaiii fix typo script/ci-deploy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
$ kubectl set image deployment/myapp rails=quay.io/koudaiii/myapp:5b703d4 -n myapp deployment "myapp" image updated
$ 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
・・・・
