Buy Me a Coffee

Azure Kubernetes 服務 (AKS) 全流程操作手冊

目錄

  1. 前言:進入 AKS 與 Kubernetes 的世界
  2. 製作與推送 Docker 鏡像
  3. 登入 Azure 與 AKS
  4. 使用 kubectl 調試與管理
  5. 完整實戰案例
  6. 進階管理與安全
  7. 常見問題與調試
  8. 附錄:常用指令速查

前言:進入 AKS 與 Kubernetes 的世界

歡迎來到《Azure Kubernetes 服務 (AKS) 全流程操作手冊》!這份文件專為初學者設計,如果你剛開始接觸 Kubernetes (K8s)Azure Kubernetes 服務 (AKS),可能會覺得滿頭問號——什麼是容器?什麼是集群?kubectl 又是什麼?別緊張,這裡會用簡單的語言帶你一步步上手。

什麼是 Kubernetes 與 AKS?

  • Kubernetes (K8s):一個管理容器的平台,幫你自動化部署、擴展和維護應用程式。想像你有一堆樂高積木(容器),Kubernetes 就像一個聰明的建築師,幫你把這些積木組裝成穩定的房子,還能根據需要增減房間。
  • AKS:微軟 Azure 提供的 Kubernetes 服務,幫你把底層的伺服器管理簡化。你不用自己買地蓋房子(搭建伺服器),直接租用 Azure 的豪宅(AKS 集群),專注設計內裝(應用程式)就好。

為什麼需要這份手冊?

Kubernetes 很強大,但概念多、指令多,對新手來說有點像學外語。這份手冊會用生活化的比喻和詳細步驟,帶你從製作容器鏡像(打包應用程式)、推送至倉庫(Azure Container Registry, ACR),到部署和管理 AKS 集群,甚至教你如何調試問題。目標是讓你從零開始,一路學到能夠獨立操作。

本手冊的結構

  1. 製作與推送 Docker 鏡像:如何打包應用程式並上傳到 ACR。
  2. 登入 Azure 與 AKS:從登入雲端到進入集群的操作。
  3. 使用 kubectl 調試與管理:檢查資源狀態、查看日誌、解決問題。
  4. 完整實戰案例:部署一個簡單的 Web ���用。
  5. 進階管理與安全:集群維護與權限控制。
  6. 附錄:常用指令速查與資源連結。

第一部分:製作 Docker 鏡像並推送至 Azure Container Registry (ACR)

1.1 什麼是 Docker 與 ACR?

Docker 是什麼?

Docker 是一個工具,讓你把應用程式和它的運行環境打包成一個「容器」(Container)。這個容器就像一個便當盒,裡面有飯菜(你的程式碼)、調味料(函式庫)和餐具(運行環境),不管拿到哪裡都能直接吃(運行),不用擔心缺少什麼。

  • Docker 鏡像(Image):便當盒的藍圖,描述怎麼製作這個便當。
  • 容器(Container):根據藍圖做出來的便當,實際運行的實體。

ACR 是什麼?

Azure Container Registry (ACR) 是 Azure 提供的私人倉庫,用來儲存你的 Docker 鏡像。就像你把便當盒藍圖存在一個安全的保險櫃,只有你和你的團隊能拿取,之後 AKS 可以從這裡提取藍圖來製作便當(運行容器)。

1.2 編譯 Docker 鏡像的詳細流程

前置準備

要製作 Docker 鏡像,你需要:

  1. 安裝 Docker:在你的電腦上安裝 Docker Desktop(Windows/Mac)或 Docker Engine(Linux)。下載網址:https://www.docker.com/get-started。
  2. 準備應用程式:假設你有一個簡單的網頁應用,例如一個 HTML 檔案。
  3. 撰寫 Dockerfile:告訴 Docker 如何打包你的應用。

步驟 1:建立簡單應用程式

假設我們要做一個簡單的網頁應用,顯示「Hello, AKS!」。先建立以下檔案:

  • index.html
<!DOCTYPE html>
<html>
<head>
    <title>Hello AKS</title>
</head>
<body>
    <h1>Hello, AKS!</h1>
</body>
</html>

步驟 2:撰寫 Dockerfile

在同一個資料夾中,建立一個名為 Dockerfile 的檔案(無副檔名),內容如下:

# 基於官方 Nginx 鏡像
FROM nginx:latest

# 複製本地的 index.html 到容器中的 Nginx 網頁目錄
COPY index.html /usr/share/nginx/html/

# 開放 80 埠,讓外界可以訪問
EXPOSE 80

說明:

  • FROM:指定基礎鏡像,這裡用 Nginx(一個輕量級網頁伺服器)。
  • COPY:把本地的檔案複製到容器內。
  • EXPOSE:告訴 Docker 這個容器會使用 80 埠。

步驟 3:編譯(構建)Docker 鏡像

在終端機中,進入包含 Dockerfile 的目錄,執行:

docker build -t mywebapp:2025v1 .
  • docker build:構建鏡像的指令。
  • -t mywebapp:2025v1:鏡像名稱(mywebapp)和版本(2025v1)。
  • .:從當前目錄讀取 Dockerfile。

執行後,你會看到類似以下的輸出:

Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx:latest
 ---> 605c77e624dd
Step 2/3 : COPY index.html /usr/share/nginx/html/
 ---> Using cache
 ---> 8b4e5f2f5c2e
Step 3/3 : EXPOSE 80
 ---> Running in 9f2b5d6e5f3c
Removing intermediate container 9f2b5d6e5f3c
 ---> e8f5d2c5b6d7
Successfully built e8f5d2c5b6d7
Successfully tagged mywebapp:2025v1

步驟 4:測試鏡像(可選)

在推送之前,可以先在本機測試這個鏡像:

docker run -d -p 8080:80 mywebapp:2025v1
  • -d:背景運行。
  • -p 8080:80:把容器的 80 埠映射到本機的 8080 埠。

打開瀏覽器,輸入 http://localhost:8080,應該會看到「Hello, AKS!」。

1.3 推送鏡像至 ACR

前置步驟:建立 ACR

如果你還沒建立 ACR,先執行以下指令:

# 建立資源組
az group create --name myResourceGroup --location eastus

# 建立 ACR
az acr create --resource-group myResourceGroup \
              --name myregistry2025 \
              --sku Basic \
              --admin-enabled true

注意:myregistry2025 必須是唯一的名稱,如果被占用,可以改成 yournameacr2025

步驟 1:查看 ACR 登入伺服器

az acr list --resource-group myResourceGroup \
            --query "[].{acrLoginServer:loginServer}" \
            --output table

輸出:

AcrLoginServer
--------------
myregistry2025.azurecr.io

步驟 2:標記鏡像

把本地的鏡像名稱加上 ACR 地址:

docker tag mywebapp:2025v1 myregistry2025.azurecr.io/mywebapp:2025v1

步驟 3:登入 ACR

az acr login --name myregistry2025

如果提示「登入成功」,表示可以繼續。

步驟 4:推送鏡像

docker push myregistry2025.azurecr.io/mywebapp:2025v1

推送完成後,你會看到類似:

The push refers to repository [myregistry2025.azurecr.io/mywebapp]
...
2025v1: Pushed

步驟 5:驗證鏡像

檢查 ACR 是否收到鏡像:

az acr repository list --name myregistry2025 --output table

輸出:

Result
-------
mywebapp

查看版本:

az acr repository show-tags --name myregistry2025 \
                            --repository mywebapp \
                            --output table

輸出:

Result
-------
2025v1

第二部分:登入 Azure 與 AKS 終端機

2.1 什麼是 Azure CLI 與 kubectl?

  • Azure CLI:微軟提供的命令列工具,用來管理 Azure 資源(例如 ACR、AKS)。
  • kubectl:Kubernetes 的命令列工具,用來與 AKS 集群互動。

2.2 登入 Azure

前置準備

確保你已安裝 Azure CLI(下載:https://learn.microsoft.com/zh-tw/cli/azure/install-azure-cli)。

步驟 1:執行登入指令

az login

這會打開瀏覽器,要求你輸入 Azure 帳號和密碼。登入後,終端機會顯示:

[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "...",
    "id": "...",
    "name": "My Subscription",
    "state": "Enabled",
    ...
  }
]

步驟 2:設定預設訂閱(若有多個)

az account list --output table

找出你的訂閱 ID,然後設定:

az account set --subscription "你的訂閱 ID"

2.3 建立並登入 AKS 終端機

步驟 1:建立 AKS 集群

az aks create --resource-group myResourceGroup \
              --name aks-cluster-2025 \
              --node-count 2 \
              --attach-acr myregistry2025 \
              --generate-ssh-keys
  • --node-count 2:啟動 2 個節點。
  • --attach-acr:讓 AKS 可以存取你的 ACR。

步驟 2:獲取 AKS 憑證

az aks get-credentials --resource-group myResourceGroup \
                       --name aks-cluster-2025

這會更新 ~/.kube/config 檔案,讓 kubectl 能連接到你的集群。

步驟 3:驗證連線

kubectl get nodes

輸出:

NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-12345678-vmss000000   Ready    agent   5m    v1.29.0
aks-nodepool1-12345678-vmss000001   Ready    agent   5m    v1.29.0

第三部分:使用 kubectl 調試與查看資源

3.1 什麼是 kubectl?

kubectl 是你的 Kubernetes 遙控器,用來檢查狀態、下達指令或修復問題。以下是常見資源的調試方法。

3.2 檢查 Pod

查看所有 Pod

kubectl get pods

輸出:

NAME                          READY   STATUS    RESTARTS   AGE
mywebapp-5d8f6b7c77-abcde    1/1     Running   0          10m

查看特定 Namespace 的 Pod

kubectl get pods -n my-namespace

查看 Pod 日誌

kubectl logs mywebapp-5d8f6b7c77-abcde

如果 Pod 有問題,日誌會顯示錯誤訊息。

進入 Pod 調試

kubectl exec -it mywebapp-5d8f6b7c77-abcde -- /bin/bash

進入容器後,可以檢查檔案或執行命令。

3.3 檢查 Namespace

kubectl get namespaces

輸出:

NAME              STATUS   AGE
default           Active   1h
kube-system       Active   1h
my-namespace      Active   10m

3.4 檢查 Ingress

查看 Ingress

kubectl get ingress

輸出:

NAME         CLASS    HOSTS       ADDRESS        PORTS   AGE
web-ingress  <none>   myapp.com   20.50.123.45   80      5m

詳細資訊

kubectl describe ingress web-ingress

3.5 調試技巧

事件檢查

kubectl get events --sort-by=.metadata.creationTimestamp

資源使用

kubectl top pods

臨時調試 Pod

kubectl run debug-tool --image=busybox --rm -it -- sh

第四部分:完整部署實戰案例

4.1 部署一個 Web 應用

架構圖

graph BT
    User[使用者] --> Ingress[入口控制器]
    Ingress --> Service[服務]
    Service --> Deployment[部署]
    Deployment --> Pod[容器實例]
    Pod --> ACR[鏡像倉庫]

步驟 1:建立 Deployment

建立 web-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: myregistry2025.azurecr.io/mywebapp:2025v1
        ports:
        - containerPort: 80

部署:

kubectl apply -f web-deployment.yaml

檢查:

kubectl get deployments

步驟 2:暴露服務

kubectl expose deployment webapp-deployment \
  --port=80 \
  --target-port=80 \
  --type=LoadBalancer

檢查:

kubectl get services

步驟 3:(可選)設定 Ingress

web-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: myapp.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp-deployment
            port:
              number: 80

部署:

kubectl apply -f web-ingress.yaml

第五部分:進階管理與監控

5.1 自動擴縮容(HPA)

hpa.yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: webapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: webapp-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

部署:

kubectl apply -f hpa.yaml

檢查:

kubectl get hpa

5.2 監控資源使用

kubectl top pods
kubectl top nodes

第六部分:安全與權限管理

6.1 RBAC 權限控制

developer-role.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: developer
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch"]

部署與綁定:

kubectl apply -f developer-role.yaml
kubectl create rolebinding dev-access \
  --role=developer \
  --user=johndoe@company.com \
  --namespace=default

6.2 網路策略

frontend-policy.yaml:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: frontend-access
spec:
  podSelector:
    matchLabels:
      app: webapp
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: internal
    ports:
    - protocol: TCP
      port: 80

部署:

kubectl apply -f frontend-policy.yaml

第七部分:常見問題與調試技巧

7.1 Pod 無法啟動

# 檢查 Pod 狀態
kubectl get pods
# 查看詳細資訊
kubectl describe pod <pod-name>
# 查看日誌
kubectl logs <pod-name>

7.2 服務無法訪問

# 檢查服務狀態
kubectl get svc
# 檢查端點
kubectl get endpoints <service-name>

7.3 鏡像拉取失敗

# 檢查 AKS 與 ACR 的連接狀態
az aks show --name aks-cluster-2025 --resource-group myResourceGroup

附錄:常用指令速查表

ACR 操作

清理舊鏡像:

az acr run --registry myregistry2025 \
  --cmd "acr purge --filter 'mywebapp:.*' --ago 30d" \
  /dev/null

AKS 管理

查看集群資訊:

az aks show --name aks-cluster-2025 --resource-group myResourceGroup

升級集群:

az aks upgrade --name aks-cluster-2025 \
  --resource-group myResourceGroup \
  --kubernetes-version 1.29

kubectl 技巧

生成模板:

kubectl create deployment temp --image=nginx --dry-run=client -o yaml > temp.yaml

快速調試:

kubectl run debug --image=busybox --rm -it -- sh