こんにちは。KOUKIです。k8s学習中のWebエンジニアです。
今回は、Kubernetesを使ってBlue-Greenデプロイを勉強しましょう。
尚、今回もMinikubeを使いますので、以下の記事でインストール&起動してください。
<目次>
Blue-Greenデプロイ
Blue-Greenデプロイは、新しいバージョンのアプリケーション/サービスを新しいインスタンスにデプロイする方法です。
アプリケーション/サービストラフィックは、検証後に新しいインスタンス(緑色)にルーティングされます。以前のバージョン(青)は、ロールバック用に保持することも、削除することもできます。
アプリケーションの準備
Goを使って簡単なアプリケーションを実装します。
フォルダ/ファイルの準備
1 2 3 4 5 6 7 8 9 10 11 |
mkdir green-blue-deploy cd green-blue-deploy/ mkdir blue touch blue/Dockerfile touch blue/blue.yml touch blue/main.go mkdir green touch green/Dockerfile <meta charset="utf-8">touch green/green.yml touch green/main.go touch service.yml |
Dockerfile
Blue/GreenのDockerfileを用意します。中身は同じです。
1 2 3 4 5 6 7 8 9 10 |
# Dockerfile FROM golang:1.15-alpine WORKDIR /app COPY . . EXPOSE 8080 CMD ["go", "run", "main.go"] |
blue/main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// main.go package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", helloHandler) log.Fatal(http.ListenAndServe(":8080", nil)) } func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "<h1>Hello Blue!</h1>") } |
green/main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// main.go package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", helloHandler) log.Fatal(http.ListenAndServe(":8080", nil)) } func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "<h1>Hello Green!</h1>") } |
blue/blue.yml
Deploymentのymlファイルです。roleのblueが大切です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
apiVersion: apps/v1 kind: Deployment metadata: name: go-deployment-blue spec: replicas: 1 selector: matchLabels: app: go-app template: metadata: labels: app: go-app role: blue spec: containers: - name: go-container image: <meta charset="utf-8"><dockerhubのアカウント名>/go-app:1.0 ports: - containerPort: 8080 |
green/green.yml
Deploymentのymlファイルです。roleのgreenが大切です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: apps/v1 kind: Deployment metadata: name: go-deployment-green spec: replicas: 1 selector: matchLabels: app: go-app template: metadata: labels: app: go-app role: green spec: containers: - name: go-container image: <dockerhubのアカウント名>/go-app:2.0 ports: - containerPort: 8080 |
service.yml
Serviceのymlファイルです。roleはblue(以前のバージョン)を指定しています。つまり、初期表示時にはBlueのPodが呼び出されます。roleで制御するわけですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: go-app spec: selector: app: go-app role: blue ports: - protocol: TCP port: 8080 targetPort: 8080 type: NodePort |
検証
準備が整ったので、検証していきましょう。
Docker Imageのbuild
先ほど作成したGoアプリをDocker Imageにします。
1 2 3 4 5 |
cd blue/ docker build -t go-app-v1 . cd ../green docker build -t go-app-v2 . |
Docker HubへPush
Docker HubへDocker ImageをPushします。
最初に、repositoryを作成しましょう。

先ほど作成したDocker Imageをコンテナ化します。
1 2 3 4 5 6 |
# Tag付け docker tag go-app-v1 <meta charset="utf-8"><dockerhubのアカウント名>/go-app:1.0 docker tag go-app-v2 <meta charset="utf-8"><dockerhubのアカウント名>/go-app:2.0 # Push docker push <dockerhubのアカウント名>/go-app:1.0 docker push <dockerhubのアカウント名>/go-app:2.0 |
Deploymentの作成
以下のコマンドで、Deploymentを作成しましょう。
1 2 3 4 5 6 7 8 |
kubectl apply -f blue/blue.yml kubectl apply -f green/green.yml $ kubectl get pods NAME READY STATUS RESTARTS AGE go-deployment-blue-b5d76b645-xz9qp 1/1 Running 0 52s go-deployment-green-5cc56fbbf9-9dfsk 1/1 Running 0 58s |
Serviceの作成
以下のコマンドで、Serviceを作成しましょう。
1 2 3 4 5 6 |
kubectl apply -f service.yml $ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE go-app NodePort 10.96.187.153 <none> 8080:30438/TCP 22s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 45m |
画面表示
1 2 |
$ minikube service go-app --url http://192.168.99.101:30438 |
ブラウザから上記のURLにアクセスします。

狙い通り、Blue Podが起動していますね。実際にはGreen Podも起動してますが、トラフィックはBlue Podに割り当てられています。
Green Podへの切り替え
Serviceを一旦消します。
1 |
kubectl delete service go-app |
また、service.ymlのroleをgreenに切り替えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: go-app spec: selector: app: go-app role: green <<<<<<<<<<<<<<<<< greenに変更 ports: - protocol: TCP port: 8080 targetPort: 8080 type: NodePort |
serviceを作ります。
1 2 3 |
kubectl apply -f service.yml $ minikube service go-app --url http://192.168.99.101:32302 |
「http://192.168.99.101:32302」にアクセスします。

OKですね。
本当は以下のコマンドで切り替えられるはずなのですが、私の環境だと不可でした^^;
1 2 |
# 切り替えコマンド kubectl patch svc/go-app -p '{"spec":{"selector":{"app":"flask-app","role":"green"}}}' |
おわりに
微妙なBlue-Greenデプロイメント記事になってしまいましたが、やりたいことは伝わったと思います!(前向き)
現場で早くkubernetsを入れたいです。
市場価値を上げるために!
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。