GSP053
概要
DevOps のプラクティスでは、「継続的デプロイ」「Blue/Green デプロイ」「カナリア デプロイ」などのアプリケーション デプロイのシナリオを管理するために、複数のデプロイメントを使用することがよくあります。このラボでは、複数の異種混合デプロイメントが使用される一般的なシナリオに対応できるように、コンテナをスケールして管理する方法を学習します。
目標
このラボでは、次のタスクの実行方法について学びます。
kubectl
ツールを使用する
デプロイメントの yaml
ファイルを作成する
デプロイメントをリリース、更新、スケールする
デプロイメントを更新し、デプロイのスタイルについて学ぶ
前提条件
学習の効果を最大化するために、このラボでは次のことをおすすめします。
以下の Google Cloud Skills Boost ラボを受講していること。
Linux システムの管理スキルがあること。
DevOps の理論: 継続的デプロイのコンセプトを理解していること。
デプロイメントの概要
異種混合デプロイメントには通常、特定の技術的ニーズや運用上のニーズに対応するため、2 つ以上の異なるインフラストラクチャ環境またはリージョンが関与します。異種混合デプロイメントは、その特性に応じて「ハイブリッド」「マルチクラウド」「パブリック / プライベート」と呼ばれます。
このラボでは、単一のクラウド環境、複数のパブリック クラウド環境(マルチクラウド)、またはオンプレミス環境とパブリック クラウド環境の組み合わせ(ハイブリッドまたはパブリック / プライベート)において、複数のリージョンにまたがる異種混合デプロイメントを扱います。
単一の環境またはリージョンに限定されたデプロイでは、ビジネス上や技術上のさまざまな課題が発生する可能性があります。
リソースの上限 : 単一の環境、特にオンプレミス環境では、本番環境のニーズを満たすコンピューティング リソース、ネットワーキング リソース、ストレージ リソースを確保できない場合があります。
地理的範囲の制限 : 単一環境のデプロイでは、地理的に離れた場所にいるユーザーが互いに 1 つのデプロイにアクセスする必要があります。つまり、ユーザーのトラフィックは、中心となる場所に到達するまでに世界中を移動する可能性があります。
限られた可用性 : ウェブ規模のトラフィック パターンを処理するアプリケーションは、フォールト トレランスと復元力を維持する必要があります。
ベンダー ロックイン : プラットフォームとインフラストラクチャがベンダーレベルで抽象化されるため、アプリケーションの移植が妨げられる場合があります。
柔軟性の低いリソース : リソースが特定のコンピューティング、ストレージ、ネットワーキング サービスに限定される場合があります。
異種混合デプロイはこれらの課題に対処するのに役立ちますが、プログラマティックで確定的なプロセスと手順を使用して設計する必要があります。一度限りまたはその場しのぎのデプロイ手順では、デプロイやプロセスが脆弱になり、障害に耐えられない可能性があります。また、その場しのぎのプロセスはデータの喪失やトラフィックの低下を招く場合もあります。優れたデプロイ プロセスは再現可能でなければならず、プロビジョニング、構成、メンテナンスの管理には実績のあるアプローチが必要になります。
異種混合デプロイメントの一般的なシナリオには、次の 3 つがあります。
マルチクラウド デプロイ
オンプレミス データの外部接続
継続的インテグレーション / 継続的デリバリー(CI / CD)プロセス
以降の演習では、Kubernetes とその他のインフラストラクチャ リソースを使用して適切に設計されたアプローチで異種混合デプロイメントの一般的なユースケースの実習を行います。
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始 ] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
[ラボを開始 ] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細 ] パネルには、以下が表示されます。
[Google Cloud コンソールを開く ] ボタン
残り時間
このラボで使用する必要がある一時的な認証情報
このラボを行うために必要なその他の情報(ある場合)
[Google Cloud コンソールを開く ] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウでリンクを開く ] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン ] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択 ] ダイアログが表示されたら、[別のアカウントを使用 ] をクリックします。
必要に応じて、下のユーザー名 をコピーして、[ログイン ] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細 ] パネルでも [ユーザー名 ] を確認できます。
[次へ ] をクリックします。
以下のパスワード をコピーして、[ようこそ ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細 ] パネルでも [パスワード ] を確認できます。
[次へ ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
その後次のように進みます。
利用規約に同意してください。
一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニュー をクリックします。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする 」アイコン をクリックします。
接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
Your Cloud Platform project in this session is set to YOUR_PROJECT_ID
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
(省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
[承認 ] をクリックします。
出力は次のようになります。
出力:
ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
$ gcloud config set account `ACCOUNT`
(省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project = <project_ID>
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注: Google Cloud における gcloud
ドキュメントの全文については、gcloud CLI の概要ガイド をご覧ください。
ゾーンを設定する
ローカルゾーンとして を指定して次のコマンドを実行し、使用する Google Cloud ゾーンを設定します。
gcloud config set compute/zone {{{ project_0.default_zone | ZONE }}}
このラボのサンプルコードを入手する
コンテナと Deployment を作成して実行するためのサンプルコードを入手します。
gsutil -m cp -r gs://spls/gsp053/orchestrate-with-kubernetes .
cd orchestrate-with-kubernetes/kubernetes
3 つのノードがあるクラスタを作成します(完了するまでに数分かかります)。
gcloud container clusters create bootcamp \
--machine-type e2-small \
--num-nodes 3 \
--scopes "https://www.googleapis.com/auth/projecthosting,storage-rw"
タスク 1. Deployment オブジェクトについて学習する
まず、Deployment オブジェクトについて調べます。
kubectl
の explain
コマンドで、Deployment オブジェクトの説明を確認できます。
kubectl explain deployment
--recursive
オプションを使用してすべてのフィールドを確認することもできます。
kubectl explain deployment --recursive
ラボを進めながら explain コマンドを使用すると、Deployment オブジェクトの構造や、各フィールドの機能を理解するのに役立ちます。
kubectl explain deployment.metadata.name
タスク 2. Deployment を作成する
deployments/auth.yaml
構成ファイルを更新します。
vi deployments/auth.yaml
エディタを開きます。
i
Deployment の containers セクションにある image
を次のように変更します。
...
containers:
- name: auth
image: "kelseyhightower/auth:1.0.0"
...
auth.yaml
ファイルを保存します(Esc
キーを押してから、次のように入力します)。
:wq
Enter
キーを押します。次に単純な Deployment を作成します。Deployment の構成ファイルを確認します。
cat deployments/auth.yaml
出力:
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
track: stable
spec:
containers:
- name: auth
image: "kelseyhightower/auth:1.0.0"
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
...
Deployment でレプリカが 1 つ作成され、バージョン 1.0.0 の auth コンテナが使用されていることがわかります。
kubectl create
コマンドを使用して auth Deployment を作成すると、Deployment のマニフェスト内のデータに準拠する Pod が 1 つ作成されます。これは、replicas
フィールドに指定する数を変更することで、Pod の数をスケールできることを意味しています。
では、kubectl create
を使用して Deployment オブジェクトを作成しましょう。
kubectl create -f deployments/auth.yaml
Deployment が実際に作成されていることを確認します。
kubectl get deployments
Deployment が作成されると、Kubernetes はその ReplicaSet
を作成します。Deployment の ReplicaSet
が作成されたことを確認できます。
kubectl get replicasets
auth-xxxxxxx
のような名前の ReplicaSet
が表示されます。
Deployment の一部として作成された Pod を確認します。ReplicaSet
が作成されるときに、Kubernetes によって Pod が 1 つ作成されます。
kubectl get pods
次に、auth Deployment 用の Service を作成します。Service マニフェスト ファイルについてはすでに説明したためここでは詳細は割愛します。
kubectl create
コマンドを使用して auth Service を作成します。
kubectl create -f services/auth.yaml
次に、同じ手順で hello
Deployment を作成して公開します。
kubectl create -f deployments/hello.yaml
kubectl create -f services/hello.yaml
さらに、同じ手順で frontend
Deployment を作成して公開します。
kubectl create secret generic tls-certs --from-file tls/
kubectl create configmap nginx-frontend-conf --from-file=nginx/frontend.conf
kubectl create -f deployments/frontend.yaml
kubectl create -f services/frontend.yaml
注: frontend の ConfigMap
が作成されました。
フロントエンドの外部 IP を取得して curl を実行し、フロントエンドを操作します。
kubectl get services frontend
注: Service の External-IP フィールドに値が表示されるまでに数秒かかる場合がありますが、これは正常な動作です。このフィールドに値が表示されるまで、数秒ごとに上のコマンドを再実行します。
curl -ks https://<EXTERNAL-IP>
hello レスポンスが返されます。
kubectl
の出力テンプレート機能を使用して、curl を 1 行で実行することもできます。
curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`
完了したタスクをテストする
下の [進行状況を確認 ] をクリックして、ラボの進捗状況を確認します。Kubernetes クラスタに加え、Auth、Hello、フロントエンド Deployment が正常に作成されている場合は、評価スコアが表示されます。
Kubernetes クラスタと Deployment(Auth、Hello、フロントエンド)を作成する
Deployment をスケールする
次は、作成した Deployment をスケールします。そのために、spec.replicas
フィールドを更新します。
kubectl explain
コマンドをもう一度使用して、このフィールドの説明を確認してください。
kubectl explain deployment.spec.replicas
replicas フィールドは、kubectl scale
コマンドを使って簡単に更新できます。
kubectl scale deployment hello --replicas=5
注: 新しい Pod がすべて起動するまでに数分かかる場合があります。
Deployment が更新されると、Kubernetes は関連する ReplicaSet
を自動的に更新し、Pod の総数が 5 になるように新しい Pod を起動します。
5 つの hello
Pod が実行されていることを確認します。
kubectl get pods | grep hello- | wc -l
今度はアプリケーションのスケールを戻します。
kubectl scale deployment hello --replicas=3
ここでも、Pod の数が正しいことを確認します。
kubectl get pods | grep hello- | wc -l
Kubernetes の Deployment と、Pod のグループを管理してスケールする方法について学びました。
タスク 3. ローリング アップデート
Deployment では、ローリング アップデートのメカニズムを使用してイメージを新しいバージョンに更新できます。Deployment を新しいバージョンで更新すると、ReplicaSet
が新たに作成され、古い ReplicaSet
のレプリカ数が減少するにつれて、新しい ReplicaSet
のレプリカ数が徐々に増加します。
ローリング アップデートをトリガーする
Deployment を更新するには、次のコマンドを実行します。
kubectl edit deployment hello
Deployment の containers セクションにある image
を次のように変更します。
...
containers:
image: kelseyhightower/hello:2.0.0
...
保存 して終了 します。
更新された Deployment がクラスタに保存され、Kubernetes がローリング アップデートを開始します。
Kubernetes によって作成された新しい ReplicaSet
を確認します。
kubectl get replicaset
ロールアウト履歴にも新しいエントリが表示されます。
kubectl rollout history deployment/hello
ローリング アップデートを一時停止する
実行中のロールアウトで問題が検出された場合は、一時停止してアップデートを中止します。
次のコマンドを実行してロールアウトを一時停止します。
kubectl rollout pause deployment/hello
ロールアウトの現在の状態を確認します。
kubectl rollout status deployment/hello
Pod で直接確認することもできます。
kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
ローリング アップデートを再開する
ロールアウトを一時停止すると、新旧のバージョンの Pod が混在した状態になります。
resume
コマンドを使用してロールアウトを続行してください。
kubectl rollout resume deployment/hello
ロールアウトの完了後に status
コマンドを実行すると、次のように表示されます。
kubectl rollout status deployment/hello
出力:
deployment "hello" successfully rolled out
更新をロールバックする
新しいバージョンでバグが検出されたと仮定します。この場合は新しいバージョンに問題があると考えられるため、新しい Pod に接続したユーザーにこれらの問題が発生することになります。
調査後にきちんと修正したバージョンをリリースするためには、以前のバージョンにロールバックする必要があります。
rollout
コマンドを使用して、以前のバージョンにロールバックします。
kubectl rollout undo deployment/hello
履歴でロールバックを確認します。
kubectl rollout history deployment/hello
最後に、すべての Pod が以前のバージョンにロールバックされていることを確認します。
kubectl get pods -o jsonpath --template='{range .items[*]}{.metadata.name}{"\t"}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
これで完了です。Kubernetes Deployment のローリング アップデートを行う方法と、ダウンタイムなしでアプリケーションを更新する方法について学びました。
タスク 4. カナリア デプロイ
本番環境で一部のユーザーを対象に新しいデプロイをテストする場合は、カナリア Deployment を使用します。この方法では一部のユーザーに変更をリリースすることで、新しいリリースに伴うリスクを軽減できます。
カナリア Deployment を作成する
カナリア Deployment は、新しいバージョンを含む独立した Deployment と、通常の安定した Deployment とカナリア Deployment の両方をターゲットとする Service で構成されています。
まず、新しいバージョン用の新しいカナリア Deployment を作成します。
cat deployments/hello-canary.yaml
出力:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-canary
spec:
replicas: 1
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
track: canary
# Use ver 2.0.0 so it matches version on service selector
version: 2.0.0
spec:
containers:
- name: hello
image: kelseyhightower/hello:2.0.0
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
...
カナリア Deployment を作成します。
kubectl create -f deployments/hello-canary.yaml
カナリア Deployment を作成すると、hello
と hello-canary
の 2 つの Deployment が存在する状態になります。次の kubectl
コマンドを使用して確認してください。
kubectl get deployments
hello
サービスでは、app:hello
セレクタは本番環境デプロイとカナリア デプロイの両方 の Pod に一致します。ただし、カナリア Deployment の Pod 数は少ないため、少数のユーザーにしか表示されません。
カナリア Deployment を確認する
リクエストに応じて提供される hello
バージョンを確認できます。
curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
これを数回実行すると、一定のリクエストが hello 1.0.0 によって処理され、ごく一部(1/4 = 25%)が 2.0.0 によって処理されることがわかります。
完了したタスクをテストする
下の [進行状況を確認 ] をクリックして、ラボの進捗状況を確認します。カナリア Deployment が正常に作成されている場合は、評価スコアが表示されます。
カナリア デプロイ
本番環境でのカナリア デプロイ - セッション アフィニティ
このラボで Nginx サービスに送信した各リクエストは、カナリア デプロイで処理される可能性がありましたが、これを避けたい場合もあります。たとえば、アプリケーションの UI が変更されるユースケースで、ユーザーを混乱させたくないときなどです。このような場合は、ユーザーをいずれかのデプロイに「固定」できます。
これは、セッション アフィニティを指定してサービスを作成することで実現できます。これにより、同じユーザーが常に同じバージョンで処理されます。以下の例では、サービスは前と同じですが、新しく追加された sessionAffinity
フィールドが ClientIP
に設定されているため、同じ IP アドレスを持つすべてのクライアントのリクエストは、同じバージョンの hello
アプリケーションに送信されることになります。
kind: Service
apiVersion: v1
metadata:
name: "hello"
spec:
sessionAffinity: ClientIP
selector:
app: "hello"
ports:
- protocol: "TCP"
port: 80
targetPort: 80
このテスト環境の設定は簡単ではないためここでは行いませんが、本番環境でのカナリア デプロイには sessionAffinity
を使用することをおすすめします。
タスク 5. Blue/Green デプロイ
オーバーヘッド、パフォーマンスへの影響、ダウンタイムを最小限に抑えながら徐々にアプリケーションをデプロイできるローリング アップデートは、理想的な方法です。さらに、完全にデプロイされるまで新しいバージョンを指定しないようにロードバランサを変更すると効果的な場合があります。これには、Blue / Green デプロイが有効です。
Kubernetes は、古い「Blue」バージョン用と新しい「Green」バージョン用に 2 つの異なるデプロイメントを作成することでこれを実現します。「Blue」バージョンには既存の hello
デプロイメントを使用します。ここでは、ルーターとして機能するサービスを介してアクセスします。新しい「Green」バージョンが稼働したら、サービスを更新してそのバージョンを使用するように切り替えます。
注: Blue/Green デプロイの主な短所は、アプリケーションをホストするために必要なクラスタのリソースが少なくとも 2 倍になることです。アプリケーションの両方のバージョンを同時にデプロイする前に、クラスタに十分なリソースがあることを確認してください。
Service
既存の hello サービスを使用しますが、app:hello
、version: 1.0.0
のセレクタを持つように更新してください。このセレクタは既存の「Blue」デプロイとは一致しますが、使用するバージョンが異なるため、「Green」デプロイメントとは一致しません。
kubectl apply -f services/hello-blue.yaml
注: resource service/hello is missing
という警告は無視します(自動的にパッチが適用されるため)。
Blue/Green デプロイを使用して更新する
Blue/Green デプロイ スタイルをサポートするために、新しいバージョン用に「Green」Deployment を新たに作成します。この Green Deployment によって、バージョン ラベルとイメージパスが更新されます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-green
spec:
replicas: 3
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
track: stable
version: 2.0.0
spec:
containers:
- name: hello
image: kelseyhightower/hello:2.0.0
ports:
- name: http
containerPort: 80
- name: health
containerPort: 81
resources:
limits:
cpu: 0.2
memory: 10Mi
livenessProbe:
httpGet:
path: /healthz
port: 81
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 15
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /readiness
port: 81
scheme: HTTP
initialDelaySeconds: 5
timeoutSeconds: 1
Green Deployment を作成します。
kubectl create -f deployments/hello-green.yaml
作成した Green Deployment が正常に起動したら、現在のバージョンである 1.0.0 が使用されていることを確認します。
curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
次に、新しいバージョンを指定するように Service を更新します。
kubectl apply -f services/hello-green.yaml
Service が更新されると、すぐに「Green」Deployment が使用されるようになり、常に新しいバージョンが使用されていることを確認できます。
curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
Blue/Green ロールバック
必要に応じて、同じ方法で古いバージョンにロールバックできます。
「Blue」Deployment が実行されている間に、Service を古いバージョンに戻すだけです。
kubectl apply -f services/hello-blue.yaml
Service が更新されたら、ロールバックは完了です。再度、正しいバージョンが使用されていることを確認してください。
curl -ks https://`kubectl get svc frontend -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`/version
これで完了です。Blue / Green デプロイメントと、バージョンをすべて一度に切り替える必要があるアプリケーションにアップデートをデプロイする方法について学びました。
お疲れさまでした
このラボでは、kubectl
コマンドライン ツールと、YAML ファイルに設定されたさまざまなスタイルの構成を活用して、デプロイメントをリリース、更新、スケールしました。この基礎演習で培ったスキルは、実際の DevOps 環境で問題なく役立つことでしょう。
次のステップと詳細情報
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラス では、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格 を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2024 年 4 月 2 日
ラボの最終テスト日: 2023 年 8 月 14 日
Copyright 2025 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。