Kubernetes マニフェスト タスク

ビルドまたはリリース パイプラインで Kubernetes マニフェスト タスクを使用して、Kubernetes クラスターにマニフェストをベイクしてデプロイします。

概要

このタスクの主な利点を次に示します。

  • 成果物の 置換: デプロイ アクションは、タグとダイジェストと共に指定できるコンテナー イメージの一覧を入力として受け取る。 クラスターに適用する前に、非プラットフォーム化されたマニフェスト ファイルに同じ入力が置き換えされます。 この置換により、クラスター ノードが適切なバージョンのイメージをプルします。

  • マニフェストの安定性: デプロイされた Kubernetes オブジェクトのロールアウト状態がチェックされます。 タスクの状態が成功か失敗かを判断するために、安定性チェックが組み込まれる。

  • 追跡可能性の注釈: 追跡可能性情報を重ね合わせするために、デプロイされた Kubernetes オブジェクトに注釈が追加されます。 次の注釈がサポートされています。

    • azure-pipelines/org
    • azure-pipelines/project
    • azure-pipelines/pipeline
    • azure-pipelines/pipelineId
    • azure-pipelines/execution
    • azure-pipelines/executionuri
    • azure-pipelines/jobName
  • シークレット処理: createSecret アクションを使用 すると、Docker レジストリ サービス接続を使用して Docker レジストリ シークレットを作成できます。 また、プレーンテキスト変数またはシークレット変数を使用して汎用シークレットを作成できます。 クラスターにデプロイする前に、シークレット入力とデプロイ アクションを使用して、入力マニフェスト ファイルを適切な imagePullSecrets 値で拡張できます。

  • ベイク マニフェスト: タスク のベイ ク アクションを使用すると、テンプレートを Kubernetes マニフェスト ファイルにベイクできます。 このアクションでは、Helm、Compose、kustomize などのツールが使用されます。 ベイクを使用すると、これらの Kubernetes マニフェスト ファイルをクラスターへのデプロイに使用できます。

  • デプロイ戦略: デプロイアクションでカナリア戦略を選択すると、"ベースライン" と "カナリア" というサフィックスが付いた名前を持つワークロードが作成されます。 このタスクでは、トラフィック分割の 2 つの方法がサポートされています。

    • サービス メッシュ インターフェイス: サービス メッシュ インターフェイス (SMI) の抽象化により、Linkerd や Istio のようなサービス メッシュ プロバイダーを使用して構成できます。 Kubernetes マニフェスト タスクは、デプロイ戦略のライフ サイクル中に、SMI TrafficSplit オブジェクトを安定した、ベースライン、カナリア サービスにマップします。

      サービス メッシュに基づいており、このタスクを使用するカナリア デプロイの方が正確です。 この精度は、サービス メッシュ プロバイダーがトラフィックの詳細な割合ベースの分割を有効にしている場合に生じられます。 サービス メッシュでは、ポッドに挿入されるサービス レジストリとサイドカー コンテナーが使用されます。 この挿入は、きめ細かいトラフィック分割を実現するために、アプリケーション コンテナーと共に行われます。

    • サービス メッシュのない Kubernetes: サービス メッシュがない場合、要求レベルで必要な正確な割合の分割が得されない場合があります。 ただし、安定したバリアントの横にあるベースラインバリアントとカナリア バリアントを使用して、カナリア デプロイを実行できる場合があります。

      セレクター ラベル制約が満たされた場合、サービスは 3 つのワークロード バリアントのポッドに要求を送信します。 Kubernetes マニフェストは、ベースラインバリアントとカナリア バリアントを作成するときにこれらの要求を受け入れる。 このルーティング動作は、カナリアへの要求の合計の一部のみをルーティングする目的の効果を実現します。

    リリース パイプラインの手動介入タスクまたは YAMLパイプラインの遅延タスクを使用して、ベースラインワークロードとカナリア ワークロードを比較します。 タスクの昇格または拒否アクションを使用する前に比較を行います。

デプロイ アクション

パラメーター 説明
action
アクション
(必須)

deploy
kubernetesServiceConnection
Kubernetes サービス接続
(Kubernetes環境でタスクを使用しない限り必須)

Kubernetes サービス接続 の名前
namespace
名前空間
(Kubernetes環境でタスクを使用しない限り必須)

デプロイするクラスター内の名前空間。
manifests
マニフェスト
(必須)

配置に使用するマニフェスト ファイルへのパス。 各行は 1 つのパスを表します。 ファイル 一致パターンは 、各行で許容される値です。
containers
コンテナー
(オプション)。

マニフェスト ファイルの置換に使用するイメージの完全修飾 URL。 この入力では、改行で区切られた形式で複数の成果物の置換を指定できます。 次に例を示します。

containers: |
  contosodemo.azurecr.io/foo:test1
  contosodemo.azurecr.io/bar:test2

この例では、入力マニフェスト ファイルの image フィールドで および へのすべての参照 contosodemo.azurecr.io/foo contosodemo.azurecr.io/bar が検索されます。 見つかった各一致について、 タグ test1 または は、一致 test2 した参照を置き換える。
imagePullSecrets
イメージがシークレットをプルする
(オプション)。

複数行の入力。各行には、クラスター内で既に設定されている Docker レジストリ シークレットの名前が含まれている。 各シークレット名は、入力マニフェスト ファイルにあるワークロードの imagePullSecrets の下に追加されます。
戦略
戦略
(オプション)。

マニフェスト ファイルがクラスターに適用されている間に使用される配置戦略。 現時点では 、カナリアが 唯一許容されるデプロイ戦略です。
trafficSplitMethod
トラフィックの分割方法
(オプション)。

使用できる値は ポッドと smi です。 既定値はポッド です

smiの場合、トラフィック分割の割合は、サービス メッシュを使用して要求レベルで行われます。 クラスター管理者がサービス メッシュを設定する必要があります。このタスクは、SMI TrafficSplit オブジェクトのオーケストレーションを処理 します。

値ポッドの 場合、サービス メッシュがない場合、要求レベルで割合の分割を行う必要があります。 代わりに、入力の割合を使用して、ベースラインとカナリアのレプリカを計算します。 計算は、安定したバリアントの入力マニフェストで指定されたレプリカの割合です。
割合
パーセント
(戦略がカナリア に設定 されている場合 にのみ必須)

マニフェスト ファイルに含まれるワークロードのベースライン バリアントレプリカとカナリア バリアント レプリカの数を計算するために使用される割合。

指定した割合の入力に対して、次の計算を行います。

(percentage ×レプリカ     の数) / 100

結果が整数ではない場合、ベースラインバリアントとカナリア バリアントが作成されると、結果の数学的なフロアが使用されます。

たとえば、配置 hello-world が入力マニフェスト ファイルに含まれています。次の行がタスク入力にあるとします。

replicas: 4
strategy: canary
percentage: 25

この場合、デプロイ hello-world-baseline と hello-world-canary は、それぞれ 1 つのレプリカで作成されます。 ベースライン バリアントは、安定バージョンと同じイメージとタグを使用して作成されます。これは、デプロイ前の 4 レプリカ バリアントです。 カナリアバリアントは、新しくデプロイされた変更に対応するイメージとタグを使用して作成されます。
baselineAndCanaryReplicas
ベースラインとカナリアレプリカ
(省略可能、 trafficSplitMethodsmi-sに設定されている場合にのみ関連します)

TrafficSplitMethodsmi-sに設定すると、トラフィック分割率はサービスメッシュ平面で制御されます。 ただし、トラフィックの分割とは無関係に、カナリアとベースラインのバリアントの実際のレプリカ数を制御できます。

たとえば、入力配置マニフェストで、安定したバリアントに対して30個のレプリカが指定されているとします。 また、タスクに次の入力を指定するとします。

strategy: canary
trafficSplitMethod: smi
percentage: 20
baselineAndCanaryReplicas: 1

この場合、安定したバリアントはトラフィックの80% を受け取りますが、ベースラインとカナリアバリアントはそれぞれ、指定された20% の半分を受け取ります。 ただし、ベースラインとカナリアのバリエーションにはそれぞれ3つのレプリカがありません。 代わりに、指定された数のレプリカを受け取ります。これは、それぞれが1つのレプリカを受け取ることを意味します。
rolloutStatusTimeout
ロールアウトステータスのタイムアウト
(オプション)。

ロールアウト状態の監視を終了するまでの待機時間 (秒)。 既定値は 0 (待機しない) です。

次の YAML コードは、マニフェストファイルを使用して Kubernetes 名前空間に配置する例です。

steps:
- task: KubernetesManifest@0
  displayName: Deploy
  inputs:
    kubernetesServiceConnection: someK8sSC1
    namespace: default
    manifests: |
      manifests/deployment.yml
      manifests/service.yml
    containers: |
      foo/demo:$(tagVariable1)
      bar/demo:$(tagVariable2)
    imagePullSecrets: |
      some-secret
      some-other-secret

上の例では、タスクは、画像 foo/demobar/demo マニフェストファイルのイメージフィールドに一致するものを見つけようとします。 見つかった一致ごとに、またはのいずれかの値 tagVariable1 tagVariable2 がタグとしてイメージ名に付加されます。 また、アーティファクトの置換のコンテナー入力でダイジェストを指定することもできます。

注意

デプロイ戦略に関連する YAML 入力でデプロイ、昇格、および拒否アクションを作成できますが、手動介入タスクのサポートは現在、ビルドパイプラインでは使用できません。

リリースパイプラインでは、次の順序で、配置戦略に関連するアクションと入力を使用することをお勧めします。

  1. およびで指定された配置アクション strategy: canary percentage: $(someValue)
  2. 手動介入タスク。パイプラインを一時停止し、ベースラインバリアントとカナリアバリアントを比較することができます。
  3. 手動介入タスクが再開された場合に実行される昇格アクションと、手動介入タスクが拒否された場合に実行される拒否アクション。

アクションの昇格と拒否

パラメーター 説明
action
アクション
(必須)

昇格 または 拒否
kubernetesServiceConnection
Kubernetes サービス接続
(必須)

Kubernetes サービス接続の名前。
namespace
名前空間
(必須)

クラスター内の配置先の名前空間。
manifests
マニフェスト
(必須)

配置に使用するマニフェストファイルのパス。 各行は1つのパスを表します。 ファイル一致パターンは、各行に許容される値です。
containers
コンテナー
(オプション)。

マニフェストファイルの置換に使用されるイメージの完全修飾リソース URL。 URL contosodemo.azurecr.io/helloworld:test は一例です。
imagePullSecrets
イメージのプルシークレット
(オプション)。

行ごとに入力します。各行には、クラスター内に既に設定されている Docker レジストリシークレットの名前が含まれています。 各シークレット名は、入力マニフェストファイルに含まれているワークロードの imagePullSecrets フィールドの下に追加されます。
選択肢
戦略
(オプション)。

昇格アクションまたは拒否アクションの前に配置アクションで使用される配置方法。 現在、使用可能な展開方法は、 カナリア だけです。

シークレットの作成アクション

パラメーター 説明
action
アクション
(必須)

"/"
secretType
シークレットの種類
(必須)

使用可能な値は、 Dockerregistrygenericです。 既定値は Dockerregistryです。

SecretTypedockerregistryに設定すると、クラスター内でimagePullSecretsフィールドが作成または更新され、プライベートコンテナーレジストリからのイメージのプルに役立ちます。
secretName
シークレット名
(必須)

作成または更新するシークレットの名前。
dockerRegistryEndpoint
Docker registry サービス接続
( SecretTypedockerregistryに設定されている場合にのみ必要)

指定されたサービス接続の資格情報は、クラスター内で Docker レジストリシークレットを作成するために使用されます。 ImagePullSecretsフィールドのマニフェストファイルは、このシークレットの名前を参照できます。
secretArguments
シークレットの引数
( SecretTypegenericに設定されている場合にのみ必要)

シークレットの作成と更新に使用されるキーとリテラル値を受け入れます。 次に例を示します。
--リテラル = key1 = value1 --literal = key2 = " 上位シークレット "
kubernetesServiceConnection
Kubernetes サービス接続
(必須)

Kubernetes サービス接続の名前。
namespace
名前空間
(必須)

シークレットを作成するクラスターの名前空間。

次の YAML コードは、 docker registry サービス接続を使用して docker レジストリシークレットを作成する例を示しています。

steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: dockerRegistry
    secretName: foobar
    dockerRegistryEndpoint: demoACR
    kubernetesServiceConnection: someK8sSC
    namespace: default

次の YAML コードは、一般的なシークレットの作成例を示しています。

steps:
- task: KubernetesManifest@0
  displayName: Create secret
  inputs: 
    action: createSecret
    secretType: generic
    secretName: some-secret
    secretArguments: --from-literal=key1=value1
    kubernetesServiceConnection: someK8sSC
    namespace: default

焼き付けるアクション

パラメーター 説明
action
アクション
(必須)

焼き付ける
renderType
レンダーエンジン
(必須)

マニフェストファイルを生成するために使用されるレンダー型。

使用できる値は、 helm2kompose、および kustomizeです。 既定値は helm2です。
両 Mchart
ヘルムグラフ
( Rendertypehelm2に設定されている場合にのみ必要)

パンに使用されるヘルムグラフへのパス。
overrideFiles
上書きファイル
(省略可能、 Rendertypehelm2に設定されている場合にのみ関連します)

オーバーライドファイルへのパスを受け取る複数行の入力。 これらのファイルは、ヘルムグラフのマニフェストファイルが組み込まれている場合に使用されます。
上書き
オーバーライド値
(省略可能、 Rendertypehelm2に設定されている場合にのみ関連します)

コマンドラインスイッチで使用される追加のオーバーライド値。ヘルムを使用するマニフェストファイルが組み込まれている場合に 設定 されます。

上書き値をキーと値のペアとして指定するには、 key:valueの形式を指定します。 複数のキーと値のペアを使用する場合は、各キーと値のペアを別の行で指定します。 異なるキーと値のペアの間の区切り記号として改行文字を使用します。
releaseName
リリース名
(省略可能、 Rendertypehelm2に設定されている場合にのみ関連します)

パンヘルムグラフに使用されるリリースの名前。
kustomizationPath
Kustomization パス
(省略可能、 Rendertypekustomizeに設定されている場合にのみ関連します)

Kustomization ファイルが格納されているディレクトリへのパス。
Dockerの Sefile
Docker 構成ファイルへのパス
(省略可能、 Rendertypekomposeに設定されている場合にのみ関連します)

Docker 構成ファイルへのパス。

次の YAML コードは、ヘルムグラフからの、マニフェストファイルの焼き方を示しています。 最初のタスクでの名前の入力が使用されていることに注意してください。 この名前は、後で配置ステップから参照され、焼き付けるステップによって生成されたマニフェストへのパスを指定します。

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx: 1.7.9

スケール アクション

パラメーター 説明
action
アクション
(必須)

scale
同様
種類
(必須)

スケールアップまたはスケールダウンする Kubernetes オブジェクトの種類。 例として、ReplicaSet と StatefulSet があります。
name
名前
(必須)

スケールアップまたはスケールダウンする Kubernetes オブジェクトの名前。
レプリカ
レプリカ数
(必須)

スケールするレプリカの数。
kubernetesServiceConnection
Kubernetes サービス接続
(必須)

Kubernetes サービス接続の名前。
namespace
名前空間
(必須)

クラスター内の配置先の名前空間。
rolloutStatusTimeout
ロールアウトステータスのタイムアウト
(オプション)。

ロールアウト状態の監視を終了するまでの待機時間 (秒)。 既定値は 0 (待機しない) です。

次の YAML コードは、オブジェクトをスケーリングする例を示しています。

steps:
- task: KubernetesManifest@0
  displayName: Scale
  inputs: 
    action: scale
    kind: deployment
    name: bootcamp-demo
    replicas: 5
    kubernetesServiceConnection: someK8sSC
    namespace: default

Patch アクション

パラメーター 説明
action
アクション
(必須)

kb830347
resourceToPatch
リソースを修正する
(必須)

次のいずれかの修正方法を示します。
  • マニフェストファイルは、修正プログラムを適用するオブジェクトを識別します。
  • 個々のオブジェクトは、修正プログラムのターゲットとして、種類と名前で識別されます。
指定できる値は、 filenameです。 既定値は file です。
resourceFiletoPatch
ファイル パス
( Action patch に設定され、 resourcetopatchfileに設定されている場合にのみ必要)

修正プログラムに使用されるファイルへのパス。
同様
種類
( Resourcetopatchnameに設定されている場合にのみ必要)

Kubernetes オブジェクトの種類。 たとえば、ReplicaSet や StatefulSet などです。
name
名前
(resourceToPatch が name に設定されている場合にのみ必須)

修正プログラムを適用する Kubernetes オブジェクトの名前。
mergeStrategy
マージ戦略
(必須)

修正プログラムの適用に使用する戦略。

使用できる値は、json、merge、および strategic です。 既定値は戦略的 です
パッチ
修正プログラム
(必須)

パッチの内容。
kubernetesServiceConnection
Kubernetes サービス接続
(必須)

Kubernetes サービス接続 の名前
namespace
名前空間
(必須)

デプロイするクラスター内の名前空間。
rolloutStatusTimeout
ロールアウトの状態のタイムアウト
(オプション)。

ロールアウトの状態でウォッチを終了するまで待機する時間 (秒)。 既定値は 0 (待機しない) です。

次の YAML コードは、オブジェクトの修正プログラム適用の例を示しています。

steps:
- task: KubernetesManifest@0
  displayName: Patch
  inputs: 
    action: patch
    kind: pod
    name: demo-5fbc4d6cd9-pgxn4
    mergeStrategy: strategic
    patch: '{"spec":{"containers":[{"name":"demo","image":"foobar/demo:2239"}]}}'
    kubernetesServiceConnection: someK8sSC
    namespace: default

[アクションの削除]

パラメーター 説明
action
アクション
(必須)

delete
引数
引数
(必須)

必要なオブジェクトを削除するために kubectl に渡される引数。 例を示します。
arguments: deployment hello-world foo-bar
kubernetesServiceConnection
Kubernetes サービス接続
(必須)

Kubernetes サービス接続 の名前
namespace
名前空間
(必須)

デプロイするクラスター内の名前空間。

この YAML コードは、オブジェクトの削除のサンプルを示しています。

steps:
- task: KubernetesManifest@0
  displayName: Delete
  inputs:
    action: delete
    arguments: deployment expressapp
    kubernetesServiceConnection: someK8sSC
    namespace: default

トラブルシューティング

Kubernetes クラスターはファイアウォールの内側にあり、ホステッド エージェントを使用しています。 このクラスターにデプロイするにはどうすればよいですか?

ホステッド エージェントに対する IP アドレスを許可することにより、ファイアウォール経由のホステッド エージェントへのアクセスを許可できます。 詳細については、エージェントの IP 範囲に関する記事を参照してください

オープン ソース

このタスクは、 のオープン ソースGitHub。 フィードバックと投稿をお待ちしております。