
Azure Kubernetes 服務 (AKS) 全流程操作手冊
目錄
- 前言:進入 AKS 與 Kubernetes 的世界
- 製作與推送 Docker 鏡像
- 登入 Azure 與 AKS
- 使用 kubectl 調試與管理
- 完整實戰案例
- 進階管理與安全
- 常見問題與調試
- 附錄:常用指令速查
前言:進入 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 集群,甚至教你如何調試問題。目標是讓你從零開始,一路學到能夠獨立操作。
本手冊的結構
- 製作與推送 Docker 鏡像:如何打包應用程式並上傳到 ACR。
- 登入 Azure 與 AKS:從登入雲端到進入集群的操作。
- 使用 kubectl 調試與管理:檢查資源狀態、查看日誌、解決問題。
- 完整實戰案例:部署一個簡單的 Web ���用。
- 進階管理與安全:集群維護與權限控制。
- 附錄:常用指令速查與資源連結。
第一部分:製作 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 鏡像,你需要:
- 安裝 Docker:在你的電腦上安裝 Docker Desktop(Windows/Mac)或 Docker Engine(Linux)。下載網址:https://www.docker.com/get-started。
- 準備應用程式:假設你有一個簡單的網頁應用,例如一個 HTML 檔案。
- 撰寫 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