MS_AKSSecureDemoCopy - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

AKSをセキュアに利用する構築デモ(コピペ用)

概要

補足(本ページの性質): 本ページは 「AKSをセキュアに利用する構築デモ」で実際に流した シェルをそのまま貼り付けられる形にまとめたものである。 解説は元のページ側にあり、こちらは作業用の写しにあたる。

実行にあたっては次の点に注意する。

  • XXXXXXXXX[X]置換前提のプレースホルダである。
  • パスワードがスクリプト中に平文で入る箇所があるため、 履歴やファイルに残さないread -s で受け取る、 Key Vault から取得する等)。
  • 2020 年前後の az コマンド/AKS プレビュー機能を前提としており、 現在はそのままでは動かないものがある構築デモの冒頭の補足を参照)。

AKSをセキュアに利用する構築デモ」で使ったシェルのコピペ用ページ

カスタマイズ

以下の点をカスタマイズした。

  • アカウントが固定な所を修正
  • Windowsを既存のディスクで作成する。
  • 選択的な所を推奨設定に絞った。
  • あと、トラブルシュートの切り分け
    で使用したシェルやDeployment.yamlなど。

タイムアウトや、エクステンションの既定値?
の関係で、やっぱ、ローカルで利用したいなぁと。

詳細

変数

アカウント(追加)

XXXXXXXXXは置換して利用。

OS_USER_ID=XXXXXXXXX
OS_PASSWORD=XXXXXXXXX

VM作成部

前段

  • オンプレVM
    **[X]**は置換して利用 (1-n)。

    az network public-ip create --name uservmX-ip --resource-group $RG_ONP --sku Standard
    ONP_VNET_SUBNET_DEF_ID=$(az network vnet subnet show --resource-group $RG_ONP --vnet-name $ONP_VNET_NAME --name $ONP_VNET_SUBNET_DEF_NAME --query id -o tsv)
    az network nic create --name uservmXnic --subnet $ONP_VNET_SUBNET_DEF_ID --resource-group $RG_ONP --location $LOCATION --public-ip-address uservmX-ip
  • Windows保守端末VM

    • Azure Private Link設定するので何台も作れない。
    • ターミナル化して使うのが良いのかも(Linuxターミナルという手もある)。
  • Linux保守端末VM
    **[X]**は置換して利用 (1-n)。

    MGMT_LINUX_VM_NAME=mgmt-linux-vmX
    MGMT_LINUX_VM_NIC_NAME="${MGMT_LINUX_VM_NAME}-nic"

パスワード変更

  • オンプレVM
    **[X]**は置換して利用 (1-n)。

    az vm create --name uservmX --image "MicrosoftWindowsDesktop:Windows-10:19h2-ent:18363.720.2003120536" --admin-username $OS_USER_ID --admin-password $OS_PASSWORD --nics uservmXnic --resource-group $RG_ONP --location $LOCATION --size Standard_D2_v3
  • Windows保守端末VM

    az vm create --name $MGMT_WIN_VM_NAME --image Win2019Datacenter --admin-username $OS_USER_ID --admin-password $OS_PASSWORD --nics $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --location $LOCATION --size Standard_D2_v3
  • Linux保守端末VM

    az vm create --name $MGMT_LINUX_VM_NAME --image UbuntuLTS --admin-username $OS_USER_ID --admin-password $OS_PASSWORD --nics $MGMT_LINUX_VM_NIC_NAME --resource-group $RG_AKS --location $LOCATION --generate-ssh-keys --size Standard_D2_v3

既存ディスク使用

**<管理ディスク名>**は置換して利用。

  • オンプレVM
    **[X]**は置換して利用 (1-n)。

    az vm create --name uservmX --attach-os-disk <管理ディスク名> --nics uservmXnic --resource-group $RG_ONP --location $LOCATION --size Standard_D4s_v3 --os-type Windows
  • Windows保守端末VM

    az vm create --name $MGMT_WIN_VM_NAME --attach-os-disk <管理ディスク名> --nics $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --location $LOCATION --size Standard_D4s_v3 --os-type Windows

※ **<管理ディスク名>**の準備方法は、この辺を参照。

後段

  • オンプレVM
    **[X]**は置換して利用。

    az vm open-port --resource-group $RG_ONP --name uservmX --port 3389
  • Windows保守端末VM

    • Azure Private Link設定するので何台も作れない。
    • ターミナル化して使うのが良いのかも(Linuxターミナルという手もある)。
  • Linux保守端末VM
    なし(open-portしないのでなにもない)

F/W ルール

AKSクラスタ

  • Required_for_AKS_clusters > MCR\

    az network firewall application-rule create  --firewall-name $FW_NAME --resource-group $RG_AKS \
    --collection-name "Required_for_AKS_clusters" --priority 200 --action "Allow" \
    --name "MCR" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 \
    --target-fqdns "*.cdn.mscr.io" "mcr.microsoft.com" "*.data.mcr.microsoft.com" "registry-1.docker.io"

Windows保守端末

  • Required_for_management_Windows_VMs > Azure AD Authentication

    az network firewall application-rule create  --firewall-name $FW_NAME --resource-group $RG_AKS \
    --collection-name "Required_for_management_Windows_VMs" \
    --name "Azure AD Authentication" --source-addresses "${MGMT_WIN_NIC_IP_ADDRESS}/32" --protocols https=443 \
    --target-fqdns "login.microsoftonline.com" "aadcdn.msftauth.net" "msft.sts.microsoft.com" "login.live.com"
    • "login.live.com" が空いてないので追加。

    • 組織アカウントでないからかもしれない。
      組織アカウントに絞るなら開けないほうが良いかも。

...。

他にもあったら足して行く。

なお、以下が参考になる。

ガバガバ版

動かない時に、Firewallの問題との切り分けが大変なので、
application-ruleを無くし、network-rule で dst を any の * にしたガバガバ設定。

  • AKS環境

    • オリジナル版

      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters"             --action "Allow" --priority 200 --name "MCR"                                               --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "*.cdn.mscr.io" "mcr.microsoft.com" "*.data.mcr.microsoft.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters"                                             --name "k8s GET PUT operations"                            --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "management.azure.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters"                                             --name "Azure AD authentication"                           --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "login.microsoftonline.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters"                                             --name "apt-get operation for Moby, PowerShell, Azure CLI" --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "packages.microsoft.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters"                                             --name "repository for kubenet, Azure CNI"                 --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "acs-mirror.azureedge.net"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Optional_for_AKS_clusters"             --action "Allow" --priority 300 --name "download security patches for linux nodes"         --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols http=80   --target-fqdns "security.ubuntu.com" "azure.archive.ubuntu.com" "changelogs.ubuntu.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Azure_Policy_for_AKS_clusters_preview" --action "Allow" --priority 500 --name "correct metrics and monitoring telemetry"          --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "gov-prod-policy-data.trafficmanager.net" "raw.githubusercontent.com" "*.gk.${LOCATION}.azmk8s.io" "dc.services.visualstudio.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Azure_Monitor_for_containers"          --action "Allow" --priority 400 --name "Correct data, authentication, for agent"           --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "dc.services.visualstudio.com" "*.ods.opinsights.azure.com" "*.oms.opinsights.azure.com" "*.microsoftonline.com" "*.monitoring.azure.com"
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Azure_Monitor_for_containers"                                          --name "kubeapi-proxy"                                     --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols https=443 --target-fqdns "aks-kubeapi-proxy-prod.trafficmanager.net"
      az network firewall network-rule     create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_AKS_clusters"             --action "Allow" --priority 200 --name "NTP time synchronization on Linux nodes"           --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols "UDP"     --destination-addresses "*" --destination-ports 123
    • ガバガバ版
      network-ruleのみ。

       az network firewall network-rule     create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "hoge"                                  --action "Allow" --priority 200 --name "hoge"                                              --source-addresses "${AKS_VNET_SUBNET_NPS_ADDRESS_PREFIX}" --protocols "Any"     --destination-addresses "*" --destination-ports "*"
  • 保守環境(Win)

    • オリジナル版

      MGMT_WIN_NIC_IP_ADDRESS=$(az network nic show --name $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --query ipConfigurations[0].privateIpAddress -o tsv)
      az network firewall application-rule create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "Required_for_management_Windows_VMs"   --action "Allow" --priority 1000 --name "WindowsUpdate"                                    --source-addresses "${MGMT_WIN_NIC_IP_ADDRESS}/32"         --protocols http=80 https=443 --fqdn-tags "WindowsUpdate" "WindowsDiagnostics" "MicrosoftActiveProtectionService"
    • ガバガバ版
      network-ruleのみ。

      MGMT_WIN_NIC_IP_ADDRESS=$(az network nic show --name $MGMT_WIN_VM_NIC_NAME --resource-group $RG_AKS --query ipConfigurations[0].privateIpAddress -o tsv)
      az network firewall network-rule     create --firewall-name $FW_NAME --resource-group $RG_AKS --collection-name "hogehoge"                              --action "Allow" --priority 1000 --name "hogehoge"                                         --source-addresses "${MGMT_WIN_NIC_IP_ADDRESS}/32"         --protocols "Any"     --destination-addresses "*" --destination-ports "*"

プライベートAKSクラスタ

ゴチャゴチャしているので、コチラの構成に合わせて簡素化した決め打ちのコピペ。

Managed ID方式で作成

# Create AKS Cluster ==============================================
# Prepare for creating cluster
AKS_VERSION=$(az aks get-versions --location $LOCATION --query 'orchestrators[?!isPreview] | [-1].orchestratorVersion' --output tsv)
AKS_VNET_SUBNET_NPS_ID=$(az network vnet subnet show --resource-group $RG_AKS --vnet-name $AKS_VNET_NAME --name $AKS_VNET_SUBNET_NPS_NAME --query id -o tsv)
# Create AKS Cluster ※ 時間がかかる
az aks create --resource-group $RG_AKS --name $AKS_CLUSTER_NAME --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --location $LOCATION --kubernetes-version $AKS_VERSION --network-plugin azure --vnet-subnet-id $AKS_VNET_SUBNET_NPS_ID --service-cidr $AKS_SERVICE_CIDR --dns-service-ip $AKS_DNS_SERVICE_IP --docker-bridge-address 172.17.0.1/16 --generate-ssh-keys --outbound-type userDefinedRouting --enable-private-cluster  --enable-managed-identity
# VNET に対する Contributor 権限を与える(VNET が管理リソースグループの外にあるため)
AKS_VNET_ID=$(az network vnet show --name $AKS_VNET_NAME --resource-group $RG_AKS --query id -o tsv)
AKS_MANAGED_ID=$(az aks show --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --query identity.principalId -o tsv)
az role assignment create --assignee $AKS_MANAGED_ID --role "Contributor" --scope $AKS_VNET_ID
# End of Create AKS Cluster ==============================================

この場合のAcrPull ロール付与方式

# Configure ACR for connecting from AKS
# この作業により、Service Principal に対して ACR の AcrPull ロールが付与される
az aks update --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --attach-acr $ACR_NAME

その後のログ関連の設定

# Azure Monitor for AKS 有効化
DIAG_LA_WS_RESOURCE_ID=$(az monitor log-analytics workspace show --resource-group $RG_OPS --workspace-name $DIAG_LA_WS_NAME --query id -o tsv)
# 以下のエラーが出た場合は、Azure CLI のバージョンを変更してトライしてみる。
# The request content was invalid and could not be deserialized: 'Could not find member 'template' on object of type 'DeploymentDefinition'. Path 'template', line 1, position 12.'.
az aks enable-addons --addons monitoring --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --workspace-resource-id $DIAG_LA_WS_RESOURCE_ID
# AKS 診断設定の有効化
DIAG_STORAGE_ID=$(az storage account show --name $DIAG_STORAGE_NAME --query id -o tsv)
DIAG_LA_WS_ID=$(az monitor log-analytics workspace show --workspace-name $DIAG_LA_WS_NAME --resource-group $RG_OPS --query id -o tsv)
AKS_CLUSTER_ID=$(az aks show --name $AKS_CLUSTER_NAME --resource-group $RG_AKS --query id -o tsv)
az monitor diagnostic-settings create --name $AKS_CLUSTER_NAME --resource $AKS_CLUSTER_ID \
--logs    '[{"category": "kube-apiserver","enabled": true},{"category": "kube-audit","enabled": true},{"category": "kube-controller-manager","enabled": true},{"category": "kube-scheduler","enabled": true},{"category": "cluster-autoscaler","enabled": true}]' \
--metrics '[{"category": "AllMetrics","enabled": true}]' \
--storage-account $DIAG_STORAGE_ID --workspace $DIAG_LA_WS_ID

ポイントの説明

  • なぜ、ココのスクリプトがゴチャゴチャしているか?と言うと、

「AKS クラスタをAzure Firewall配下のVNETに配置しようとした場合で、
コレを非プライベート・クラスタとして作成しようとすると、以下な手順が必要になるため。」

です。

  • ゴチャゴチャしている所で、以下の様な事をしています。

    • 非プライベート AKS クラスタの場合、Master APIに外回りでアクセスする。

      • 従って、Azure Firewall のルールに追加が必要になるが、
      • Master API へのアクセス経路が必要Master API のアドレスが未確定のため、
      • いったん "*" 宛として TCP 22, 443, 9000, UDP 1194 を空ける。
    • 最後に、Master API アドレスが確定したら、

      • 上記で開放した経路を絞る。
      • また、保守端末からもMaster API へアクセスできるようにする。
      • 追加で、Master API 側の IP アドレス制限機能を有効化する。

保守端末上の作業

置換するところが多いので。

6-a. mgmt-win-vm1 上で作業

XXXXXXXXXは置換して利用。

rem cmd を開いてホームに移動
az login
rem ブラウザが開くのでログイン
rem Select Subscription
SET SUBSCRIPTION_NAME=XXXXXXXXX
az account set -s %SUBSCRIPTION_NAME%
rem kubeconfig ファイルを取得
SET NAME_PREFIX=daisukenishino
SET RG_AKS=%NAME_PREFIX%-aks-rg
SET AKS_CLUSTER_NAME=%NAME_PREFIX%-aks
del .kube\config
rem clusterAdmin 用のトークン取得
az aks get-credentials --resource-group %RG_AKS% --name %AKS_CLUSTER_NAME% --admin
ren .kube\config admin-config
rem clusterUser 用のトークン取得
az aks get-credentials --resource-group %RG_AKS% --name %AKS_CLUSTER_NAME%

6-b. mgmt-linux-vm1 上で作業

XXXXXXXXXは置換して利用。

sudo az login
# Select Subscription
SUBSCRIPTION_NAME=XXXXXXXXX
sudo az account set -s "$SUBSCRIPTION_NAME"
SUBSCRIPTION_ID=$(az account show -s "$SUBSCRIPTION_NAME" --query id -o tsv)
NAME_PREFIX=daisukenishino
LOCATION=japaneast
RG_AKS="${NAME_PREFIX}-aks-rg"
AKS_CLUSTER_NAME="${NAME_PREFIX}-aks"
sudo rm .kube/config
sudo az aks get-credentials --resource-group $RG_AKS --name $AKS_CLUSTER_NAME --admin
sudo mv .kube/config .kube/admin-config
sudo az aks get-credentials --resource-group $RG_AKS --name $AKS_CLUSTER_NAME

6-e. mgmt-windows-vm1 上で実施

OS_USER_IDは置換して利用。

  • 以下は、CMDで

    rem C:\Users\OS_USER_ID\AzRefArc.SpringBoot 下にファイルを展開
    rem .mvn, src. Dockerfile, mvnw などがこのフォルダの直下に来るように
    rem mgmt-windows-vm1 のコマンドラインから以下を実行
    scp -r C:\Users\OS_USER_ID\AzRefArc.SpringBoot OS_USER_ID@mgmt-linux-vm1:/home/OS_USER_ID/
  • 以下は、SSHで

    • Dockerビルド

      # mgmt-linux-vm1 にログインし、Docker コンテナを 2 つビルドする
      # ライブラリをオンデマンドダウンロードするためビルドにはそれなりに時間がかかる (5分ぐらい)
      # Docker build は最後のピリオドを忘れないように
      cd ~/AzRefArc.SpringBoot
      sudo docker build -t azrefarc.springboot:1 .
      # トップページの文字を入れ替えた v2 アプリを作っておく
      cp -b index_v2.html src/main/resources/templates/index.html
      sudo docker build -t azrefarc.springboot:2 .
      cd \
      # レポジトリにプッシュ
      NAME_PREFIX=daisukenishino
      ACR_NAME="${NAME_PREFIX}aksacr"
      sudo docker tag azrefarc.springboot:1 ${ACR_NAME}.azurecr.io/azrefarc.springboot:1
      sudo docker tag azrefarc.springboot:2 ${ACR_NAME}.azurecr.io/azrefarc.springboot:2
    • ワンクッション

      # sudo docker login ${ACR_NAME}.azurecr.io だと username/password ログイン
      # Azure AD 認証でログインするために、sudo az login したのちに az acr login コマンドを利用
      # トークン書き込みのために sudo で実行
      sudo az login
      sudo az acr login --name ${ACR_NAME}.azurecr.io
    • コンテナ・イメージをプッシュ

      sudo docker push ${ACR_NAME}.azurecr.io/azrefarc.springboot:1
      sudo docker push ${ACR_NAME}.azurecr.io/azrefarc.springboot:2

6-f. アプリケーションの配置

  • *.yamlフィアイルの中
    **[X](タグ)**は必要に応じて修正。

    image: daisukenishinoaksacr.azurecr.io/azrefarc.springboot:X
  • k8s ダッシュボード起動

    SET NAME_PREFIX=daisukenishino
    SET RG_AKS=%NAME_PREFIX%-aks-rg
    SET AKS_CLUSTER_NAME=%NAME_PREFIX%-aks
    az aks browse -n %AKS_CLUSTER_NAME% -g %RG_AKS%
  • デプロイの

    • apply

      kubectl apply -f web_v1.yaml
    • delete

      kubectl delete services web --namespace azrefarc-springboot

※ web_v1.yamlは、ココに定義されているオリジナルの*.yaml。

切り分け関係の作業

切り分け用のオリジナル手順

ココの作業は、コチラで言及したWindows開発環境で実施。

  • 起動

    git clone https://github.com/ryo-ohnishi/node_express.git
    cd node_express
    docker-compose up -d
  • 実行確認

http://localhost:3000/

  • 停止

    >docker-compose down

※ 動かなかったら何回か起動・停止を繰り返してみる。

  • イメージを確認し

    >docker images
    REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
    n-app                                              latest              8aecd52a6fd3        45 minutes ago      674MB
  • タグを設定し

    >docker tag n-app daisukenishinoaksacr.azurecr.io/n-app:v1

※ ACR_NAMEは、以下で確認する。

$ echo $ACR_NAME
  • プッシュする

    • azでログイン

      az login
    • azでacrにログイン

      az acr login --name daisukenishinoaksacr.azurecr.io
    • dockerでプッシュ
      (az → dockerに、Tokenが渡っているらしい)

      docker push daisukenishinoaksacr.azurecr.io/n-app:v1
  • *.yamlを書き換えて再チャレンジしたが...

*.yamlがダメっぽいので、カスタムした。

  • 色々調査を進めていると、オリジナルの*.yamlがダメっぽい。

    • 具体的に言うと、Podがエラーになる(以下のようなエラー)。

      CrashLoopBackOff, SyncLoadBalancerFailed
    • ...で、別のモノ(voting-app)を試すと

      • Podは上がるが、Serviceが上がらない。
      • ただ、コレは、VNETに接続しているからアドレス体系の問題のような気もする。
  • という事で、
    コンテナイ・メージを、下記のハイブリッドな*.yamlに組込むことに。
    (コレは、簡易アプリのDeploymentに、本デモ用のServiceを加えたもの)

    • *******の部分を書き換える。
    • XXXの部分は以下から選択。
      • azure-vote-front(containerPortは80)
      • n-app(containerPortは3000)
  ```sh
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: webapp
  spec:
    replicas: 3
    selector:
      matchLabels:
        app: webapp
    strategy:
      rollingUpdate:
        maxSurge: 1
        maxUnavailable: 1
    minReadySeconds: 5
    template:
      metadata:
        labels:
          app: webapp
      spec:
        containers:
        - name: webapp
          image: ***daisukenishinoaksacr.azurecr.io/XXXX:v1***
          ports:
          - containerPort: ***3000***
          resources:
            requests:
              cpu: 250m
            limits:
              cpu: 500m
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: webapp
    annotations:
      service.beta.kubernetes.io/azure-load-balancer-internal: "true"
      service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "InternalEndpointSubnet"
  spec:
    selector:
      app: webapp
    ports:
    - protocol: TCP
      port: 80
      targetPort: ***3000***
    type: LoadBalancer
    loadBalancerIP: 10.11.0.10
  ```
  • ...結局、以下で(voting-appで)動作した
    • AKSチュートリアルで実績のある、voting-appでのみ上手く起動した。
    • n-appは、Javaアプリ同様、Docker Composeでは動作したが、AKSで動作せず。
    • なお、voting-appは、azure-vote-backも動かさないとazure-vote-front側が落ちる。
```sh
apiVersion: apps/v1
kind: Deployment
metadata:
  name: azure-vote-back
spec:
  replicas: 3
  selector:
    matchLabels:
      app: azure-vote-back
  template:
    metadata:
      labels:
        app: azure-vote-back
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: azure-vote-back
        image: redis
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-back
spec:
  ports:
  - port: 6379
  selector:
    app: azure-vote-back
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: daisukenishinoaksacr.azurecr.io/azure-vote-front:v1
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 250m
          limits:
            cpu: 500m
        env:
        - name: REDIS
          value: "azure-vote-back"
---
apiVersion: v1
kind: Service
metadata:
  name: webapp
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "InternalEndpointSubnet"
spec:
  selector:
    app: webapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
  loadBalancerIP: 10.11.0.10
```

参考

移行メモ(未記述): 「参考」節は元ページでも見出しのみで、 内容が書かれていない。


Tags: クラウド, コンテナ, Azure, AKS, IaC, セキュリティ, 通信技術, 認証基盤

⚠️ **GitHub.com Fallback** ⚠️