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 環境的可觀察性與穩定性。