# Kind 簡易說明

## **K8s Workload**

[![image-1735010531186.png](https://bookstack.treemanou.com/uploads/images/gallery/2024-12/scaled-1680-/hwk1XdvpyG7CuWKk-image-1735010531186.png)](https://bookstack.treemanou.com/uploads/images/gallery/2024-12/hwk1XdvpyG7CuWKk-image-1735010531186.png)

[![image-1735010627965.png](https://bookstack.treemanou.com/uploads/images/gallery/2024-12/scaled-1680-/roU8JO1qSZLqreXE-image-1735010627965.png)](https://bookstack.treemanou.com/uploads/images/gallery/2024-12/roU8JO1qSZLqreXE-image-1735010627965.png)

以下是 **DaemonSet**、**StatefulSet**、**ReplicaSet** 和 **Deployment** 的詳細比較：

<table id="bkmrk-%E7%89%B9%E6%80%A7-daemonset-statefu"><thead><tr><th>**特性**</th><th>**DaemonSet**</th><th>**StatefulSet**</th><th>**ReplicaSet**</th><th>**Deployment**</th></tr></thead><tbody><tr><td>**用途**</td><td>確保每個 Node 上運行一個 Pod 副本。</td><td>部署有狀態的應用，每個 Pod 都有固定標識。</td><td>確保指定數量的 Pod 副本運行。</td><td>管理 Pod 和 ReplicaSet，提供滾動更新功能。</td></tr><tr><td>**典型場景**</td><td>日誌收集器、監控代理等需要全節點覆蓋。</td><td>資料庫、分佈式系統等需要穩定標識或存儲的應用。</td><td>確保無狀態應用的高可用性。</td><td>部署和管理無狀態應用，支持版本控制和更新。</td></tr><tr><td>**Pod 名稱**</td><td>名稱可變，與 Node 關聯，無固定格式。</td><td>有固定名稱（如 `db-0`, `db-1`）。</td><td>無固定格式，與 Deployment 類似。</td><td>通常由 Deployment 自動生成，不直接管理 Pod。</td></tr><tr><td>**存儲**</td><td>不涉及持久化存儲，通常為臨時存儲。</td><td>每個 Pod 可關聯專屬持久存儲。</td><td>通常無需存儲，支持臨時存儲。</td><td>通常無需存儲，支持無狀態應用。</td></tr><tr><td>**縮放（副本數）**</td><td>無法指定副本數，與 Node 數量相關。</td><td>支持指定副本數，且保證順序和標識穩定。</td><td>支持指定副本數，所有副本平等。</td><td>支持指定副本數，自動調整和滾動更新。</td></tr><tr><td>**更新方式**</td><td>滾動更新，逐一更新節點上的 Pod。</td><td>滾動更新，有序處理 Pod，確保依賴順序。</td><td>滾動更新，副本數量保持穩定。</td><td>滾動更新，支持回滾和藍綠部署策略。</td></tr><tr><td>**依賴的資源**</td><td>與 Node 關聯，不依賴其他資源。</td><td>通常依賴持久化存儲（如 PVC）。</td><td>通常不依賴其他資源。</td><td>自動創建和管理 ReplicaSet。</td></tr><tr><td>**伸縮性**</td><td>固定與 Node 數量匹配，無法手動調整。</td><td>可靈活擴展，並保證 Pod 的穩定標識。</td><td>手動指定副本數，無狀態，副本之間無區別。</td><td>自動管理副本數，支持水平和垂直擴展。</td></tr><tr><td>**依賴順序**</td><td>Pod 啟動順序無依賴。</td><td>Pod 啟動和刪除有順序，確保依賴關係。</td><td>無順序依賴，隨機啟動和刪除。</td><td>無順序依賴，通常關注應用級別的管理。</td></tr><tr><td>**高可用性**</td><td>和 Node 數量相關，通常與節點數一致。</td><td>通過固定標識和穩定的存儲保證高可用性。</td><td>通過多副本保證高可用性，但不管理應用版本。</td><td>提供高可用性並支持應用升級與版本回滾。</td></tr></tbody></table>

---

### **適用場景總結**

1. **DaemonSet**：
    
    
    - 用於需要在所有 Node 上部署的服務，例如： 
        - 日誌收集器（如 Fluentd）。
        - 監控代理（如 Prometheus Node Exporter）。
        - 網絡插件（如 Calico, Weave）。
2. **StatefulSet**：
    
    
    - 適用於需要穩定標識和存儲的有狀態應用，例如： 
        - 資料庫（如 MySQL, PostgreSQL）。
        - 分布式系統（如 Kafka, ZooKeeper）。
        - 需要保持 Pod 順序的應用。
3. **ReplicaSet**：
    
    
    - 用於確保固定數量的無狀態 Pod 副本運行，例如： 
        - 部署應用的核心部分，但一般由 Deployment 自動管理。
4. **Deployment**：
    
    
    - 最常用於管理無狀態應用，支持滾動更新、版本控制和自動擴展，例如： 
        - Web 應用（如 Nginx, Node.js）。
        - 微服務應用的部署。

這樣的比較有助於釐清這些資源的功能和適用情境，幫助在實際項目中選擇合適的解決方案。

在 Kubernetes 中，`Service` 的 `type` 定義了服務的訪問方式和範圍。以下是 Kubernetes 支持的四種類型及其用途說明：

---

## Service 的四種Type

### [![image-1735011766578.png](https://bookstack.treemanou.com/uploads/images/gallery/2024-12/scaled-1680-/Vf0uxFIwmKlWsrjt-image-1735011766578.png)](https://bookstack.treemanou.com/uploads/images/gallery/2024-12/Vf0uxFIwmKlWsrjt-image-1735011766578.png)

### 1. **ClusterIP (預設類型)**

- **說明**： 
    - 僅限於集群內部的虛擬 IP，用於服務發現和內部通信。
    - 外部無法直接訪問。
- **用途**： 
    - 用於內部微服務之間的通信。
    - 通常搭配 DNS（如 `kube-dns`）進行名稱解析。
- **範例**：

```yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

```

---

### 2. **NodePort**

- **說明**： 
    - 將服務暴露在每個節點的固定端口上（範圍：30000-32767）。
    - 用戶可以通過 `<NodeIP>:<NodePort>` 訪問服務。
- **用途**： 
    - 測試環境中，用於將服務暴露給集群外部的用戶。
    - 生產環境中通常搭配 **Ingress** 或 **LoadBalancer**。
- **範例**：

```yaml
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30007

```

---

### 3. **LoadBalancer**

- **說明**： 
    - 在雲提供商（如 GCP、AWS 或 Azure）中創建外部負載均衡器，並將流量轉發到 Service。
    - 每個 LoadBalancer 類型的 Service 都會自動獲得一個外部 IP。
- **用途**： 
    - 用於公開服務給互聯網，用於生產環境。
    - 支持流量負載均衡。
- **範例**：

```yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

```

---

### 4. **ExternalName**

- **說明**： 
    - 將 Service 名稱映射到外部 DNS 名稱。
    - 不會創建 ClusterIP，也無法進行內部流量轉發。
- **用途**： 
    - 將 Kubernetes 內部服務請求代理到集群外部的服務。
- **範例**：

```yaml
apiVersion: v1
kind: Service
metadata:
  name: externalname-service
spec:
  type: ExternalName
  externalName: external.example.com

```

---

### **服務類型對比**

<table id="bkmrk-%E9%A1%9E%E5%9E%8B-%E6%98%AF%E5%90%A6%E5%B0%8D%E5%A4%96%E6%9A%B4%E9%9C%B2-%E8%A8%AA%E5%95%8F%E6%96%B9%E5%BC%8F-%E5%85%B8%E5%9E%8B%E4%BD%BF%E7%94%A8%E5%A0%B4"><thead><tr><th>**類型**</th><th>**是否對外暴露**</th><th>**訪問方式**</th><th>**典型使用場景**</th></tr></thead><tbody><tr><td>**ClusterIP**</td><td>否</td><td>集群內部通信，使用虛擬 IP</td><td>微服務之間的內部通信。</td></tr><tr><td>**NodePort**</td><td>是</td><td>`<NodeIP>:<NodePort>`</td><td>測試環境或簡單的外部訪問。</td></tr><tr><td>**LoadBalancer**</td><td>是</td><td>自動分配外部 IP</td><td>公開服務到互聯網，支持負載均衡。</td></tr><tr><td>**ExternalName**</td><td>是（間接）</td><td>使用外部 DNS 名稱解析</td><td>將內部服務請求代理到集群外部服務。</td></tr></tbody></table>

---

### 適用場景建議

1. **ClusterIP**：適合內部微服務的互相調用，默認類型。
2. **NodePort**：適合小型測試環境，簡單公開服務。
3. **LoadBalancer**：適合生產環境，需要高可用的負載均衡服務。
4. **ExternalName**：適合需要訪問外部資源但想使用 Kubernetes 內部 DNS 管理的情況。

這些 `type` 結合不同的網絡需求，靈活應對各種應用場景。

---

## YML 的各種 Kind

<table id="bkmrk-kind-%E8%AA%AA%E6%98%8E-%E7%94%A8%E9%80%94-cronjob-%E5%AE%9A" style="width: 809px; height: 687px;"><thead><tr style="height: 29px;"><th style="width: 205px; height: 29px;">**Kind**</th><th style="width: 234px; height: 29px;">**說明**</th><th style="width: 370px; height: 29px;">**用途**</th></tr></thead><tbody><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**Pod**</td><td style="width: 234px; height: 46px;">Kubernetes 中最小的執行單位，包含容器。</td><td style="width: 370px; height: 46px;">部署單個應用程式容器。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**Job**</td><td style="width: 234px; height: 29px;">執行一次性任務，確保成功完成。</td><td style="width: 370px; height: 29px;">運行批處理任務。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**CronJob**</td><td style="width: 234px; height: 29px;">定期執行的任務。</td><td style="width: 370px; height: 29px;">排程任務（如每天備份數據）。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**StatefulSet**</td><td style="width: 234px; height: 29px;">管理有狀態的應用。</td><td style="width: 370px; height: 29px;">部署需固定標識或穩定存儲的 Pod。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**ReplicaSet**</td><td style="width: 234px; height: 29px;">確保指定數量的 Pod 始終運行。</td><td style="width: 370px; height: 29px;">通常由 Deployment 管理，用於維持 Pod 副本數。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**DaemonSet**</td><td style="width: 234px; height: 46px;">確保每個 Node 上運行一個 Pod 副本。</td><td style="width: 370px; height: 46px;">部署監控代理、日誌收集器等。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**Deployment**</td><td style="width: 234px; height: 46px;">管理 Pod 和 ReplicaSet，支持滾動更新。</td><td style="width: 370px; height: 46px;">部署無狀態應用，保持指定數量的 Pod 運行。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**Service**</td><td style="width: 234px; height: 29px;">定義 Pod 的網絡訪問規則。</td><td style="width: 370px; height: 29px;">將外部流量路由到 Pod，提供負載均衡。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**Ingress**</td><td style="width: 234px; height: 29px;">提供 HTTP/HTTPS 路由規則。</td><td style="width: 370px; height: 29px;">公開訪問服務，支持負載均衡和基於域名的路由。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**NodePort** </td><td style="width: 234px; height: 29px;">將外部流量映射到指定節點端口。</td><td style="width: 370px; height: 29px;">將集群外部訪問直接映射到內部 Service，通常為開發測試用途。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**ConfigMap**</td><td style="width: 234px; height: 29px;">存儲非機密配置數據。</td><td style="width: 370px; height: 29px;">將配置注入 Pod（環境變量或掛載文件）。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**Secret**</td><td style="width: 234px; height: 46px;">存儲機密數據（如密碼、API 密鑰）。</td><td style="width: 370px; height: 46px;">安全地將敏感信息注入 Pod。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**PersistentVolume (PV)**</td><td style="width: 234px; height: 29px;">定義持久化存儲。</td><td style="width: 370px; height: 29px;">提供存儲資源，獨立於 Pod 的生命週期。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**PersistentVolumeClaim (PVC)**</td><td style="width: 234px; height: 46px;">申請 PersistentVolume。</td><td style="width: 370px; height: 46px;">Pod 使用 PVC 來請求持久存儲資源。</td></tr><tr style="height: 29px;"><td style="width: 205px; height: 29px;">**Namespace**</td><td style="width: 234px; height: 29px;">將資源分隔成不同的邏輯組。</td><td style="width: 370px; height: 29px;">支持多租戶環境。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**Role 和 ClusterRole**</td><td style="width: 234px; height: 46px;">定義訪問權限。</td><td style="width: 370px; height: 46px;">管控資源的讀寫權限，`Role` 限於 Namespace，`ClusterRole` 全集群。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**RoleBinding 和 ClusterRoleBinding**</td><td style="width: 234px; height: 46px;">綁定訪問權限到用戶。</td><td style="width: 370px; height: 46px;">授權用戶或服務帳號訪問權限。</td></tr><tr style="height: 46px;"><td style="width: 205px; height: 46px;">**HorizontalPodAutoscaler (HPA)**</td><td style="width: 234px; height: 46px;">根據指標自動調整 Pod 副本數量。</td><td style="width: 370px; height: 46px;">提高應用的彈性擴展能力。</td></tr></tbody></table>

---

### 範例 YAML 說明

#### **1. CronJob**

執行每天凌晨 12 點的數據備份：

```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-backup
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: backup-tool:latest
            args:
            - /bin/sh
            - -c
            - "backup-script.sh"
          restartPolicy: OnFailure

```

---

#### **2. DaemonSet**

在每個 Node 上部署日誌收集器：

```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-collector
spec:
  selector:
    matchLabels:
      app: log-collector
  template:
    metadata:
      labels:
        app: log-collector
    spec:
      containers:
      - name: log-collector
        image: log-collector:latest

```

---

#### **3. Deployment**

部署一個無狀態 Web 應用，副本數為 3：

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80

```

---

#### **4. Job**

執行一次性任務：

```yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: one-time-task
spec:
  template:
    spec:
      containers:
      - name: task-runner
        image: busybox
        args:
        - /bin/sh
        - -c
        - "echo Hello, Kubernetes!"
      restartPolicy: OnFailure

```

---

#### **5. StatefulSet**

部署有狀態的數據庫應用：

```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: database
spec:
  serviceName: "database-service"
  replicas: 3
  selector:
    matchLabels:
      app: database
  template:
    metadata:
      labels:
        app: database
    spec:
      containers:
      - name: db
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "password"
        ports:
        - containerPort: 3306

```

---

#### **6. Pod**

部署一個單一容器的應用：

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: single-app
spec:
  containers:
  - name: app
    image: busybox
    args:
    - /bin/sh
    - -c
    - "echo Running a single pod!"

```

#### **1. CronJob**

執行每天凌晨 12 點的數據備份：

```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-backup
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: backup-tool:latest
            args:
            - /bin/sh
            - -c
            - "backup-script.sh"
          restartPolicy: OnFailure

```

---

#### **2. Service**

定義一個 Service，將流量路由到 Pod：

```yaml
apiVersion: v1
kind: Service
metadata:
  name: web-app-service
spec:
  selector:
    app: web-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

```

- **說明**: 這個 Service 將把進入集群內部的流量路由到標籤 `app: web-app` 的 Pod。

###  

#### **NodePort 範例**

以下是一個簡單的 **NodePort** 配置範例，用於將集群外部的請求轉發到內部的 Pod：

```yaml
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80         # ClusterIP 的服務端口
      targetPort: 8080 # Pod 內部容器的端口
      nodePort: 30007  # 節點上的固定外部端口（30000~32767 之間）

```

- **說明**： 
    - **`type: NodePort`**：指定此服務為 NodePort 類型。
    - **`nodePort`**：設置固定的外部端口，供外部用戶通過 `<NodeIP>:30007` 訪問服務。
    - **適用場景**：開發測試環境或簡單的外部訪問，不建議用於生產環境，因為其功能有限且缺乏靈活性。

---