# K8s 基礎 - 架構、kubelet、kubeadm、kubectl 簡介(要獨立成一篇Pod、deployment、HPA) ###### tags: `Kubernetes` 1. [參考連結1](https://ithelp.ithome.com.tw/articles/10218693) 2. [參考連結2](https://ithelp.ithome.com.tw/articles/10235286) # 1. Kubernetes架構 * K8s是一個"集群(Cluster)"的架構,由一群節點(Node)集合而成 * 每個叢集當中會有一個Control Plane 和數個Node > Control Plane在舊版的K8s稱為Master Node > Node以前叫做Slave/Worker Node或更早版本的Minion。 * Control plane * Node ## Kubelet ### pod 管理 * 最基本的管理(創建+操作)最小單位是pod而不是container(無法直接對container操作) * 建議一個pod只有一個container,但一個pod可以有多個container * pod底下共享許多資源,例如:網路空間。pod底下的container可以直接用localhost 加上 port去訪問 * pod 裡的 volume (是一個directory) 也可以 mount 到多個容器裡,實現共享。 * pod 的資源限制(比如 CPU 和 Memory) 也是所有容器共享的 ## kubeadm * 創建cluster比較困難,但使用kubeadm可以使用一條命令就創建一個集群出來(例如: kubeadm init 命令初始化集群、kubeadm join 擴充節點) * 可以根據自己需要安裝各種add-on來擴充集群功能,add-on全部是容器化部署 ## kubectl #### kubectl 是一支用來與 k8s 叢集溝通的二進位 (binary) 工具 * **取得** k8s 各種不同資源資訊 (get: pod, service, ingress, ...) * **取得** k8s 各種不同資源的詳細內容 (describe: pod, service, ingress, ...) * **配置** k8s 運行資源 (create, apply, rollout, ...) * **刪除** k8s 運行資源 (delete) * **取得** log 檔案 (logs) <br/> --- # 2. Pod ### 應該會再整理一個所有指令的 cheat sheet ### 1. 如何創建Pod 可以透過kubectl創建Pod: > 自己的理解: (乾脆直接用apply就好了呀XD,可能還是有差八~) > kubectl apply可以創建 + 修改 > kubectl create只能創建一次 ``` $ kubectl apply -f pod.yaml ## or $ kubectl create -f pod.yaml ``` Pod YAML 範例: ``` $ vim pod.yaml ``` ```y= apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx - image: nginx ``` <br/> ### 2. QoS [參考連結: QoS Classes of K8s Pods](https://medium.com/blutv/qos-classes-of-k8s-pods-722238a61c93) 看文章說考試還蠻常出現的,感覺頗重要的呦~ #### QoS的用途是甚麼呢? - QoS是用來讓 scheduler 決定他的 scheduling 和安排pod的優先級,能夠藉由改變 resource request 和 limit 來設置 QoS #### Kubernetes 創建一個Pod,會assign其中以下一個QoS class 給Pod: * Guaranteed * Burstable * BestEffort #### 1. Guaranteed: * Pod裡容器都要設定limit,並且要設cpu、memory,若有一個容器有設requests,則所有容器都要設定,並且request值要等於limit。 > 如果容器只指定limit不指定require,就會安排與limit同樣大小的資源。 ```yaml= apiVersion: v1 kind: Pod spec: containers: - image: nginx imagePullPolicy: Always name: qos-example resources: limits: cpu: 100m memory: 250mi requests: cpu: 100m memory: 250mi qosClass: Guaranteed ``` 可以用 ```$kubectl describe po nginx``` 來看看Pod的相關資訊 除了直接編寫上面的yaml,也可以用指令產生,範例如下: ``` $ kubectl run nginx --image=nginx --limits cpu=1,memory=200Mi --restart=Never --dry-run=client -o yaml > pod.yaml $ kubectl apply -f pod.yaml ``` #### 2. Burstable * Pod 不滿足 Guaranteed 的QoS class的要求 * Pod 裡至少有一個容器有 memory 或 cpu request #### 例子1: limit value is more than request value ```yaml= apiVersion: v1 kind: Pod spec: containers: - image: nginx imagePullPolicy: Always name: qos-example resources: limits: cpu: 100m memory: 350mi requests: cpu: 100m memory: 250mi qosClass: Burstable ``` #### 例子2: 有兩個容器,其中一個容器有指定memory request為200MB,另一個沒有指定。 ```yaml= apiVersion: v1 kind: Pod metadata: name: qos-demo-4 namespace: qos-example spec: containers: - name: qos-demo-4-ctr-1 image: nginx resources: requests: memory: "200Mi" - name: qos-demo-4-ctr-2 image: redis ``` #### 3. BestEffort * 對於所有的在Pod的容器必須沒有設置memory或cpu的require和limit ```yaml= apiVersion: v1 kind: Pod metadata: name: qos-demo-3 namespace: qos-example spec: containers: - name: qos-demo-3-ctr image: nginx ``` Priority: Guaranteed > Burstable > BestEffort 以上就是QoS的說明拉~ <br/> ### 3. Pod Scaling (這裡介紹 HPA 和 Deployment) 其他細節還蠻多的,改日有空再補寫...怕是沒時間了QQ [Horizontal Pod Autoscaling - 這是API](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/) [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) [鐵人30天](https://ithelp.ithome.com.tw/articles/10197046) 在k8s,HorizontalPodAutoscaler 會自動更新workload的資源(deployment、statefulset),以符合需求,不同的是,vertical scaling是將既有的pod擴增它的資源。 HorizontalPodAutoscaler是由 Kubernetes API resource和controller組成。 電腦資源決定了controller的行為,HorizontalPodAutoscaler controller跑在control plane中,動態調整目標所需的資源(如: Deployment)。 K8s 如何做 Pod Autoscaling ? 答案是: 增加另一個一模一樣的Pod > 備註: 將web app需要的東西,像是主要的web server,和其他輔助的database、使用者輸入、檔案處理和身分驗證等等的,拆成一個個container,包在同一個pod,輔助的容器稱為 **輔助型容器(Helpler Containers)**,這個Pod稱作 **Multi-Container Pod** #### kind=Deployment 我們可利用deploy自動部屬一個容器應用的多份備份,和持續監控備份的數量,在cluster內維持使用者指定的備份數量。 > 當我們說一個Application時,其實指的就是一個Deployment ```y= # helloworld-deployment.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 ``` * **replicas**: 指定要建立多少個相同的Pod,當pod少於此數量,k8s會自動增加pod,反之關掉,若故障也會自動刪除pod,增加另一個新的。 * **selector**: 指定此deployment的規則要適用到哪些pod,可依據pod的label選取。 * **template**: 指定此 deployment所建立pod的設定,重建後的pod以此設定重建,可直接將pod YAML內的metadata和spec貼上就行。 #### kind=HorizontalPodAutoscaler ```y= # helloworld-hpa.yaml apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: helloworld-hpa spec: scaleTargetRef: apiVersion: apps/v1beta2 kind: Deployment name: helloworld-deployment minReplicas: 2 maxReplicas: 5 targetCPUUtilizationPercentage: 50 ``` * **spec.scaleTargetRef** 指定 autoscaling 的對象 * **spec.targetCPUUtilizationPercentage** 以 helloworld-deployment 為例,我們指定 CPU 200m 的資源,代表當該 helloworld-pod CPU 使用率達到 100 m 時,HorizontalPodAutoscaler 就會幫我們新產生一個 Pod。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up