iT邦幫忙

2024 iThome 鐵人賽

DAY 1
1
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 1

Day1: Kubernetes 架構與叢集元件

  • 分享至 

  • xImage
  •  

前言:
筆者本身的工作內容不包含建置或維護Kubernetes,不過程式部署後,不時遇到各項事件需確認,參數的設定也是一知半解,萌生認真認識Kubernetes的念頭,目標本系列文章可抵達Kubernetes冰山第3層,獲取CKA證照範圍的概念,內容以基本知識跟指令操作為主,讓開發者在已建置好的平台上,能有脈絡的釐清資訊

https://ithelp.ithome.com.tw/upload/images/20240801/20168178yH07khcKgT.png

Kubernetes源自古希臘文,意指舵手或飛行員(logo如名是個舵),簡稱為K8s,簡單講是管理容器(containers)的平台,功能像是有自動化部署、自我修復、擴展等,在多主機/容器的大規模服務情境,除了有效確保服務不中斷,也便於掌握狀態等。設計上採用獨立部署服務,有著豐富的彈性及多項設置,伴隨而來是複雜不易上手的缺點,另外,部分功能,像是紀錄、監控、告警等,需透過外部的解決方案處理。(公有雲端平台像是AWS、GCP、Azure提供相關的託管服務,簡化管理)

Kubernetes Architecture

由多個節點(node)組成叢集(cluster),架構組成分為二大部分:一、控制平台「Control Plane(舊稱:Master node)」,以及二、實際工作站(們)「 worker nodes」,另外還有其它的外掛(addon),像是有DNS, WEB UI, Nerwork plugins等

https://ithelp.ithome.com.tw/upload/images/20240805/20168178Jp47pKV9w5.jpg

(註: node為實體的機器或是VM)


☑️ 控制平台 Control plane:負責確保狀態運作正確,確切來說執行了服務管理、規劃、回應API請求、容器排程及監控節點(node)/工作負載(workload)等, 內部細分有4個元件:

  1. kube-apiserver: kubernete採用軸幅模式(hub-and-spoke),api-server為中央樞紐向外nodes輻射溝通,與各個節點進行通訊(HTTPS),像是總機的角色,其餘的控制台元件都不會直接對外,能透過指令工具(kubectl)或API進行互動,溝通為雙向,例如: api-server到kubelet或node到api-server,功能多多:
    • 協調叢集的服務
    • 驗證請求
    • 使用者控制存取,進行身分認證(authentication)及授權(authorization)
    • 更新ETCD內的內容: 從etcd 存/取資料,是唯一會和etcd直接互動的元件
    • kubelet和scheduler透過其進行溝通
    • ...

🗂️ 查看api server的設定

  • kubeadm: cat /etc/kubernetes/manifests/kube-apiserver.yaml
  • 自行建置: cat /etc/systemd/system/kube-apiserver.service
  • 執行中的process: ps -aux | grep kube-apiserver
  1. ETCD cluster: 資訊儲存站,kubernetes使用etcd(念法: et-see-dee)為其首選datastore,用以在分散式架構保持資料一致性,提供共用資料也紀錄整個叢集的狀態,故障時可利用此資訊備份的功能,進行復原作業

    • 分散式的key-value store(noSQL): 每筆資料的結構不同, 各為一個document, 可為json或xml形式
    • 資訊種類: node, pod, config, secret, account等
    • 自動擴展環境下,會有多個etcd server
  2. kube-scheduler: 工作調度站,當新增pod的時候,根據node規則及條件設定,排定application於nodes (實際執行者為kubelet)

    1. 條件篩選(filter node): 資源可行(夠用)、符合規則(Taints, toleration, node selectors/affinity)
    2. 選出最適合的node

🗂️ 查看kube-scheduler的設定

  • kubeadm: cat /etc/kubernetes/manifests/kube-scheduler.yaml
  • 執行中的process: ps -aux | grep kube-scheduler
  1. controller-manager: 像是恆溫系統之於溫度,負責修正各類的元件(remediate situation)以及監控狀態(watch status),確保元件為指定狀態,包含有多種controller,像是node、副本的process管理、數量增減及process指派等,處理方式可為通知api-server,或是透過外部系統處理,以node-controller為例:
    • node定時(5s)發動心跳給node-controller, 超時(40s)的話標記為dead,等候(5m)若還沒復原,則剔除之
      • node monitor period = 5s
      • node monitor grace period = 40s
      • pod eviction timeout = 5s
    • replication-controller: 確保replica set為目標數量,若不足則建立新的pod
    • ServiceAccount-controller
    • Replication-controller
    • ...

🗂️ 查看 kube-controller-manager設定

  • kubeadm: cat /etc/kubernetes/manifests/kube-controller-manager.yaml
  • 自行建置:: cat /etc/systemd/system/kube-controller-manager.service
  • procces: ps -aux | grep kube-controller-manager

☑️ 工作節點 Worker nodes: 服務部署的位置,容器包裝於Pod部署於此,內部細分有3個元件:

  1. kubelet: node的agent,和控制平台互動的唯一元件,與kube-apiserver溝通,根據其指示(來自scheduler)如部署(deploy)、更新(update)或移除(destroy)等,功能如:
    • 註冊節點
    • 接受指示(instructions)
    • 對容器的runtime engine發出請求
    • 建立Pods
    • 監控Nodes & Pods: 定時回報(刷存在感)給kube-apiserver

🗂️ 查看kubelet的設定

  • kubeadm: 不會自動部署,因此無法查
  • 手動建置ps -aux | grep kubelet
  1. kube-proxy: 顧名思義為網路代理服務,負責叢集內外的網路通訊,存在於各個節點的程序,像是部署pod networking(internal virtual network),因此叢集內Pod之間互通,另外也能透過ip table,建立轉導到後台pod的規則等

  2. container runtime: 負責運行容器,依據kubelet的命令管理,支持Docker、containerd及其它符合Container Runtime Interface (CRI)規範的runtime

💡 cluster建置可以白手起家,或透過建置工具kubeadm快速生成,使用Kubeadm的話,系統相關元件,會以pod形式,放在kube-system這個命名空間(namespace);其組態文件預設放在目錄: /etc/kubernetes/manifests/ 底下


下一篇
Day2: Kubernetes與小夥伴們的溝通之道
系列文
今天不學遺傳學,跟著Kubernetes種豌豆7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言