Skip to content

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 可達成:

  1. 自動建置映像檔並推送至 Docker Registry(如 Docker Hub、Harbor)
  2. 利用 kubectl applyhelm upgrade 部署更新
  3. 整合 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 環境的可觀察性與穩定性。