--- 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/)