Skip to content

Kubernetes 基礎介紹

Kubernetes 的發展歷程

Kubernetes(簡稱 K8s)最初由 Google 於 2014 年發表,並於同年捐贈給 CNCF(Cloud Native Computing Foundation)。Kubernetes 建立於 Google 長年在內部運營大規模容器部署平台 Borg 的經驗上,成為目前最流行的容器編排平台之一。

Kubernetes 專注於容器的部署、擴展與管理,是現代雲原生應用的重要基石,廣泛被各大企業及雲平台(如 AWS、GCP、Azure)採用。

Kubernetes 核心概念

  1. Pod:Kubernetes 中的最小運行單位,通常封裝一個應用容器(也可以多個),共享相同的網路和存儲資源。
  2. Node:運行 Pod 的工作主機,可為實體機或虛擬機,受控於 Kubernetes Master。
  3. Cluster:由多個 Node 組成的容器集群,是 Kubernetes 的執行環境。
  4. Deployment:一種聲明式的資源物件,用於定義應用的期望狀態,如副本數量、映像版本等,並由 Kubernetes 自動維持。
  5. Service:提供穩定的網路介面給外部或內部存取 Pod,並支援負載平衡。
  6. Namespace:提供資源隔離機制,用於管理大型或多租戶環境。

Kubernetes 安裝方式

Kubernetes 可透過多種方式安裝:

  • Minikube:適合學習用途,單機模擬整個 Kubernetes 環境。
  • Docker Desktop:內建簡易 Kubernetes,可快速啟用。
  • Kubeadm:手動部署 K8s 叢集。
  • 雲端服務:如 GKE、EKS、AKS 提供託管式 Kubernetes 服務。

使用 kubectl 操作 Kubernetes

指令 說明
kubectl get pods 顯示目前所有 Pod 狀態
kubectl describe pod <name> 查看特定 Pod 詳細資訊
kubectl apply -f <file>.yaml 套用 YAML 設定檔建立/更新資源
kubectl delete -f <file>.yaml 刪除 YAML 設定所建立的資源
kubectl logs <pod-name> 查看容器日誌
kubectl exec -it <pod-name> -- /bin/sh 進入 Pod 中的容器進行操作

Nginx Web 應用部署範例(Kubernetes)

本範例將透過四份 YAML 檔案部署一個靜態 HTML 的 Nginx Web 服務。

步驟 1:建立 ConfigMap

檔案:01-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-html
  labels:
    app: nginx

data:
  index.html: |
    <html>
    <head><title>NGINX on Kubernetes</title></head>
    <body>
    <h1>Hello from Kubernetes ConfigMap!</h1>
    </body>
    </html>

步驟 2:建立 Deployment

檔案:02-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      automountServiceAccountToken: false
      containers:
        - name: nginx
          image: nginx:stable-alpine
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "100m"
              memory: "64Mi"
              ephemeral-storage: "32Mi"
            limits:
              cpu: "200m"
              memory: "128Mi"
              ephemeral-storage: "64Mi"
          volumeMounts:
            - name: html-volume
              mountPath: /usr/share/nginx/html
      volumes:
        - name: html-volume
          configMap:
            name: nginx-html

步驟 3:建立 Service

檔案:03-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

步驟 4:建立 Ingress

檔案:04-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 80

部署與測試流程

  • 套用 ConfigMap:

    kubectl apply -f 01-configmap.yaml
    

  • 套用 Deployment:

    kubectl apply -f 02-deployment.yaml
    

  • 套用 Service:

    kubectl apply -f 03-service.yaml
    

  • 套用 Ingress(需已安裝 ingress controller):

    kubectl apply -f 04-ingress.yaml
    

  • 使用 port-forward 測試(若未配置 Ingress DNS):

    kubectl port-forward svc/nginx-service 8080:80
    

於瀏覽器開啟 http://localhost:8080,驗證畫面。

清除資源

kubectl delete -f 04-ingress.yaml
kubectl delete -f 03-service.yaml
kubectl delete -f 02-deployment.yaml
kubectl delete -f 01-configmap.yaml