--- title: Kubernetes Navigation bar 導航欄功能介紹 tags: nycu MIRC104 --- # Kubernetes Navigation bar 導航欄功能介紹 > [name=蔡秀吉]<br/>[time=Apr 26 2022][color=#F4B400] # Workloads (工作負載狀況) - 確定指定數量且正確類型的 pod 正在運行。 > 瀏覽器語言設定,原生 Web UI 導覽會出現一些中文、一些英文 [color=#FF0000] 工作負載類型的應用程序  如:Deployments、ReplicaSets、或是你pod數量  - Deployments:你所創建的service (hello-minikube)  - Pods:你所創建的 pods (hello-minikube) [參考資料](https://kubernetes.io/zh/docs/tutorials/hello-minikube/)  - ReplicaSet (副本集) ## Cron Jobs  - CronJob 用於執行週期性的動作,例如備份、報告生成等。 - 這邊的每一個任務都配置為周期性重複的(例如:每天/每週/每月一次) - 可以定義任務開始執行的時間間隔。   下面這行指出必須在每個星期五的午夜以及每個月13 號的午夜開始任務: > 0 0 13 * 5 [參考資料](https://kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/) ## DaemonSet  簡介: - 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  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  > 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  - Pod 是 K8s 中創建的最小單位。 - 可有一個或多個container,共享存儲和網絡資源。 ### Web UI 顯示  - metadata - Pod 名稱 - 創建時間 - UID  - Resource information(資源訊息) - Node - Status - IP - QOS Class - Restarts - Service Account  - Conditons (Pod狀態) - Initialized:所有的Init 容器 都已成功完成 - Ready:Pod 可以為請求提供服務,並且應該被添加到對應服務的load balancing pools。 - ContainersReady:Pod 中所有容器都已就緒。 - PodScheduled:Pod 已經被調度到某Node。  - 什麼副本控制器(ReplicaSet)在控制  - PVC (當前沒有設置)  - echoserver [參考資料](https://kubernetes.io/docs/concepts/workloads/pods/) ## ReplicaSet (副本集)  功用:根據需要創建和刪除 Pod 以達到所需數量,達到你所要的目的。 使用你給他的 Pod 模板(yaml檔),ReplicaSet 需要創建新的 Pod 時, **失效後會重建的概念。** [參考資料](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/) ## ReplicationController  > 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  > 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  - **k8s Service 是一個抽象化的概念,主要定義了邏輯上的一群 Pod 以及如何存取他們的規則。** - 邏輯上的一群 Pod:帶著相同標籤、做類似事情的一群 Pod - 存取規則:TCP/UDP、Port 等等相關規則 > Kubernetes 為 Pods 提供自己的 IP 地址,為一組 Pod 提供相同的 DNS 名, 並且可以在它們之間進行負載均衡。 [color=#F4B400]   - 資源訊息顯示: 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  - Ingress 一種 API,能使 Node 對外開放的 port 統一,結合 Ingress Controller 更能在 Kubernetes Cluster 中實現負載平衡 的功能。 - 典型的訪問方式是 HTTP。 ### Ingress 介紹 圖像化作用原理,原 Node 都需要有相對應的 port number 去對應相每個 Service 的 port number,如下圖。  **Ingress 的出現,我們只需開放一個對外的 port number,Ingress 可以在設定檔中設置不同的路徑,決定要將使用者的請求傳送到哪個 Service 物件。**  ### 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  [Configuration](https://kubernetes.io/docs/concepts/configuration/) [Storage](https://kubernetes.io/docs/concepts/storage/) ## ConfigMaps  - 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  - Secret 是一種包含少量機密資訊例如密碼、令牌或密鑰的物件。 - 這樣的資訊可能會被放在在 pod 中或 container image 中。 - 使用Secret 表示你不需要在應用程式的 code 中寫出機密資料(confidential data)。 [參考資料](https://kubernetes.io/zh/docs/concepts/configuration/secret/) ## Storage Classes  - 一種持久性儲存空間(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兩種。  ### 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  - 會顯示 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://kubernetes.io/zh/docs/concepts/overview/working-with-objects/namespaces/) ## Network Policies  - 描述一組 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  ### Web UI 顯示  - metadata - Pod 名稱 - 創建時間 - UID  - Resource information(資源訊息) - Pod CIDR (IP) - addresses: internall IP、Hostname  - 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  - allocation (資源分配) - CPU - Memory - Pods -  - 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  > 欲了解 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  - Service Accounts 當你訪問 cluster 時(例如,使用kubectl),API 服務器將你的身份驗證為特定的用戶帳戶(當前這通常是admin,除非你的cluster管理員已經定制了你的集群配置)。 - Pod 內的容器中的處理程序也可以與 api 服務器來往。當它們進行身份驗證時,它們被驗證為特定的服務帳戶(例如,default)。  - 創建 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 所屬的名字空間。   - ClusterRole 是 non-namespaced 資源,資源具有不同的名稱。 (您可以使用 ClusterRole 來) - 定義namespace資源的權限並在單個namespace內授予 - 定義namespace resource的權限並在所有 namespace 中授予 - 定義集群範圍資源(cluster-scoped resources)的權限 ### RoleBinding 和 ClusterRoleBinding - RoleBinding: 將權限授予給一個用戶或一組用戶。 - ClusterRoleBinding: 授予訪問集群範圍的權限。  [基於角色的訪問控制(RBAC)](https://jimmysong.io/kubernetes-handbook/concepts/rbac.html) [參考資料](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.