---
# System prepended metadata

title: Kubernetes Navigation bar 導航欄功能介紹
tags: [nycu MIRC104]

---

---
title: Kubernetes Navigation bar 導航欄功能介紹 
tags: nycu MIRC104
---

# Kubernetes Navigation bar 導航欄功能介紹
> [name=蔡秀吉]<br/>[time=Apr 26 2022][color=#F4B400]

# Workloads （工作負載狀況）
- 確定指定數量且正確類型的 pod 正在運行。
>  瀏覽器語言設定，原生 Web UI 導覽會出現一些中文、一些英文 [color=#FF0000]
 
工作負載類型的應用程序
![](https://i.imgur.com/IZ7FSDe.png)

如：Deployments、ReplicaSets、或是你pod數量

![](https://i.imgur.com/qOPZy1Q.png)
- Deployments：你所創建的service (hello-minikube)

![](https://i.imgur.com/CPenHyz.png)
- Pods：你所創建的 pods (hello-minikube)

[參考資料](https://kubernetes.io/zh/docs/tutorials/hello-minikube/)


![](https://i.imgur.com/Y3XXLSQ.png)
- ReplicaSet (副本集)

## Cron Jobs
![](https://i.imgur.com/crJQLVQ.png)
- CronJob 用於執行週期性的動作，例如備份、報告生成等。
- 這邊的每一個任務都配置為周期性重複的（例如：每天/每週/每月一次）
- 可以定義任務開始執行的時間間隔。 

![](https://i.imgur.com/Kbr0N0I.png)

![](https://i.imgur.com/fagVy4p.png)

下面這行指出必須在每個星期五的午夜以及每個月13 號的午夜開始任務：

> 0 0 13 * 5 

[參考資料](https://kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/)

## DaemonSet
![](https://i.imgur.com/2OQkCIx.png)

簡介：
- DaemonSet 確保 (全部或是特定) Nodes 上，一定運行著的一個指定的 Pod。
- 當有 Node 加入 cluster 時，也會為他們新增一個 Pod。
- 當有 Node 從 cluster 移除時，這些 Pod 也會被當垃圾收走啦 (反正就是會被處理掉)。
- 刪除 DaemonSet 將會刪除它創建的所有Pod。

用途：
- cluster 類的儲存空間，像是 ceph 與 glusterd 等。
- 日誌的搜集系統，像是fluent-bit、fluentd與logstash等。
- 監測系統，像是Prometheus與Datadog等。

[參考資料](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/)
[認識DaemonSet](https://ithelp.ithome.com.tw/articles/10251596)

## Deployments
![](https://i.imgur.com/Vn1OV2y.png)
Deployments 顯示你所創建的 service 例：(hello-minikube)
> A Deployment provides declarative updates for Pods and ReplicaSets. (官方解釋)
> 
我的理解：Deployment 讓 ReplicaSets 上線工作，創 pods 是你ReplicaSets 的事。


- 下方為 Deployment 示範例子 
創建了一個 ReplicaSet，負責啟動三個 nginx Pods：
```yaml=
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```
- 創建 metadata 名為 nginx-deployment 
- 定義 Pod 的標籤（app: nginx）

Deployments 的功能：

- 讓 pod 聲明最新狀態，透過更新 Deployments 的 pod 的模板規範，
    - 在受控的速率將 Pod 從舊的 ReplicaSet 移動到新的 ReplicaSet。
- 如果 Deployment 當前狀態不穩定，可以 Rollback 將 PodTemplate 回歸到以前的版本。
    - Deployment 的 rollout history 保存在系統當中，以便你隨時回歸舊版本。
- 擴大 Deployment 的規模以便有更大的負載能力。
    - [Scale up the Deployment to facilitate more load](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#scaling-a-deployment)
- 觀看 Deployment 的狀態 來判定上線過程是否出現停滯。
- 清理較舊的不再需要的ReplicaSet。

[參考資料](https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/)
[宣告式和指令式開發-補充](https://cwpeng.medium.com/%E5%AE%A3%E5%91%8A%E5%BC%8F%E5%92%8C%E6%8C%87%E4%BB%A4%E5%BC%8F%E9%96%8B%E7%99%BC-declarative-and-imperative-paradigm-7e8ed8285953)

## Jobs
![](https://i.imgur.com/z1V3Y9l.png)
> Job 來建立 pod 執行工作的目的，是為了確保工作一定有完成 [color=#FF0000]


- 負責創建一個或多個 Pod，並重複執行 Pods 的執行狀況，直到指定數量的 Pod 被成功創建就停止。
    - 這代表 k8s 會去追蹤 Job pod 執行的狀態，並確保有成功的執行完成，當指定數量(例如: 5 個中的其中 3 個)的 Job pod 完成工作後，這個 Job 就會被註記為 complete。
- 當 Job 被刪除時，所有相關的 pod 也都一併會被刪除。
- Job 可以同時執行多個 pod 來完成多個工作。

[參考資料](https://kubernetes.io/docs/concepts/workloads/controllers/job/)
[K8s Job, CronJob & TTL Controller Overview](https://godleon.github.io/blog/Kubernetes/k8s-Job-Overview/)

## Pods 
![](https://i.imgur.com/xMawgtZ.png)

- Pod 是 K8s 中創建的最小單位。
- 可有一個或多個container，共享存儲和網絡資源。

### Web UI 顯示
![](https://i.imgur.com/8AE20r6.png)
- metadata
    - Pod 名稱
    - 創建時間
    - UID
    
![](https://i.imgur.com/wA6oWgr.png)
- Resource information(資源訊息)
    - Node
    - Status
    - IP
    - QOS Class
    - Restarts
    - Service Account
    
![](https://i.imgur.com/6MDfQoP.png)
  - Conditons (Pod狀態)
      - Initialized：所有的Init 容器 都已成功完成
      - Ready：Pod 可以為請求提供服務，並且應該被添加到對應服務的load balancing pools。
      - ContainersReady：Pod 中所有容器都已就緒。
      - PodScheduled：Pod 已經被調度到某Node。
      
![](https://i.imgur.com/cRDq4X9.png)
  - 什麼副本控制器(ReplicaSet)在控制

![](https://i.imgur.com/3BuLf15.png)
- PVC (當前沒有設置)

![](https://i.imgur.com/90rX3VK.png)
- echoserver

[參考資料](https://kubernetes.io/docs/concepts/workloads/pods/)

## ReplicaSet (副本集)
![](https://i.imgur.com/jEY9g9X.png)

功用：根據需要創建和刪除 Pod 以達到所需數量，達到你所要的目的。
使用你給他的 Pod 模板（yaml檔），ReplicaSet 需要創建新的 Pod 時，
**失效後會重建的概念。**

[參考資料](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)

## ReplicationController
![](https://i.imgur.com/mYqLMuM.png)
> ReplicationController 確保 pod 始終處於可運行狀態。[color=#FF0000]
- ReplicationController 維護的 pod 在失敗、刪除或終止時會自動替換。
- 透過 Pod 模板規範 (PodTemplateSpec) 創建 pod。

這個示例ReplicationController 配置運行nginx Web 服務器的三個副本。
 ```yaml=
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
```
[參考資料](https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/)

## Stateful Sets
![](https://i.imgur.com/99wz62R.png)

> StatefulSet Controller 會為每個 Pod 生成獨一無二的識別資訊，並且這些資訊不會因為 re-schedule 而改變。(Deployment 沒有)

- 一種工作負載API(像 Deployment)。

### 什麼情況會建議使用Stateful Sets
- 需要穩定且唯一的網路識別資訊
- 有狀態顯示的 cluster 應用
- 需要穩定且持久的儲存空間
- 部署時 Pod 需要有順序性地建立

### 限制 Stateful Sets
- pod 儲存配置，需要由 PV Provisioner 請求 storage class 來配置。
- 需要定義一個Headless Service與StatefuleSet進行配對，確保每個Pod都有其獨一無二的network identify。
- 參見這篇 [使用StatefulSet](https://ithelp.ithome.com.tw/articles/10252283)

[參考資料](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)

# Service 
![](https://i.imgur.com/1rOZyNd.png)
- **k8s Service 是一個抽象化的概念，主要定義了邏輯上的一群 Pod 以及如何存取他們的規則。**
    - 邏輯上的一群 Pod：帶著相同標籤、做類似事情的一群 Pod
    - 存取規則：TCP/UDP、Port 等等相關規則
    
> Kubernetes 為 Pods 提供自己的 IP 地址，為一組 Pod 提供相同的 DNS 名， 並且可以在它們之間進行負載均衡。 [color=#F4B400]
![](https://i.imgur.com/8077glI.png)

![](https://i.imgur.com/SSHoLN4.png)
- 資源訊息顯示：
Type：NodePort
Cluster IP 10.108.85.142
- Endpoints:
Host: 172.17.0.3
Port: 8080,TCP

[參考資料1](https://kubernetes.io/zh/docs/concepts/services-networking/service/)
[參考資料2](https://tachingchen.com/tw/blog/kubernetes-service/)



## Ingress
![](https://i.imgur.com/IvB9IlY.png)
 - Ingress 一種 API，能使 Node 對外開放的 port 統一，結合 Ingress Controller 更能在 Kubernetes Cluster 中實現負載平衡 的功能。
- 典型的訪問方式是 HTTP。

### Ingress 介紹
圖像化作用原理，原 Node 都需要有相對應的 port number 去對應相每個 Service 的 port number，如下圖。
![](https://i.imgur.com/tR3L4oy.png)

**Ingress 的出現，我們只需開放一個對外的 port number，Ingress 可以在設定檔中設置不同的路徑，決定要將使用者的請求傳送到哪個 Service 物件。**

![](https://i.imgur.com/IhDXbYg.png)

### Example
 ```yaml=
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80
```
- Ingress 需要指定 apiVersion、kind、 metadata和 spec 字段。 
- Ingress 對象的名稱必須是有效的 DNS 子域名。

[參考資料](https://kubernetes.io/zh/docs/concepts/services-networking/ingress/)
[在 Kubernetes 中實現負載平衡 - Ingress Controller](https://ithelp.ithome.com.tw/articles/10196261)

# Config and Storage 
![](https://i.imgur.com/YAGALxr.png)
[Configuration](https://kubernetes.io/docs/concepts/configuration/)
[Storage](https://kubernetes.io/docs/concepts/storage/)

## ConfigMaps
![](https://i.imgur.com/ZSLTu17.png)

- ConfigMaps API 物件，將儲存非機密性的資料保存到中鍵值對(key-value pairs)中。
    - 鍵值對解釋：一個定義數據集的常量（如下方舉例）
    - gender = male
    - color = green
    - price > 100
- Pods 可使用 ConfigMaps 作為環境變數、指令參數 (command-line arguments)、或是作為 volume 的配置檔案。

[鍵值對解釋](https://experienceleague.adobe.com/docs/audience-manager/user-guide/reference/key-value-pairs-explained.html?lang=en)
[參考資料](https://kubernetes.io/docs/concepts/configuration/configmap/)

## Secrets
![](https://i.imgur.com/dq9hCmu.png)

- Secret 是一種包含少量機密資訊例如密碼、令牌或密鑰的物件。
- 這樣的資訊可能會被放在在 pod 中或 container image 中。
- 使用Secret 表示你不需要在應用程式的 code 中寫出機密資料(confidential data)。

[參考資料](https://kubernetes.io/zh/docs/concepts/configuration/secret/)
## Storage Classes
![](https://i.imgur.com/rKRQgmc.png)
- 一種持久性儲存空間(PV)，但是隱藏後端(PVC)儲存的細節，減輕用戶對於存儲資源細節的關注，另一方面也減輕了管理員人工管理 PV 的工作；由系統自動完成PV 的創建和綁定，實現了動態的資源供應。
- 不同的Classes 呼應(map)到 
    - 服務質量級別(quality-of-service levels)
    - 備份策略(backup policies)
    - 集群管理員確定的任意策略(arbitrary policies determined by the cluster administrators)
- type: storage的種類，gce有提供pd-ssd、pd-standard兩種。

![](https://i.imgur.com/K0AW1Bb.png)

### Example
 ```yaml=
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
volumeBindingMode: Immediate
```
每個 StorageClass 包含字段 provisioner、parameters 和 reclaimPolicy，這些字段會在 StorageClass 需要動態分配 PV 時會使用到。

[參考資料](https://kubernetes.io/docs/concepts/storage/storage-classes/)
[瞭解 Kubernetes Storage
](https://ithelp.ithome.com.tw/articles/10251989)

# Cluster (Cluster Architecture)

- Nodes
- Control Plane-Node Communication
- Controllers
- Cloud Controller Manager
- Container Runtime Interface (CRI)
- Garbage Collection

[參考資料](https://kubernetes.io/docs/concepts/architecture/)
[補充資料](https://ithelp.ithome.com.tw/articles/10195944)

## Namespaces
![](https://i.imgur.com/TJTIx8C.png)
- 會顯示 Cluster 中現存的 Namespaces
    - default: 沒有指名使用其它 Namespaces 的對象所使用的默認名字空間
    - kube-system: Kubernetes 系統創建對象所使用的Namespaces。
    - kube-public: 這個 Namespaces 是自動創建的，所有用戶（包括未經過身份驗證的用戶）都可以讀取它。
    - kube-node-lease: 此 Namespaces 用於與各個 Node 相關的租約（Lease）對象。Node 租期允許kubelet 發送 heartbeats，由此控制面能夠檢測到node有沒有故障。
    
- “命名空間（Namespace）”提供一種機制，將同一 cluster 中的資源劃分為相互隔離的組；同一命名空間內的資源名稱要唯一。
- 命名空間作用區域僅針對帶有名字空間的對象，例如Deployment、Service 等...
對 Cluster 訪問的對象不適用，例如 StorageClass、Node、PersistentVolume 等...

### 何時使用多個 Namespaces
- 用於存在很跨多個用戶的場景。

![](https://i.imgur.com/oXiaLt2.png)

[參考資料](https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/namespaces/)

## Network Policies
![](https://i.imgur.com/wIPEC9j.png)
- 描述一組 Pod 之間是如何被允許互相通信，以及如何與其它網絡Endpoint 進行通信。
- Network Policy 是作用在L3/4 層的，即限制的是對IP 地址和端口的訪問，如果需要對應用層做訪問限制需要使用如 Istio 這類 Service Mesh。

### Example
 ```yaml=
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978
```
- 像所有其它 K8s 配置一樣，NetworkPolicy 需要apiVersion、kind 和 metadata 這三個字段。

[參考資料](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
[NetworkPolicy
](https://jimmysong.io/kubernetes-handbook/concepts/network-policy.html)


## Nodes
![](https://i.imgur.com/krvGTB7.png)
### Web UI 顯示
![](https://i.imgur.com/aZAX3tX.png)
- metadata
    - Pod 名稱
    - 創建時間
    - UID
    
![](https://i.imgur.com/YOZI4Y5.png)

- Resource information(資源訊息)
    - Pod CIDR (IP)
    - addresses: internall IP、Hostname
    
![](https://i.imgur.com/tsQ0fk3.png)
  - System information (系統資訊)
      - Machine ID
      - System UUID
      - Boot ID
      - kernel version
      - OS image: Ubuntu 20.04.2 LTS
      - container runtime version: docker 20.10.12
      - kube-proxy version
      - OS: linux
      - Architecture: amd64
      
![](https://i.imgur.com/VrB3sJm.png)
  - allocation (資源分配)
      - CPU
      - Memory
      - Pods
      - 
![](https://i.imgur.com/eZOxVst.png)
- Node 狀態
    - Ready: 如節點是健康的並已經準備好接收Pod 為True。
False表示節點不健康而且不能接收Pod。
Unknown 表示節點控制器在最近 node-monitor-grace-period 期間（默認40 秒）沒有收到節點的消息。
    - DiskPressure: True表示磁碟可用容量低, 否則為False。
    - MemoryPressure: True表示 Node 記憶體可用量低，否則為False。
    - PIDPressure: True表示 Node 上工作程序過多；否則為False。
    - NetworkUnavailableL: True表示 Node 網絡配置不正確；否則為False。

### Node 其他簡介
- Kubernetes 通過將 container 放入 Pod，以在node上運行來運行workload。
- 節點可能是虛擬機或實體(物理)機，取決於cluster。
- 每個節點由 control plane管理，包含運行所需的 Service 和 pod。
- node 中包含 kubelet、container runtime 和 kube-proxy。


[參考資料](https://kubernetes.io/docs/concepts/architecture/nodes/)

## Persistent Volumes
![](https://i.imgur.com/4rQIkHP.png)

> 欲了解 K8s 中 Persistent Volumes。 建議了解 Volumes。

- （PersistentVolume，PV）是cluster中的儲存物件，可以由管理員事先設置，或者使用（Storage Class）來動態供應分配。
- PV 和普通的 Volume 一樣，也是透過 plugins(插件) 來實現，只是任何使用 PV 的 Pod 擁有獨立的生命週期。
- Persistent Volume Claim(PVC)，就像有儲存空間的Pod，是透過綁定 PV 使用他的儲存空間來實現。

### Example
 ```yaml=
apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

```
- spec.capacity: 宣告該PV的儲存容量
- spec.volumeMode: 所有的 volume plugin 都會自動在 PV 上建立 file system，並且為預設值。若選擇Block，則PV會被以raw block device使用。
- spec.accessModes: 讀寫規則，有ReadWriteOnce、ReadOnlyMany與ReadWriteMany三選項。
- spec.persistentVolumeReclaimPolicy: 回收策略，有Retain, Recycle與Delete三選項。
- spec.storageClassName: PV所設定的類別名稱，只可讓帶有同種類別名稱的PVC做連結使用。

**spec.mountOptions:不同volume type有著不同的mountOptions，詳請參考下方連結**

[參考資料](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)

## Service Accounts
![](https://i.imgur.com/HKmqekU.png)

- Service Accounts 當你訪問 cluster 時（例如，使用kubectl），API 服務器將你的身份驗證為特定的用戶帳戶（當前這通常是admin，除非你的cluster管理員已經定制了你的集群配置）。
- Pod 內的容器中的處理程序也可以與 api 服務器來往。當它們進行身份驗證時，它們被驗證為特定的服務帳戶（例如，default）。

![](https://i.imgur.com/cs4l931.png)

- 創建 Pod 時，如果不指定服務帳號，則會自動為其分配default
- 每個 namespace 都有一個名為 default 的 Service Accounts。

[參考資料](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/)


## RBAC Authorization

是一種根據組織內個人用戶的角色來調節、管理，對電腦或網路資源訪問的方法。

RBAC API 聲明了四種 Kubernetes 對象：
- Role
- ClusterRole
- RoleBinding
- ClusterRoleBinding

您可以使用 kubectl 等工具來修改任何其他 Kubernetes 物件。

### Role 和 ClusterRole
- Role 
    - Role 總是用來在某個名字空間 內設置訪問權限；在你創建Role 時，你必須指定該Role 所屬的名字空間。

![](https://i.imgur.com/ovbUNTJ.png)

![](https://i.imgur.com/ThTNgDb.png)

- ClusterRole 是 non-namespaced 資源，資源具有不同的名稱。
(您可以使用 ClusterRole 來)
    - 定義namespace資源的權限並在單個namespace內授予
    - 定義namespace resource的權限並在所有 namespace 中授予
    - 定義集群範圍資源(cluster-scoped resources)的權限
    
### RoleBinding 和 ClusterRoleBinding
- RoleBinding: 將權限授予給一個用戶或一組用戶。
- ClusterRoleBinding: 授予訪問集群範圍的權限。

![](https://i.imgur.com/1aFiodP.png)

[基於角色的訪問控制（RBAC）](https://jimmysong.io/kubernetes-handbook/concepts/rbac.html)
[參考資料](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)

