Hızlı Başlangıç: Azure CLI kullanarak Azure Kubernetes Service (AKS) kümesi dağıtma

Azure Kubernetes Service (AKS), kümeleri hızla dağıtmanızı ve yönetmenizi sağlayan yönetilen bir Kubernetes hizmetidir. Bu hızlı başlangıçta şunları yapmayı öğrenirsiniz:

  • Azure CLI kullanarak varsayılan ayarlarla bir AKS kümesi dağıtma.
  • Örnek bir çok kapsayıcılı uygulamayı, perakende senaryosunu simüle eden bir grup mikro hizmetler ve web ön uçlarıyla dağıtın.

Note

Bu makale, kümeyi yalnızca değerlendirme amacıyla dağıtma adımlarını içerir. Üretime hazır bir kümeyi dağıtmadan önce, iş gereksinimlerinizle nasıl uyumlu olduğunu göz önünde bulundurmak için temel başvuru mimarimizi tanımanızı öneririz.

Yalnızca bir Azure Kubernetes Service kümesi dağıtmak istiyorsanız, Tarayıcınızı Azure portalında açmak için Azure'a Dağıt'ı seçin ve Tüm adımları çalıştır'ı seçin.

Azure’a dağıtın

Başlamadan önce

Bu hızlı başlangıç, Kubernetes kavramlarının temel olarak bilindiğini varsayar. Daha fazla bilgi için bkz . Azure Kubernetes Service (AKS) için Kubernetes temel kavramları.

  • Kümenizi oluşturmak için kullandığınız kimliğin uygun minimum izinlere sahip olduğundan emin olun. AKS için erişim ve kimlik hakkında daha fazla bilgi için Azure Kubernetes Hizmeti (AKS) için erişim ve kimlik seçenekleri başlığını inceleyin.
  • Birden fazla Azure aboneliğiniz varsa, kaynakların faturalandırılacağı abonelik kimliğini belirlemek için az account set komutunu kullanarak uygun aboneliği seçin. Daha fazla bilgi için bkz. Azure aboneliklerini yönetme – Azure CLI .
  • Azure aboneliğinize bağlı olarak, vCPU kota artışı istemeniz gerekebilir. Daha fazla bilgi için bkz. VM ailesi vCPU kotalarını artırma.

Kaynak sağlayıcılarını kaydetme

Kaynak sağlayıcılarını Azure aboneliğinize kaydetmeniz gerekebilir. Örneğin, Microsoft.ContainerService gereklidir.

Kayıt durumunu denetlemek için aşağıdaki komutu çalıştırın.

az provider show --namespace Microsoft.ContainerService --query registrationState

Gerekirse kaynak sağlayıcısını kaydedin.

az provider register --namespace Microsoft.ContainerService

Ortam değişkenlerini tanımlama

Bu hızlı başlangıç boyunca kullanmak üzere aşağıdaki ortam değişkenlerini tanımlayın.

export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
export RESOURCE_GROUP="myAKSResourceGroup$RANDOM_STRING"
export CLUSTER_NAME="myAKSCluster$RANDOM_STRING"
export USER_NP='userpool1'
export LOCATION="westus"

RANDOM_STRING değişkeni rastgele 10 basamaklı bir dize depolar. RESOURCE_GROUP ve CLUSTER_NAME değişken değerleri, benzersiz adlar oluşturmak için RANDOM_STRING değeriyle birleştirilir. kullanıcı USER_NP modu düğüm havuzu için bir ad depolar. LOCATION değişkeni westus2 değerine sahiptir. Bu değişken değerlerini kullanabilir veya kendi değerlerinizi oluşturabilirsiniz. echo gibi echo $RANDOM_STRINGdeğişken değerlerini görüntülemek için komutunu kullanın.

Bir kaynak grubu oluşturun

Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği mantıksal bir grupdur. Bir kaynak grubu oluşturduğunuzda, bir konum belirtmeniz istenir. Bu konum, kaynak grubu meta verilerinizin depolama konumudur ve kaynak oluşturma sırasında başka bir bölge belirtmezseniz kaynaklarınızın Azure'da çalıştırıldığı konumdur.

az group create komutunu kullanarak bir kaynak grubu oluşturun .

az group create --name $RESOURCE_GROUP --location $LOCATION

Sonuç aşağıdaki örneğe benzer.

{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup<randomStringValue>",
  "location": "westus",
  "managedBy": null,
  "name": "myAKSResourceGroup<randomStringValue>",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

AKS kümesi oluşturma

az aks create komutunu kullanarak bir AKS kümesi oluşturun . Aşağıdaki örnek, tek düğümlü bir küme oluşturur ve sistem tarafından atanan yönetilen kimliği etkinleştirir.

az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --node-count 1 \
  --generate-ssh-keys

Yeni bir küme oluşturduğunuzda AKS, AKS kaynaklarını depolamak için otomatik olarak ikinci bir kaynak grubu oluşturur. Daha fazla bilgi için bkz. AKS ile neden iki kaynak grubu oluşturulur?

Bu örnekteki küme, zamandan ve kaynaklardan tasarruf etmek için bir düğüm sayısını belirtir. Üretim ortamında öneri üç veya daha fazla düğümden oluşan bir düğüm sayısıdır. Bir az aks create düğüm sayısı belirtmezseniz varsayılan olarak üç düğüm olur.

Kullanıcı modu düğüm havuzu ekleme

Uygulamalar, varsayılan sistem modu düğüm havuzu yerine kullanıcı modu düğüm havuzlarında çalıştırılmalıdır. Kullanıcı düğümü havuzları, uygulama iş yükleri için daha iyi yalıtım ve esneklik sağlar. az aks nodepool add komutunu kullanarak kümenize bir kullanıcı düğümü havuzu ekleyin.

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $USER_NP \
  --node-count 1 \
  --mode User

Kümede olduğu gibi bir düğüm belirttik, ancak bir düğüm sayısı belirtmezseniz varsayılan değer üç düğümdür.

Kullanıcı düğümü havuzu oluşturulduktan sonra az aks nodepool list komutunu kullanarak kümenizin bir sistem düğümü havuzuna ve kullanıcı düğümü havuzuna sahip olduğunu doğrulayabilirsiniz.

az aks nodepool list \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --query "[].{Count:count, Mode:mode, NodePool:name, ResourceGroup:resourceGroup}"
[
  {
    "Count": 1,
    "Mode": "System",
    "NodePool": "nodepool1",
    "ResourceGroup": "myAKSResourceGroup1234554321"
  },
  {
    "Count": 1,
    "Mode": "User",
    "NodePool": "userpool1",
    "ResourceGroup": "myAKSResourceGroup1234554321"
  }
]

Kümeye bağlanma

Bir Kubernetes kümesini yönetmek için, Kubernetes komut satırı istemcisi olan kubectl'i kullanın. Azure Cloud Shell kullanıyorsanız kubectl zaten yüklüdür. kubectl yerel olarak yüklemek için az aks install-cli komutunu kullanın.

  1. kubectl'u, az aks get-credentials komutunu kullanarak Kubernetes kümenize bağlanacak şekilde yapılandırın. Bu komut, kimlik bilgilerini indirir ve Kubernetes CLI'yi bunları kullanacak şekilde yapılandırır.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. kubectl get komutunu kullanarak kümenize bağlantıyı doğrulayın. Bu komut, küme düğümlerinin bir listesini döndürür.

    kubectl get nodes
    
    NAME                                STATUS   ROLES    AGE     VERSION
    aks-nodepool1-123456789-vmss000000   Ready    <none>   15m     v1.34.4
    aks-userpool1-123456789-vmss000000   Ready    <none>   5m36s   v1.34.4
    

    kümeyle oluşturulan sistem düğümü havuzu ve nodepool1 kümeye eklenen kullanıcı düğümü havuzu olmak üzere iki userpool1 düğüm vardır.

Uygulamayı dağıt

Uygulamayı dağıtmak için, AKS Store uygulamasını çalıştırmak için gereken tüm nesneleri oluşturmak için bir bildirim dosyası kullanırsınız. Kubernetes bildirim dosyası, hangi kapsayıcı görüntülerinin çalıştırıldığı gibi kümenin istenen durumunu tanımlar. Bildirim aşağıdaki Kubernetes dağıtımlarını ve hizmetlerini içerir:

Azure Store örnek mimarisinin ekran görüntüsü.

  • Mağaza ön: Müşterilerin ürünleri görüntülemesi ve sipariş vermesi için web uygulaması.
  • Ürün hizmeti: Ürün bilgilerini gösterir.
  • Sipariş hizmeti: Sipariş verir.
  • RabbitMQ: Bir sipariş kuyruğu için ileti kuyruğu.

Note

Üretim için kalıcı depolama olmadan RabbitMQ gibi durum bilgisi olan kapsayıcıları çalıştırmanızı önermiyoruz. Kolaylık sağlamak için burada kullanırız, ancak Azure Cosmos DB veya Azure Service Bus gibi yönetilen hizmetleri kullanmanızı öneririz.

  1. aks-store-quickstart.yaml adlı bir dosya oluşturun ve aşağıdaki bildirimde kopyalayın. İki <defaultPassword> yer tutucuyu kendi parolanızla değiştirin. Bu parola, örneğin varsayılan kullanıcısı RabbitMQ için kullanılır.

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: rabbitmq
    spec:
      serviceName: rabbitmq
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            kubernetes.io/os: linux
            kubernetes.azure.com/mode: user
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "<defaultPassword>"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            kubernetes.io/os: linux
            kubernetes.azure.com/mode: user
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "<defaultPassword>"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
            startupProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 5
              initialDelaySeconds: 20
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 3000
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            kubernetes.io/os: linux
            kubernetes.azure.com/mode: user
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            env:
            - name: AI_SERVICE_URL
              value: "http://ai-service:5001/"
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 2m
                memory: 20Mi
            readinessProbe:
              httpGet:
                path: /health
                port: 3002
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 3002
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            kubernetes.io/os: linux
            kubernetes.azure.com/mode: user
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env:
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
            startupProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 3
              initialDelaySeconds: 5
              periodSeconds: 5
            readinessProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 3
              initialDelaySeconds: 3
              periodSeconds: 3
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              failureThreshold: 5
              initialDelaySeconds: 3
              periodSeconds: 3
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    YAML manifest dosyalarının detayları için, Dağıtımlar ve YAML manifestleri sayfasına bakın.

    YAML dosyasını yerel olarak oluşturur ve kaydederseniz, Dosyaları karşıya yükle/İndir düğmesini seçip yerel dosya sisteminizden dosyayı seçerek bildirim dosyasını Cloud Shell'deki varsayılan dizininize yükleyebilirsiniz.

  2. kubectl apply komutunu kullanarak uygulamayı dağıtın ve YAML bildiriminizin adını belirtin.

    kubectl apply -f aks-store-quickstart.yaml
    
  3. Uygulamanın bir kullanıcı düğümü havuzuna dağıtıldığından emin olmak için aşağıdaki komutu çalıştırın.

    kubectl get pods -o wide
    

    Çıktıda rabbitmq, order-service, product-service ve store-front pod'larının, kullanıcı düğüm havuzundaki bir düğüm üzerinde çalıştığı gösterilecektir.

Uygulamayı test et

Genel IP adresini veya uygulama URL'sini ziyaret ederek uygulamanın çalıştığını doğrulayabilirsiniz.

Uygulama URL'sini görüntülemek için aşağıdaki komutları çalıştırın:

runtime="5 minutes"
endtime=$(date -ud "$runtime" +%s)
while [[ $(date -u +%s) -le $endtime ]]
do
   STATUS=$(kubectl get pods -l app=store-front -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}')
   echo $STATUS
   if [ "$STATUS" == 'True' ]
   then
      export IP_ADDRESS=$(kubectl get service store-front --output 'jsonpath={..status.loadBalancer.ingress[0].ip}')
      echo "service IP address: $IP_ADDRESS"
      break
   else
      sleep 10
   fi
done

Çıktı, <applicationIPAddress> yer tutucuda uygulamanın genel IP adresini gösterir. Sonraki adımlarda uygulamayı görüntülemek için bu IP adresini kullanırsınız.

service IP Address: <applicationIPAddress>

Uygulama URL'sine istek göndermek için aşağıdaki komutu çalıştırın. <applicationIPAddress> değerini hizmet IP Adresi ile değiştirin.

curl <applicationIPAddress>

komutu, uygulamanın isteğe yanıt verdiğini gösteren HTML çıkışını döndürür.

<!doctype html>
<html lang="">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Contoso Pet Store</title>
    <script type="module" crossorigin src="/assets/index-CLiaTzSi.js"></script>
    <link rel="stylesheet" crossorigin href="/assets/index-Cv6jORyk.css">
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

Uygulama web sitesini görüntülemek için bir tarayıcı açın ve hizmet IP adresini girin. Sayfa aşağıdaki örneğe benzer.

AKS Store örnek uygulamasının ekran görüntüsü.

Kümeyi sil

AKS öğreticisini yapmayı planlamıyorsanız, Azure faturalama ücretlerinden kaçınmak için gereksiz kaynakları temizleyin. az group delete komutunu kullanarak kaynak grubunu, kapsayıcı hizmetini ve tüm ilgili kaynakları kaldırabilirsiniz.

az group delete --name $RESOURCE_GROUP --no-wait --yes

AKS kümesi, bu hızlı başlangıçta kullanılan varsayılan kimlik seçeneği olan sistem tarafından atanan yönetilen kimlikle oluşturulmuştur. Platform bu kimliği yönetir, böylece bu kimliği el ile kaldırmanız gerekmez.

Sonraki Adımlar

Bu hızlı başlangıçta bir Kubernetes kümesi dağıttınız ve ardından basit bir çok kapsayıcılı uygulama dağıttınız. Bu örnek uygulama yalnızca tanıtım amaçlıdır ve Kubernetes uygulamaları için en iyi yöntemlerin tümünü temsil etmez. Üretim için AKS ile tam çözümler oluşturma hakkında yönergeler için bkz. AKS çözüm kılavuzu.

AKS ile ilgili daha fazla bilgi edinmek ve tam bir koddan dağıtıma örnek uygulamak için Kubernetes kümesi kılavuzuna geçin.