Azure devopsとAzureクラウドシェルを使用してAKにアプリケーションを配備する


必要条件


Azureアカウントへのアクセス
Azure devopsとパットトークンへのアクセス
GitHubアカウントへのアクセス
  • Azureデビルズ組織を作成します.ヘッドhere&クリックして“新しい組織を作成する”ボタンをクリックします.
  • すべての以下のコマンドはazure雲シェルで実行されるべきです.任意のブラウザからシェルhereにアクセスし、アジュールアカウントにログインします.
  • PowerShell画面を使用できますが、このチュートリアルではbashを使用します.bashコマンドに切り替えるには、“bash”を入力します.

    全体アーキテクチャ



    私は、上記の図を作成するためにCloudSkewを使いました.非常にそれをチェックアウト(無料)をお勧めします.
  • Azure Devops & GithubはSaaS製品を使用して簡単です- GithubとAzureパイプラインは、あなたのソースコントロールとCI/CDのニーズを達成するのに役立ちます.ソースコードはGITHUB(アプリケーション、インフラストラクチャ、パイプラインコード)のGITリポジトリにあり、CI/CDパイプラインはAzure YAMLパイプラインです.
  • Azure Container Registry(ACR)は、Docker HubのようなAzureネイティブコンテナレジストリですが、それはAzureのコンテナレジストリソリューションです.このデモのAzureパイプラインは、ACRにDockerイメージを構築して、プッシュしています(イメージの新しいバージョンはパイプライン実行のすべての成功した実行でつくられます).
  • Azure Kubernetes Service(AK)は、Serverlessで管理されたコンテナ・オーケストレーションサービスです.AakはPAAサービスとしてAzureの上で直接動いて、あなたのコンテナ化されたDockerアプリケーションを配備して、管理するためにKubernetes環境をあなたに提供します.この管理されたKubernetes環境は、このデモであなたのKubernetes資源を動かすものです.
  • Apaure Active DirectoryはビルトインAzureアイデンティティ管理解決です.このデモでは、サービスのプリンシパル(Azure広告アプリケーションの登録に基づいてアイデンティティ)が必要なので、それはあなたのために重要です.このサービスプリンシパルは、安全な、アイデンティティベースの認証された接続(Azureリソースマネージャーへのサービス接続)を作成するために使用されます.したがって、リソースを適切なAzureサブスクリプションに展開できます.

    初期設定

  • Azure devops拡張モジュールをクラウドシェルセッションに追加します.
  • az extension add --name azure-devops
    
  • あなたのシェルにコンテキストを追加して、devOps機構を参照します.
  • az devops configure --defaults organization=https://dev.azure.com/insertorgnamehere/
    
  • プロセスレベルで環境変数を設定します.では、明示的に署名しなくても任意のコマンドを実行します.
  • export AZURE_DEVOPS_EXT_PAT=insertyourpattokenhere
    
  • 新しいAzure Devopsプロジェクトを作成します.
  • az devops project create --name k8s-project
    
  • デフォルトのプロジェクトを設定します.
  • az devops configure --defaults project=k8s-project
    

    インフラストラクチャの配備

  • 作成するAzureリソースを論理的に整理するリソースグループを作成します.
  • az group create --location westeurope --resource-group my-aks-rg
    
  • サービスプリンシパルを作成します.AKクラスタは、このサービスプリンシパルを使用して、Azureコンテナレジストリにアクセスし、コンテナイメージをプルします.
  • 重要:次のコマンドの出力をコピーするには、後で必要です.
    az ad sp create-for-rbac --skip-assignment
    
  • あなたのアプリケーションを展開するためのAKクラスタを作成します(これは、あなたが前のコマンドから出力を使用するところです)
  • 重要:時にはあなたは“400クライアントエラー:URLの悪い要求”のようなエラーを取得します-それは既知の問題と再実行するコマンドを通常動作します.

    AZロール割り当てはクラウドシェルで失敗します。http://localhost:50342/oauth2/token 宗角9345



    simongdavies

    バグを説明する


    CloudShellで動作し、コマンドが失敗し、クライアント上で正しく動作します.
    コマンド名az role assignment createエラー
    The command failed with an unexpected error. Here is the traceback:
    
    
    400 Client Error: Bad Request for url: http://localhost:50342/oauth2/token
    Traceback (most recent call last):
      File "/opt/az/lib/python3.6/site-packages/knack/cli.py", line 206, in invoke
        cmd_result = self.invocation.execute(args)
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 560, in execute
        raise ex
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 618, in _run_jobs_serially
        results.append(self._run_job(expanded_arg, cmd_copy))
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 611, in _run_job
        six.reraise(*sys.exc_info())
      File "/opt/az/lib/python3.6/site-packages/six.py", line 693, in reraise
        raise value
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 588, in _run_job
        result = cmd_copy(params)
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/commands/__init__.py", line 297, in __call__
        return self.handler(*args, **kwargs)
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/__init__.py", line 453, in default_command_handler
        return op(**command_args)
      File "/opt/az/lib/python3.6/site-packages/azure/cli/command_modules/role/custom.py", line 134, in create_role_assignment
        resolve_assignee=(not assignee_object_id))
      File "/opt/az/lib/python3.6/site-packages/azure/cli/command_modules/role/custom.py", line 150, in _create_role_assignment
        object_id = _resolve_object_id(cli_ctx, assignee) if resolve_assignee else assignee
      File "/opt/az/lib/python3.6/site-packages/azure/cli/command_modules/role/custom.py", line 1614, in _resolve_object_id
        filter="servicePrincipalNames/any(c:c eq '{}')".format(assignee)))
      File "/opt/az/lib/python3.6/site-packages/msrest/paging.py", line 143, in __next__
        self.advance_page()
      File "/opt/az/lib/python3.6/site-packages/msrest/paging.py", line 129, in advance_page
        self._response = self._get_next(self.next_link)
      File "/opt/az/lib/python3.6/site-packages/azure/graphrbac/operations/service_principals_operations.py", line 156, in internal_paging
        response = self._client.send(request, stream=False, **operation_config)
      File "/opt/az/lib/python3.6/site-packages/msrest/service_client.py", line 336, in send
        pipeline_response = self.config.pipeline.run(request, **kwargs)
      File "/opt/az/lib/python3.6/site-packages/msrest/pipeline/__init__.py", line 197, in run
        return first_node.send(pipeline_request, **kwargs)  # type: ignore
      File "/opt/az/lib/python3.6/site-packages/msrest/pipeline/__init__.py", line 150, in send
        response = self.next.send(request, **kwargs)
      File "/opt/az/lib/python3.6/site-packages/msrest/pipeline/requests.py", line 65, in send
        self._creds.signed_session(session)
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/adal_authentication.py", line 26, in signed_session
        scheme, token, _ = self._token_retriever()
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/_profile.py", line 532, in _retrieve_token
        return self._get_token_from_cloud_shell(resource)
      File "/opt/az/lib/python3.6/site-packages/azure/cli/core/_profile.py", line 365, in _get_token_from_cloud_shell
        auth = MSIAuthentication(resource=resource)
      File "/opt/az/lib/python3.6/site-packages/msrestazure/azure_active_directory.py", line 576, in __init__
        self.set_token()
      File "/opt/az/lib/python3.6/site-packages/msrestazure/azure_active_directory.py", line 582, in set_token
        self.scheme, _, self.token = get_msi_token(self.resource, self.port, self.msi_conf)
      File "/opt/az/lib/python3.6/site-packages/msrestazure/azure_active_directory.py", line 485, in get_msi_token
        result.raise_for_status()
      File "/opt/az/lib/python3.6/site-packages/requests/models.py", line 940, in raise_for_status
        raise HTTPError(http_error_msg, response=self)
    requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http://localhost:50342/oauth2/token
    

    複製する


    動作を再現する手順.彼らが敏感な情報を含むかもしれないので、引数値は赤くされました.
  • ここに必要な手順を置く.
  • az role assignment create --assignee {} --role {} --scope {}
  • 予想行動


    環境概要

    Linux-4.15.0-1041-azure-x86_64-with-debian-stretch-sid
    Python 3.6.5
    Shell: bash
    
    azure-cli 2.0.64
    
    Extensions:
    resource-graph 0.1.8
    interactive 0.4.1
    
    

    追加コンテキスト


    あなたのフィードバックに感謝!
    コマンドは4.050秒で走った.
    View on GitHub
    az aks create -g my-aks-rg -n myakscluster -c 1 --generate-ssh-keys --service-principal "insertappidhere" --client-secret "insertpasswordhere"
    
  • Azureコンテナレジストリ(ACR)を作成します.これはAKで使用されるコンテナのリポジトリになります.
  • az acr create -g my-aks-rg -n insertuniqueacrnamehere --sku Basic --admin-enabled true
    
    AKがACRからイメージを引くのを許すために、
  • は、サービスプリンシパルのために我々のAzure RBAC許可を設定しなければなりません:
  • ACR_ID=$(az acr show --name ghostauacr --resource-group my-aks-rg --query "id" --output tsv)
    
    CLIENT_ID=$(az aks show -g my-aks-rg -n myakscluster --query "servicePrincipalProfile.clientId" --output tsv)
    
    az role assignment create --assignee $CLIENT_ID --role acrpull --scope $ACR_ID
    

    アプリケーションの配備


  • このGithubレポをforkします(このタブを新しいタブで開き、「fork」をクリックします).

    ゲートウェイ / K 8 Sアプリケーション



  • 現在、クラウドシェル内の端末セッションにクローンします.
  • git clone https://github.com/<your-github-username-goes-here>/k8s-application.git
    
    cd k8s-application
    
  • Azure devopsでパイプラインを作成します.
  • az pipelines create --name "k8s-application-pipeline"
    
  • あなたの端末のプロンプトに従ってパイプラインを設定します.
  • あなたのGitHubユーザー名を入力してください;Enter
  • を押します.
  • あなたのgithubパスワードを入力しますEnter
  • を押します.
  • あなたのgithubパスワードを再度入力して確認しますEnter
  • を押します.
  • (有効にされるならば)あなたの2因子認証コード
  • を入力してください
  • サービス接続名(例えばK 8 sApplicationPipeline)を入力しますEnter
  • を押します.
  • は、Azure Kubernetesサービスに配備する[ 3 ]を選びます;Enter
  • を押します.
  • あなたが作成したK 8 Sクラスタを選択しますEnter
  • を押します.
  • は、「デフォルト」Kubernetes名前空間のために[ 2 ]を選びます;Enter
  • を押します.
  • だけで作成されたACRを選択しますEnter
  • を押します.
  • イメージ名の値を入力します(デフォルトを受け入れるEnterキーを押します).Enter
  • を押します.
  • サービスポートの値を入力します.Enter
  • を押します.
  • プル要求のための有効なチェックアプリケーションフローの値を入力します(値を入力せずにEnterキーを押します)
  • は、生成されたYAMLで続く[ 1 ]を選びます;Enter
  • を押します.
  • は、マスターブランチに直接コミットする[ 1 ]を選択しますEnter
  • を押します.

    おめでとう!


    あなたはAzure devopsプロジェクトを作成しました!コンテナを構築するために数分待って、ACRにプッシュし、AKに展開します.
  • Kubeconfigの資格情報を取得して、AKクラスタにアクセスします.
  • az aks get-credentials --resource-group my-aks-rg --name myakscluster
    
  • プロジェクトが作成したKubernetesリソースを表示する
  • kubectl get all
    
  • サービスIPアドレス(外部IPの下で)をコピーして、「8888」(例えば51.137.4.161 : 8888)で新しいブラウザータブにペーストしてください.
  • これはあなたの最終的な結果である必要があります!



    概要


    比較的短い期間で、あなたはAzure devopsで新しいプロジェクトを作成しました.そのプロジェクトの中で、CI/CDパイプラインを設定しました.そのパイプラインはコンテナの内部にアプリケーションを構築し、コンテナをコンテナリポジトリにプッシュし、コンテナをAKSに展開しました.最後に、Kubernetesサービスを介してWebからAKで実行しているWebアプリケーションを表示することができます.あなたは素晴らしい、よく行われている!
    重要:先頭に戻ってあなたのフォークレポに頭をチェックし、“azure pipeline . yml”ファイルをチェックしてください.あなたは、私たちがマスター支店に変更をするたびに意味する「トリガー:マスター」という行を見るべきです.マジック!
    今、あなたは完全に作業アプリケーションをAKESに展開して、私はあなたが飛び込むとどのようにすべてのフードの下で動作するかを見るのを待つことができない賭け.私は、Kubernetesで働くために役に立つSpippetsとTipsがたくさんあるこのblog postを推薦します.
    任意の質問は、タッチで取得



    アンドリュー[ MVP ]

    ✨チェックリスト✨あなたはAzureのprodに行く準備ができていますか?調べるには、このチェックリストを使用します:azurechecklist.com呼び出してください!このリストをDEVOPSのリストに移動させる❤️
    午前9時24分