Kubernetes 進階介紹
工作責與控制器
Kubernetes 提供多種控制器以便管理容器的生命週期:
| 控制器 | 說明 | 
|---|---|
| ReplicaSet | 確保指定數量的 Pod 正在運行。也可獨立定義使用,但常被 Deployment 管理。 | 
| Deployment | 自動化應用部署與版本升級,支援回歸。 | 
| StatefulSet | 管理有狀態應用(如資料庫),保留固定的 Pod 名稱與順序。 | 
| DaemonSet | 確保每個 Node 上都啟動一個 Pod,常用於日誌收集、監控代理等。 | 
| Job | 一次性執行的批次件作。 | 
| CronJob | 按照排程執行的件作,類似 Linux 的 crontab。 | 
說明:ReplicaSet 是 Kubernetes 中使用來確保有指定數量 Pod 正在運行的控制器,最常見的使用方式是由 Deployment 管理。Deployment 本身就是一個封裝了 ReplicaSet 的工具,所以當你定義一個 Deployment 時,Kubernetes 會在背後自動產生一個 ReplicaSet 與一或多個 Pod 來完成部署。
但如果需要組合更簡單的操作,也可以獨立定義 ReplicaSet YAML 文件來使用:
範例:ReplicaSet YAML 設定
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:stable-alpine
          ports:
            - containerPort: 80
範例:Deployment 使用 YAML 設定啟動一個 Nginx Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:stable-alpine
          ports:
            - containerPort: 80
範例:CronJob 每分鐘執行一次 echo hello
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cron
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox
              args:
                - /bin/sh
                - -c
                - echo "Hello from cron job"
          restartPolicy: OnFailure
Volume 與 ConfigMap / Secret
| 資源類型 | 說明 | 
|---|---|
| Volume | 提供持久化儲存,常與 PVC(PersistentVolumeClaim) 搭配使用。 | 
| ConfigMap | 存放非機密設定資料,供容器掛載或作為環境變數使用。 | 
| Secret | 安全儲存憑證、API 金鑰、密碼等敏感資訊。 | 
範例:Pod 使用 ConfigMap 挂載檔案:
# config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: default
data:
  index.html: "<h1>Hello from ConfigMap</h1>"
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo
spec:
  containers:
    - name: web
      image: nginx
      volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
  volumes:
    - name: html
      configMap:
        name: app-config
Ingress 與服務暴露
| 類型 | 說明 | 
|---|---|
| ClusterIP | 預設類型,僅限叢集內部存取。 | 
| NodePort | 在所有 Node 上開啟一個固定 Port 提供外部存取。 | 
| LoadBalancer | 在雲端平台自動配置外部 Load Balancer。 | 
| Ingress | 提供基於 URL 路由與虛擬主機的 HTTP 存取,搭配 Ingress Controller 使用。 | 
常見 Ingress Controller:NGINX、Traefik、HAProxy。
範例:使用 NGINX Ingress 導向服務:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
    - host: example.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80
Helm 套件管理器
Helm 可將 Kubernetes 資源包裝成 chart,實現模組化部署:
| 操作 | 指令範例 | 
|---|---|
| 安裝套件 | helm install myapp ./chart | 
| 升級套件 | helm upgrade myapp ./chart | 
| 移除套件 | helm uninstall myapp | 
| 查詢已安裝套件 | helm list | 
Helm Chart 包含 templates、values.yaml,可進行客製化變數化部署。
CI/CD 整合應用
結合 GitLab CI、Jenkins、GitHub Actions 或 Azure Pipelines 可達成:
- 自動建置映像檔並推送至 Docker Registry(如 Docker Hub、Harbor)
 - 利用 
kubectl apply或helm upgrade部署更新 - 整合 webhook 觸發部署流程
 
GitLab CI 範例 .gitlab-ci.yml:
stages:
  - build
  - deploy
build:
  stage: build
  script:
    - docker build -t myapp:latest .
    - docker push myapp:latest
deploy:
  stage: deploy
  script:
    - kubectl apply -f k8s/deployment.yaml
Azure Pipelines 範例 azure-pipelines.yml:
trigger:
  branches:
    include:
      - main
variables:
  imageName: 'myapp'
stages:
  - stage: Build
    jobs:
      - job: BuildAndPush
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: Docker@2
            inputs:
              command: 'buildAndPush'
              repository: '$(imageName)'
              dockerfile: '**/Dockerfile'
              containerRegistry: '$(dockerRegistryServiceConnection)'
  - stage: Deploy
    dependsOn: Build
    jobs:
      - job: DeployToK8s
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: Kubernetes@1
            inputs:
              connectionType: 'KubeConfig'
              kubeconfig: '$(KUBECONFIG)'
              command: apply
              useConfigurationFile: true
              configuration: 'k8s/deployment.yaml'
進階網路與安全性
| 技術 | 說明 | 
|---|---|
| NetworkPolicy | 控制 Pod 間的網路存取,限制來源 IP 或命名空間。 | 
| RBAC | 使用 Role / ClusterRole 與 Binding 控制資源存取權限。 | 
| PodSecurityPolicy / OPA | 定義允許的容器行為(如特權模式、掛載類型等),OPA 是取代 PSP 的策略控制器。 | 
| cert-manager | 自動簽發、續期 TLS 憑證,可搭配 Let's Encrypt 使用。 | 
效能監控與除錯工具
| 工具 | 說明 | 
|---|---|
| Prometheus + Grafana | 收集並視覺化 Kubernetes Metrics。 | 
| k9s | 文字介面工具,快速瀏覽 Pod、Deployment 狀態。 | 
| kubetail | 聚合多個 Pod 的 log 顯示,方便日誌查詢。 | 
| Lens | 圖形介面 Kubernetes 管理工具,支援多叢集切換。 | 
這些工具能協助開發者與運維人員進行實時監控、效能分析與故障排除,提升 Kubernetes 環境的可觀察性與穩定性。