🐶

【MS Learn】コンテナー化されたアプリケーションを Azure Kubernetes Service にデプロイするをやってみた

2023/10/04に公開

はじめに

やってみたシリーズです。

今回はAzure での Kubernetes 入門からAKSをデプロイするLearnをやります。
https://learn.microsoft.com/ja-jp/training/modules/aks-deploy-container-app/

手を動かすところだけ記述していきます。
番号とかは飛び飛びになりますので、ご本家様と照らし合わせてみていただけると幸いです。

Azure Cloud Shellのbashで実行しています。

ユニット3: 演習 - Azure Kubernetes Service クラスターを作成する

  1. 演習全体で再利用する構成値の変数を作成します。
Azure Cloud Shell
$ export RESOURCE_GROUP=rg-contoso-video
$ export CLUSTER_NAME=aks-contoso-video
$ export LOCATION=japaneast
  1. リソース グループを作成します。
Azure Cloud Shell
$ az group create --name=$RESOURCE_GROUP --location=$LOCATION
{
  "id": "/subscriptions/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-contoso-video",
  "location": "japaneast",
  "managedBy": null,
  "name": "rg-contoso-video",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}
  1. AKS クラスターを作成します。
Azure Cloud Shell
$ az aks create \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --node-count 2 \
    --enable-addons http_application_routing \
    --generate-ssh-keys \
    --node-vm-size Standard_B2s \
    --network-plugin azure
docker_bridge_cidr is not a known attribute of class <class 'azure.mgmt.containerservice.v2023_07_01.models._models_py3.ContainerServiceNetworkProfile'> and will be ignored
{
  "aadProfile": null,
  "addonProfiles": {
    "httpApplicationRouting": {
      "config": {
        "HTTPApplicationRoutingZoneName": "3bed7d8e4a5f4cbfa2d3.japaneast.aksapp.io"
      },
      "enabled": true,
      "identity": {
        "clientId": "b12e42fc-28d3-4d4f-9cf8-82a7a1e1f036",
        "objectId": "aad8a955-9310-4fdc-94a6-36f48c99d3d1",
        "resourceId": "/subscriptions/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx/resourcegroups/MC_rg-contoso-video_aks-contoso-video_japaneast/providers/Microsoft.ManagedIdentity/userAssignedIdentities/httpapplicationrouting-aks-contoso-video"
      }
    }
  },
  "agentPoolProfiles": [
    {
      "availabilityZones": null,
      "count": 2,
      "creationData": null,
      "currentOrchestratorVersion": "1.26.6",
      "enableAutoScaling": false,
      "enableEncryptionAtHost": false,
      "enableFips": false,
      "enableNodePublicIp": false,
      "enableUltraSsd": false,
      "gpuInstanceProfile": null,
      "hostGroupId": null,
      "kubeletConfig": null,
      "kubeletDiskType": "OS",
      "linuxOsConfig": null,
      "maxCount": null,
      "maxPods": 30,
      "minCount": null,
      "mode": "System",
      "name": "nodepool1",
      "nodeImageVersion": "AKSUbuntu-2204gen2containerd-202309.06.0",
      "nodeLabels": null,
      "nodePublicIpPrefixId": null,
      "nodeTaints": null,
      "orchestratorVersion": "1.26.6",
      "osDiskSizeGb": 128,
      "osDiskType": "Managed",
      "osSku": "Ubuntu",
      "osType": "Linux",
      "podSubnetId": null,
      "powerState": {
        "code": "Running"
      },
      "provisioningState": "Succeeded",
      "proximityPlacementGroupId": null,
      "scaleDownMode": null,
      "scaleSetEvictionPolicy": null,
      "scaleSetPriority": null,
      "spotMaxPrice": null,
      "tags": null,
      "type": "VirtualMachineScaleSets",
      "upgradeSettings": {
        "drainTimeoutInMinutes": null,
        "maxSurge": null
      },
      "vmSize": "Standard_B2s",
      "vnetSubnetId": null,
      "workloadRuntime": null
    }
  ],
  "apiServerAccessProfile": null,
  "autoScalerProfile": null,
  "autoUpgradeProfile": {
    "nodeOsUpgradeChannel": "NodeImage",
    "upgradeChannel": null
  },
  "azureMonitorProfile": null,
  "azurePortalFqdn": "aks-contos-rg-contoso-video-a058ec-4sbhkovp.portal.hcp.japaneast.azmk8s.io",
  "currentKubernetesVersion": "1.26.6",
  "disableLocalAccounts": false,
  "diskEncryptionSetId": null,
  "dnsPrefix": "aks-contos-rg-contoso-video-a058ec",
  "enablePodSecurityPolicy": null,
  "enableRbac": true,
  "extendedLocation": null,
  "fqdn": "aks-contos-rg-contoso-video-a058ec-4sbhkovp.hcp.japaneast.azmk8s.io",
  "fqdnSubdomain": null,
  "httpProxyConfig": null,
  "id": "/subscriptions/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-contoso-video/providers/Microsoft.ContainerService/managedClusters/aks-contoso-video",
  "identity": {
    "delegatedResources": null,
    "principalId": "ef193bf0-e5c0-44e2-a529-bff33e981ed4",
    "tenantId": "cb9bb346-c037-4fb2-a3ff-dd23544753ea",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
  },
  "identityProfile": {
    "kubeletidentity": {
      "clientId": "8fd66683-3b32-46f1-9238-9946e2ac14df",
      "objectId": "3b72a7f4-f55f-436c-8cfc-8ae18ab5d03f",
      "resourceId": "/subscriptions/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx/resourcegroups/MC_rg-contoso-video_aks-contoso-video_japaneast/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aks-contoso-video-agentpool"
    }
  },
  "kubernetesVersion": "1.26.6",
  "linuxProfile": {
    "adminUsername": "azureuser",
    "ssh": {
      "publicKeys": [
        {
          "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtlQI5JNtID9FT9ei748fLS8yiwL94XmBPoXsxv9UGFe3ZilBzAtPUara5AXKVHDiHcPyLuXTq6iLbbC1tvVidf1BsH/lwFFSjz/z7aSAS2I84dAu5E/+AYg6azipYYtWzcCwIPfhaP0FqgtEOb0+Cvf1DgZ2tmUfOlg2qY0PdfrTU7Pf5cpCK46+zLhqQL7HpZNi/CHQrtU5TiSU6gU2gUy0/tOvlvUh4T+ipR+yH51Y2XF5v0Szy8c1brSOJ4VpO8sdxLycSw2QYOMbuv0Pxjg8YIv5yKbGxjKVOCn6Mp8QwOgYj1BeEdpUr4Lz2/ZuFlJoTNcPQSkxCjVI0VtRF"
        }
      ]
    }
  },
  "location": "japaneast",
  "maxAgentPools": 100,
  "name": "aks-contoso-video",
  "networkProfile": {
    "dnsServiceIp": "10.0.0.10",
    "ipFamilies": [
      "IPv4"
    ],
    "loadBalancerProfile": {
      "allocatedOutboundPorts": null,
      "effectiveOutboundIPs": [
        {
          "id": "/subscriptions/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MC_rg-contoso-video_aks-contoso-video_japaneast/providers/Microsoft.Network/publicIPAddresses/99e14181-51fb-47db-a57e-8052fa5bd381",
          "resourceGroup": "MC_rg-contoso-video_aks-contoso-video_japaneast"
        }
      ],
      "enableMultipleStandardLoadBalancers": null,
      "idleTimeoutInMinutes": null,
      "managedOutboundIPs": {
        "count": 1,
        "countIpv6": null
      },
      "outboundIPs": null,
      "outboundIpPrefixes": null
    },
    "loadBalancerSku": "Standard",
    "natGatewayProfile": null,
    "networkDataplane": "azure",
    "networkMode": null,
    "networkPlugin": "azure",
    "networkPluginMode": null,
    "networkPolicy": null,
    "outboundType": "loadBalancer",
    "podCidr": null,
    "podCidrs": null,
    "serviceCidr": "10.0.0.0/16",
    "serviceCidrs": [
      "10.0.0.0/16"
    ]
  },
  "nodeResourceGroup": "MC_rg-contoso-video_aks-contoso-video_japaneast",
  "oidcIssuerProfile": {
    "enabled": false,
    "issuerUrl": null
  },
  "podIdentityProfile": null,
  "powerState": {
    "code": "Running"
  },
  "privateFqdn": null,
  "privateLinkResources": null,
  "provisioningState": "Succeeded",
  "publicNetworkAccess": null,
  "resourceGroup": "rg-contoso-video",
  "securityProfile": {
    "azureKeyVaultKms": null,
    "defender": null,
    "imageCleaner": null,
    "workloadIdentity": null
  },
  "servicePrincipalProfile": {
    "clientId": "msi",
    "secret": null
  },
  "sku": {
    "name": "Base",
    "tier": "Free"
  },
  "storageProfile": {
    "blobCsiDriver": null,
    "diskCsiDriver": {
      "enabled": true
    },
    "fileCsiDriver": {
      "enabled": true
    },
    "snapshotController": {
      "enabled": true
    }
  },
  "supportPlan": "KubernetesOfficial",
  "systemData": null,
  "tags": null,
  "type": "Microsoft.ContainerService/ManagedClusters",
  "upgradeSettings": null,
  "windowsProfile": {
    "adminPassword": null,
    "adminUsername": "azureuser",
    "enableCsiProxy": true,
    "gmsaProfile": null,
    "licenseType": null
  },
  "workloadAutoScalerProfile": {
    "keda": null,
    "verticalPodAutoscaler": null
  }
}

Azure Cloud Shell
$ az aks create \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --node-count 2 \
    --enable-addons http_application_routing \
    --generate-ssh-keys \
    --node-vm-size Standard_B2s \
    --network-plugin azure
docker_bridge_cidr is not a known attribute of class <class 'azure.mgmt.containerservice.v2023_07_01.models._models_py3.ContainerServiceNetworkProfile'> and will be ignored
(OperationNotAllowed) Operation is not allowed: Another agentpool operation (nodepool1 - Creating) is in progress, please wait for it to finish before starting a new operation. See https://aka.ms/aks-pending-operation for more details
Code: OperationNotAllowed
Message: Operation is not allowed: Another agentpool operation (nodepool1 - Creating) is in progress, please wait for it to finish before starting a new operation. See https://aka.ms/aks-pending-operation for more details

https://learn.microsoft.com/en-us/troubleshoot/azure/azure-kubernetes/operationisnotallowed

  • Solution 2: Get the current cluster status before you try an operation

とりあえず状態確認

Azure Cloud Shell
$ az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --output table
Name               Location    ResourceGroup     KubernetesVersion    CurrentKubernetesVersion    ProvisioningState    Fqdn
-----------------  ----------  ----------------  -------------------  --------------------------  -------------------  -------------------------------------------------------------------
aks-contoso-video  japaneast   rg-contoso-video  1.26.6               1.26.6                      Succeeded            aks-contos-rg-contoso-video-a058ec-73ii5zkt.hcp.japaneast.azmk8s.io

Portalに出てこないからガラだけできた?

az aks updateに置き換えてやるのは難易度高すぎたので、おとなしく一回消します。

Azure Cloud Shell
$ az aks delete --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Are you sure you want to perform this operation? (y/n): y

終わったら、az aks createをもう一度実行します。


  1. 別のノード プールを追加します。
Azure Cloud Shell
$ az aks nodepool add \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $CLUSTER_NAME \
    --name userpool \
    --node-count 2 \
    --node-vm-size Standard_B2s
{
  "availabilityZones": null,
  "count": 2,
  "creationData": null,
  "currentOrchestratorVersion": "1.26.6",
  "enableAutoScaling": false,
  "enableEncryptionAtHost": false,
  "enableFips": false,
  "enableNodePublicIp": false,
  "enableUltraSsd": false,
  "gpuInstanceProfile": null,
  "hostGroupId": null,
  "id": "/subscriptions/xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-contoso-video/providers/Microsoft.ContainerService/managedClusters/aks-contoso-video/agentPools/userpool",
  "kubeletConfig": null,
  "kubeletDiskType": "OS",
  "linuxOsConfig": null,
  "maxCount": null,
  "maxPods": 30,
  "minCount": null,
  "mode": "User",
  "name": "userpool",
  "nodeImageVersion": "AKSUbuntu-2204gen2containerd-202309.06.0",
  "nodeLabels": null,
  "nodePublicIpPrefixId": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.26.6",
  "osDiskSizeGb": 128,
  "osDiskType": "Managed",
  "osSku": "Ubuntu",
  "osType": "Linux",
  "podSubnetId": null,
  "powerState": {
    "code": "Running"
  },
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-contoso-video",
  "scaleDownMode": "Delete",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "typePropertiesType": "VirtualMachineScaleSets",
  "upgradeSettings": {
    "drainTimeoutInMinutes": null,
    "maxSurge": null
  },
  "vmSize": "Standard_B2s",
  "vnetSubnetId": null,
  "workloadRuntime": null
}

Portal を見るとAKSができてます。


kubectl でリンクする

  1. Kubernetes クラスターをリンクします。
リンクってなに?

Windows Copilotに聞いてみた


この文書は、以下のことを説明しています。

  • Kubernetes クラスターをリンクするとは何か:Kubernetes クラスターをリンクするとは、Azure Arc によって、Azure 以外の場所にある Kubernetes クラスターを Azure リソースとして管理できるようにすることです。これにより、Azure のツールやポリシーを使って、異なる環境のクラスターを一元的に監視や運用できます。
  • Kubernetes クラスターをリンクする方法:Kubernetes クラスターをリンクするには、次の手順が必要です。
    • Azure CLI をインストールし、Azure にログインする
    • Azure Arc を有効化する
    • リンクしたい Kubernetes クラスターに接続し、必要なツールや設定をインストールする
    • Azure CLI を使って、Kubernetes クラスターを Azure Arc に登録する
  • Kubernetes クラスターをリンクするメリット:Kubernetes クラスターをリンクすると、以下のメリットがあります。
    • Azure Monitor や Azure Policy などの Azure のサービスを使って、クラスターのパフォーマンスやセキュリティを向上させることができる
    • Azure Arc の GitOps 機能を使って、クラスターの構成やアプリケーションのデプロイメントを自動化し、一貫性や信頼性を高めることができる
    • Azure Arc の拡張機能を使って、Azure Data Services や Azure Machine Learning などの Azure のソリューションをクラスター上で実行し、データや AI の活用を促進することができる

以上が、この文書の要約です。


ムズカシイネー

AKS前提で答えてくれたけど、普通のk8sにはない概念なんだろうか?

Azure Cloud Shell
$ az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Merged "aks-contoso-video" as current context in /home/user/.kube/config
  1. クラスターに接続できることを確認し、その構成を確かめます。
Azure Cloud Shell
$ kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-25295292-vmss000000   Ready    agent   23m   v1.26.6
aks-nodepool1-25295292-vmss000001   Ready    agent   22m   v1.26.6
aks-userpool-04577067-vmss000000    Ready    agent   14m   v1.26.6
aks-userpool-04577067-vmss000001    Ready    agent   14m   v1.26.6

ユニット5: 演習 - Azure Kubernetes Service クラスターでアプリケーションをデプロイする

配置マニフェストを作成する

  1. マニフェスト ファイルを作成します。
Azure Cloud Shell
$ touch deployment.yaml
  1. Cloud Shell でVSCodeを開きます。
Azure Cloud Shell
$ code . 
  1. deployment.yaml ファイルを開き、YAML の次のコード セクションを追加します。
deployment.yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-website
  1. マニフェスト ファイル内でポッド情報を定義します。(specの部分)
deployment.yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-website
spec:
  template: # This is the template of the pod inside the deployment
    metadata: # Metadata for the pod
      labels:
        app: contoso-website
  1. すべてのポッドに、そのポッド内のコンテナーを定義します。(containersの部分)
deployment.yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-website
spec:
  template: # This is the template of the pod inside the deployment
    metadata:
      labels:
        app: contoso-website
    spec:
      containers: # Here we define all containers
        - name: contoso-website
  1. アプリでクラスターから使用できるリソースの最小量と最大量を定義します。(resourceの部分)
deployment.yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-website
spec:
  template: # This is the template of the pod inside the deployment
    metadata:
      labels:
        app: contoso-website
    spec:
      containers:
        - image: mcr.microsoft.com/mslearn/samples/contoso-website
          name: contoso-website
          resources:
            requests: # Minimum amount of resources requested
              cpu: 100m
              memory: 128Mi
            limits: # Maximum amount of resources requested
              cpu: 250m
              memory: 256Mi
  1. 外部に公開されるポートを定義します。(portsの部分)
deployment.yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-website
spec:
  template: # This is the template of the pod inside the deployment
    metadata:
      labels:
        app: contoso-website
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - image: mcr.microsoft.com/mslearn/samples/contoso-website
          name: contoso-website
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          ports:
            - containerPort: 80 # This container exposes port 80
              name: http # We named that port "http" so we can refer to it later
  1. セレクター セクションを追加して、デプロイによって管理されるワークロードを定義します。
deployment.yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-website
spec:
  selector: # Define the wrapping strategy
    matchLabels: # Match all pods with the defined labels
      app: contoso-website # Labels follow the `name: value` template
  template: # This is the template of the pod inside the deployment
    metadata:
      labels:
        app: contoso-website
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - image: mcr.microsoft.com/mslearn/samples/contoso-website
          name: contoso-website
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          ports:
            - containerPort: 80
              name: http
  1. ファイルを保存して閉じます。

マニフェストを適用する

  1. 配置マニフェストをクラスターに送信します。
Azure Cloud Shell
$ kubectl apply -f ./deployment.yaml
deployment.apps/contoso-website created
  1. デプロイが成功したかどうかを確認します。
Azure Cloud Shell
$ kubectl get deploy contoso-website
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
contoso-website   0/1     1            0           40s
  1. ポッドが実行されているかどうかを確認します。
Azure Cloud Shell
$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
contoso-website-b78cc877b-8wjrd   1/1     Running   0          76s

ユニット7: 演習 - アプリケーションへのネットワーク アクセスを有効にする

サービス マニフェストを作成する

  1. Kubernetes Service 用の service.yaml という名前のマニフェスト ファイルを作成します。
Azure Cloud Shell
$ touch service.yaml
  1. Cloud Shell でVSCodeを開きます。
Azure Cloud Shell
$ code . 
  1. service.yaml ファイルを開き、YAML の次のコード セクションを追加します。
service.yaml
#service.yaml
apiVersion: v1
kind: Service
metadata:
  name: contoso-website
  1. サービスの種類を追加します。
service.yaml
#service.yaml
apiVersion: v1
kind: Service
metadata:
  name: contoso-website
spec:
  type: ClusterIP  # ここ
  1. サービスによってグループ化されてカバレッジが提供されるポッドを定義します。
service.yaml
#service.yaml
apiVersion: v1
kind: Service
metadata:
  name: contoso-website
spec:
  type: ClusterIP
  selector:  # ここ
    app: contoso-website
  1. ポート転送ルールを定義します。
service.yaml
#service.yaml
apiVersion: v1
kind: Service
metadata:
  name: contoso-website
spec:
  type: ClusterIP
  selector:
    app: contoso-website
  ports:
    - port: 80 # SERVICE exposed port
      name: http # SERVICE port name
      protocol: TCP # The protocol the SERVICE will listen to
      targetPort: http # Port to forward to in the POD
  1. VSCode を保存して閉じます。

サービスをデプロイする

  1. サービス マニフェストをクラスターに送信します。
Azure Cloud Shell
$ kubectl apply -f ./service.yaml
service/contoso-website created
  1. デプロイが成功したかどうかを確認します。
Azure Cloud Shell
$ kubectl get service contoso-website
NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
contoso-website   ClusterIP   10.0.126.127   <none>        80/TCP    32s

イングレス マニフェストを作成する

  1. ingress.yaml という名前のマニフェスト ファイルを作成します。
Azure Cloud Shell
$ touch ingress.yaml
  1. Cloud Shell でVSCodeを開きます。
Azure Cloud Shell
$ code . 
  1. ingress.yaml ファイルを開き、YAML の次のコード セクションを追加します。
ingress.yaml
#ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: contoso-website
  1. このイングレスに対する HTTP application routing アドオンを使用するために呼び出されるマニフェスト ファイルの metadata セクションに annotations キーを作成します。
ingress.yaml
#ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: contoso-website
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
  1. クラスターへのアクセスが許可されるホストの完全修飾ドメイン名 (FQDN) を設定します。
Azure Cloud Shell
$ az aks show \
  -g $RESOURCE_GROUP \
  -n $CLUSTER_NAME \
  -o tsv \
  --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName
3bed7d8e4a5f4cbfa2d3.japaneast.aksapp.io  # これをコピー
  1. <zone-name> プレースホルダーの値を、コピーした ZoneName の値に置き換えます。
ingress.yaml
#ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: contoso-website
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
spec:
  rules:
    - host: contoso.3bed7d8e4a5f4cbfa2d3.japaneast.aksapp.io # 書き換え後
  1. バックエンド構成をイングレス規則に追加します。
ingress.yaml
#ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: contoso-website
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
spec:
  rules:
    - host: contoso.3bed7d8e4a5f4cbfa2d3.japaneast.aksapp.io
      http:
        paths:
          - backend: # How the ingress will handle the requests
              service:
               name: contoso-website # Which service the request will be forwarded to
               port:
                 name: http # Which port in that service
            path: / # Which path is this rule referring to
            pathType: Prefix # See more at https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types
  1. VSCode を保存して閉じます。

イングレスをデプロイする

  1. イングレス マニフェストをクラスターに送信します。
Azure Cloud Shell
$ kubectl apply -f ./ingress.yaml
ingress.networking.k8s.io/contoso-website created
  1. デプロイが成功したかどうかを確認します。
    ADDRESS が空欄の場合はもう一度コマンドを実行する。ゾーンレコードの作成に時間がかかるみたい。
Azure Cloud Shell
$ kubectl get ingress contoso-website
NAME              CLASS    HOSTS                                              ADDRESS         PORTS   AGE
contoso-website   <none>   contoso.3bed7d8e4a5f4cbfa2d3.japaneast.aksapp.io   20.210.77.253   80      72s
  1. ブラウザを開き、表示されたFQDNにアクセスする。

できました!

リソースのクリーンアップ

お金がかかるのでリソースを削除します。

  1. Azure Portal から作成したリソースグループを特定して、『リソースグループの削除』をクリック

  2. リソース グループの名前を入力して削除ボタンをクリックします。

  3. 削除されたクラスター コンテキストを削除します。

Azure Cloud Shell
$ kubectl config delete-context aks-contoso-video
warning: this removed your active context, use "kubectl config use-context" to select a different one
deleted context aks-contoso-video from /home/user/.kube/config

これで完了です。

終わりに

いろいろムズカシイですが頑張って慣れていこうと思います。。。👻

Discussion