Kubernetes (k8s) 基礎入門

下面的內容是基於你已經瞭解了 Docker 容器的前提下的,如果還不瞭解什麼是容器,可以先看看之前的文章

https://www.ryanzoe.top/category/docker/

k8s 是什麼

Kubernetes 也稱爲 K8s,是用於自動部署、擴縮和管理容器化應用程序的開源系統。Google 在 2014 年開源了 Kubernetes 項目。

在生產環境中, 你需要管理運行着應用程序的容器,並確保服務不會下線。 例如,如果一個容器發生故障,則你需要啓動另一個容器。 如果此行爲交由給系統處理,是不是會更容易一些?這就是 Kubernetes 要來做的事情! Kubernetes 爲你提供了一個可彈性運行分佈式系統的框架。 Kubernetes 會滿足你的擴展要求、故障轉移你的應用、提供部署模式等。

Kubernetes 爲你提供:

  1. 服務發現和負載均衡
  2. 存儲編排
  3. 自動部署和回滾
  4. 自動完成裝箱計算
  5. 自我修復
  6. 密鑰與配置管理
  7. 批處理執行
  8. 水平擴縮 
  9. IPv4/IPv6 雙棧 
  10. 爲可擴展性設計 

集羣架構

集羣主要分爲兩部分,Control Plane 和 Node 節點,Control Plane 負責控制和管理各個 Node,Node 是實際的工作節點,可以是裸機服務器、虛擬機或雲服務器等,負責實際運行服務,多個服務共享一臺 Node 上的資源

etcd

etcd是一個分佈式鍵值存儲系統,用於存儲整個集羣的狀態信息,包括節點、Pods、配置、secrets、賬戶權限、角色、角色綁定和其他重要的元數據。Kubernetes的控制平面組件,如API服務器、調度器和控制器管理器,都依賴於etcd來保持集羣狀態的一致性。

API Server

API Server(kube-apiserver)是集羣的中心管理實體,它提供了Kubernetes API的實現。API Server充當了集羣內部各種組件以及外部用戶與集羣交互的接口。

由於API Server是與Kubernetes集羣交互的主要入口點,因此它通常配置有適當的安全措施,如TLS加密、API速率限制和審計日誌,以確保集羣的安全性和穩定性。

Scheduler

Scheduler(調度器)是控制平面的一個關鍵組件,負責將Pods(容器的集合)分配到集羣中的節點上。Scheduler的主要任務是根據多種調度策略和約束條件,爲新創建的Pods選擇最合適的節點,以確保集羣資源的有效利用和Pods的高可用性。

Kubernetes允許自定義調度策略,並且可以運行多個調度器以滿足不同類型的工作負載需求。此外,還可以使用第三方調度器或開發自定義調度器插件來擴展調度功能。

Controller Manager

Controller Manager是一個控制平面組件,它負責運行各種控制器進程。這些控制器是後臺進程,它們負責監視集羣的狀態,並確保當前狀態與期望狀態一致。如果當前狀態與期望狀態不一致,控制器會採取行動來調整狀態,以達到期望狀態。

Controller Manager具體負責以下幾個方面的任務:

  1. 監控&維護集羣狀態
  2. 自動修復
  3. 管理資源的生命週期
  4. 調度輔助

Controller Manager的設計允許它靈活地擴展和引入新的控制器,而無需修改核心代碼。這種模塊化的設計使得Kubernetes能夠適應不斷變化的需求和工作負載。在高級別上,Controller Manager的作用是持續地將集羣的實際狀態推向期望狀態,這是Kubernetes自動化管理的核心。

kubelet

是Kubernetes集羣中每個節點上的主要“節點代理”,它負責維護和管理該節點上的容器。Kubelet的工作是確保容器都按照PodSpec(Pod的規格說明)運行。每個Kubernetes節點上都運行着一個Kubelet進程,它是節點自動化的關鍵組件。

Kubelet通過與API Server的通信來接收PodSpecs,並根據這些規格來管理本地節點上的容器。此外,Kubelet還會定期向API Server發送心跳,以表明節點的健康狀態。

  1. Pod生命週期管理
  2. 資源監控
  3. 容器健康檢查
  4. 報告節點狀態
  5. 管理容器的生命週期
  6. 管理存儲資源
  7. 收集和管理容器日誌

Container runtime

容器運行時(Container Runtime)是負責運行容器的軟件。在Kubernetes集羣中,容器運行時是節點上的關鍵組件,它負責拉取容器鏡像、創建容器、執行容器以及管理容器的生命週期。它爲Kubernetes提供了底層技術,使得Kubernetes能夠管理和編排容器化應用程序。

Kubernetes支持多種容器運行時,包括:Docker、CRI-O等

容器運行時的主要職責包括:

  1. 鏡像管理
  2. 容器啓動和運行
  3. 生命週期管理
  4. 資源管理
  5. 健康
  6. 日誌管理

kube-proxy

kube-proxy 是 Kubernetes 網絡的核心部分,它確保了集羣內服務的高可用性和可擴展性。通過kube-proxy,Kubernetes 能夠實現複雜的服務發現和負載均衡策略,而無需在Pods中運行額外的網絡代理。

  1. 服務發現
  2. 維護網絡規則
  3. 負載均衡
  4. 網絡代理

ingress

Ingress 是 Kubernetes 中的一個 API 對象,它管理着外部到集羣內服務的訪問規則。Ingress 充當反向代理,將進入的 HTTP 和 HTTPS 流量路由到集羣內的多個服務。它允許你將不同的外部主機名和路徑映射到不同的服務上,從而實現虛擬託管和基於路徑的路由。

 

kubectl

kubectl 是 Kubernetes 集羣的命令行工具,它允許用戶與 Kubernetes 集羣進行交互。使用 kubectl,你可以部署應用程序、檢查和管理集羣資源以及查看日誌等。kubectl 通過與 Kubernetes API Server 通信來執行各種操作。

持聲明式和命令式兩種操作方式:

  • 聲明式(Declarative):用戶提供包含資源狀態的 YAML 或 JSON 文件,使用 kubectl apply 命令來創建或更新資源。
  • 命令式(Imperative):用戶直接在命令行中指定操作和資源,如 kubectl createkubectl runkubectl expose 等。

核心概念

節點(Node)

通過將容器放入在節點(Node)上運行的 Pod 中,來執行你的工作負載。 節點可以是一個虛擬機或者物理機器,取決於所在的集羣配置。 每個節點包含運行 Pod 所需的服務,這些節點由Control Plane負責管理。

通常集羣中會有若干個節點,節點上的組件包括 kubelet、 容器運行時以及 kube-proxy。

添加節點的方式主要有兩種:

  1. 節點上的 kubelet 向控制面執行自注冊
  2. 手動添加一個 Node 對象

在你創建了 Node 對象或者節點上的 kubelet 執行了自注冊操作之後,控制面會檢查新的 Node 對象是否合法。 例如,如果你嘗試使用下面的 JSON 對象來創建 Node 對象:

{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

Kubernetes 會在內部創建一個 Node 對象作爲節點的表示。Kubernetes 檢查 kubelet 向 API 服務器註冊節點時使用的 metadata.name 字段是否匹配。 如果節點是健康的(即所有必要的服務都在運行中),則該節點可以用來運行 Pod。 否則,直到該節點變爲健康之前,所有的集羣活動都會忽略該節點。

Pod

Pod是最小的可部署的計算單元,它代表了集羣中的一個運行過程。一個Pod通常包含一個或多個容器(例如Docker容器),這些容器共享存儲、網絡和運行配置。Pod中的容器總是在同一個節點上一起調度,並且在同一個上下文中運行。

Pod 也被視爲短暫的,這意味着它們被設計爲易於創建、銷燬和替換。Kubernetes 推薦使用控制器(如 Deployments 或 DaemonSets)來管理 Pods 的生命週期,而不是直接管理單個 Pods。控制器可以確保應用程序的期望狀態被維護,例如在 Pod 失敗時自動替換它。

Deployments

Deployment是一個高級的API對象,它幫助你聲明性地管理Pod和ReplicaSet(Pod的副本集)。Deployment允許你定義應用的期望狀態,Kubernetes系統負責將實際狀態改變爲期望狀態。你可以使用Deployment來創建新的資源,或者替換現有的資源,例如在升級或回滾應用時。

通常會將Deployment與Service一起使用,Service爲Pod提供一個穩定的網絡接口,而Deployment確保Pod的數量和配置是正確的。這樣,即使在更新和故障恢復期間,應用也可以持續對外提供服務。

服務(Service)

在 Kubernetes 中,Service 是一種抽象,它定義了一種訪問 Pod 的方式,無論這些 Pod 如何變化,Service 都保持不變。Service 使得 Pod 可以被外部世界發現和訪問,同時 Service 還支持負載均衡,可以分發網絡流量到多個 Pod。

Namespaces

命名空間(Namespaces)是一種將集羣資源劃分爲多個獨立的邏輯分區的機制。命名空間允許你在同一個物理集羣中運行多個組織或應用程序的資源,而這些資源彼此隔離,不會互相干擾。

Kubernetes提供了幾個默認的命名空間:

  • default:如果你不指定命名空間,資源默認會被創建在這個命名空間中。
  • kube-system:Kubernetes系統創建的資源所在的命名空間,這些資源是Kubernetes集羣運行所必需的。
  • kube-public:這個命名空間是自動創建的,它是公開的,所有用戶(甚至是未經認證的用戶)都可以訪問。
  • kube-node-lease:這個命名空間包含每個節點的租約對象,用於確定節點的可用性。

ConfigMaps

ConfigMap是一種API資源,它用於將非機密性的配置數據存儲爲鍵值對。這些數據可以是配置文件、命令行參數或其他配置項。ConfigMap允許你將配置與容器鏡像分離,從而使得應用程序的配置更加靈活和可移植。

ConfigMap的主要用途包括:

  1. 配置解耦:將配置信息從應用代碼中分離出來,使得應用更容易移植和配置。
  2. 環境配置:爲不同的環境(如開發、測試和生產)提供不同的配置,而無需修改應用代碼。
  3. 配置共享:在多個Pod或容器之間共享配置信息。
  4. 動態配置:在不重啓容器的情況下更新配置信息。

ConfigMap可以以多種方式使用:

  • 環境變量:將ConfigMap中的鍵值對作爲環境變量注入到Pod中。
  • 命令行參數:在啓動容器時,使用ConfigMap中的數據作爲命令行參數。
  • 配置文件:將ConfigMap作爲文件或卷掛載到Pod中,容器可以讀取這些文件中的配置數據。
  • Pod命令和參數:使用ConfigMap中的數據來設置Pod規格中的命令和參數。

創建ConfigMap的方法通常有兩種:

  1. 命令行:使用kubectl create configmap命令,可以直接從命令行參數或從文件中創建ConfigMap。
  2. 配置文件:編寫一個ConfigMap的YAML或JSON配置文件,然後使用kubectl apply命令來創建它。

ConfigMap是Kubernetes中用於管理配置數據的有用工具,但它不應該用於敏感信息的存儲,對於敏感信息,應該使用Secrets。

Persistent Volumes

持久卷(Persistent Volumes,簡稱PV)是一種由管理員預先配置的存儲,它提供了一種與Pod生命週期無關的存儲解決方案。PV是集羣中的資源,就像節點是集羣中的資源一樣。PV允許用戶存儲數據,即使容器停止運行,數據也不會丟失。

PV是一種抽象層,它封裝了底層的存儲細節,比如NFS、iSCSI或雲提供商的存儲系統(如AWS的EBS、Google Cloud的Persistent Disk或Azure的Disk Storage)。管理員可以預先創建一系列的PV,或者配置動態供應(Dynamic Provisioning),後者允許自動創建PV以滿足用戶的PersistentVolumeClaim(PVC)請求。

通過創建PersistentVolumeClaim(PVC)來請求存儲資源。PVC指定了存儲的大小、訪問模式和可能的StorageClass。Kubernetes會匹配一個合適的PV給PVC,或者通過動態供應創建一個新的PV來滿足PVC的要求。

一旦PVC與PV綁定,PVC就可以像使用本地節點存儲一樣在Pod中使用。Pods通過在其規格中引用PVC來使用持久存儲,而不是直接引用PV。

持久卷提供了一種在Kubernetes中使用持久存儲的標準化方式,使得應用程序可以輕鬆地遷移到不同的環境和雲提供商,而無需修改對存儲的引用。

基本操作

接下會演示如何創建、更新、刪除資源,查看日誌,調試 Pods 等一些基本操作

 

安裝 k8s 環境

本地開發環境

  1. Minikube: Minikube是一個輕量級的Kubernetes實現,它創建了一個虛擬機,並在這個虛擬機上部署一個簡單的集羣。Minikube適合用於學習和開發目的。
    • 安裝Minikube:Minikube安裝指南
    • 啓動Minikube集羣:minikube start
  2. Kind (Kubernetes IN Docker): Kind使用Docker容器作爲Kubernetes集羣的節點。它主要用於測試Kubernetes本身,但也適合開發和CI環境。
    • 安裝Kind:Kind安裝指南
    • 創建一個Kind集羣:kind create cluster
  3. Docker Desktop: Docker Desktop的邊緣版支持一鍵啓用Kubernetes集羣。
    • 安裝Docker Desktop:Docker Desktop安裝指南
    • 在Docker Desktop設置中啓用Kubernetes。

雲服務

許多雲服務提供商提供了託管的Kubernetes服務,這些服務簡化了集羣的創建和管理過程。

  1. Google Kubernetes Engine (GKE)GKE快速入門
  2. Amazon Elastic Kubernetes Service (EKS)EKS入門
  3. 騰訊雲容器服務 (TKE)TKE 入門
  4. 阿里雲容器服務(ACK)ACK 入門

對於初學者和開發者來說,Minikube和Kind是快速開始的好選擇。對於生產環境,託管服務或使用kubeadm、Kubespray等工具在自己的服務器上搭建可能更合適。

基礎操作

  1. 查看集羣中的所有 Podkubectl get pods
  2. 查看特定命名空間中的所有 Podkubectl get pods --namespace=<namespace-name>
  3. 查看 Pod 的詳細信息kubectl describe pod <pod-name>
  4. 查看 Pod 的日誌kubectl logs <pod-name>
  5. 在集羣中創建一個新的 Deploymentkubectl apply -f <deployment-file.yaml>這裏 <deployment-file.yaml> 是包含 Deployment 定義的 YAML 文件。
  6. 刪除一個 Deploymentkubectl delete deployment <deployment-name>
  7. 擴展 Deployment 中的 Pod 數量kubectl scale deployment <deployment-name> --replicas=<number-of-replica>
  8. 查看集羣中的所有 Servicekubectl get svc
  9. 創建一個新的 Servicekubectl apply -f <service-file.yaml>這裏 <service-file.yaml> 是包含 Service 定義的 YAML 文件。
  10. 刪除一個 Servicekubectl delete svc <service-name>
  11. 查看集羣中的所有 Namespacekubectl get namespaces
  12. 創建一個新的 Namespacekubectl create namespace <namespace-name>
  13. 刪除一個 Namespacekubectl delete namespace <namespace-name>
  14. 將 Pod 從一個節點調度到另一個節點kubectl cordon <node-name>
  15. 取消節點的調度kubectl uncordon <node-name>
  16. 查看集羣的狀態kubectl cluster-info
  17. 獲取當前上下文信息kubectl config current-context
  18. 切換到不同的 Kubernetes 集羣kubectl config use-context <context-name>
  19. 查看集羣中的 Persistent Volumeskubectl get pv
  20. 查看集羣中的 Persistent Volume Claims:複製kubectl get pvc

網絡

  1. Pod之間的通信:集羣內的每個Pod都應該能夠與其他Pod通信,無論它們位於哪個節點上。
  2. 節點之間的通信:集羣內的節點應該能夠相互通信,以便Pods能夠跨節點通信。
  3. Pod與服務之間的通信:Pods應該能夠通過服務發現機制訪問服務,服務可以作爲負載均衡器分發流量到後端的Pods。
  4. 外部訪問:應該能夠從集羣外部訪問集羣內的服務。

安全特性

Kubernetes提供了多種安全特性來保護集羣和管理訪問控制,這些特性可以分爲幾個主要領域:

  1. 認證(Authentication)
    • 用戶賬號和服務賬號:Kubernetes區分用戶賬號(供人使用)和服務賬號(供在Pods中運行的應用程序使用)。
    • 證書認證:使用客戶端證書進行用戶認證是Kubernetes支持的一種方式。
    • 靜態令牌文件:通過配置文件提供的靜態Bearer令牌。
    • OpenID Connect Tokens:支持使用OIDC(OpenID Connect)進行身份驗證。
    • Webhook Token Authentication:使用HTTP回調(webhook)來進行身份驗證。
  2. 授權(Authorization)
    • RBAC(Role-Based Access Control):基於角色的訪問控制,允許管理員通過角色來定義用戶和服務賬號的權限。
    • ABAC(Attribute-Based Access Control):基於屬性的訪問控制,可以定義複雜的策略。
    • Node Authorization:一個特殊的授權模式,用於控制節點可以訪問的API資源。
    • Webhook Authorization:使用HTTP回調(webhook)來進行授權決策。
  3. 准入控制(Admission Control)
    • Admission Controllers:在資源請求到達API服務器,但在對象被持久化之前,准入控制器可以修改或拒絕請求。
    • Pod Security Policies:定義一組條件,Pods必須在這些條件下運行,否則會被拒絕創建。
  4. 網絡策略(Network Policies)
    • 允許管理員控制Pod之間的通信規則,限制哪些Pod可以相互通信。
  5. 祕密管理(Secret Management)
    • Secrets:用於存儲和管理敏感信息,如密碼、OAuth令牌和SSH密鑰。
    • 加密配置數據:在etcd中存儲時,可以對Secrets進行加密。
  6. Pod安全標準(Pod Security Standards)
    • 一組定義了Pod應該如何安全運行的標準。
  7. TLS
    • Kubernetes各組件之間的通信可以通過TLS進行加密。
  8. 審計日誌(Audit Logging)
    • 記錄API服務器接收到的每個請求的詳細信息,以便進行安全審計。
  9. 容器安全
    • 容器運行時安全:確保容器運行時(如containerd、CRI-O)遵循最佳安全實踐。
    • 鏡像安全:使用鏡像簽名、鏡像掃描來確保容器鏡像的安全。
  10. API服務器安全
    • API速率限制:限制對API服務器的請求速率,以防止拒絕服務攻擊。
    • API請求大小限制:限制請求的大小,以防止拒絕服務攻擊。

其他

官方文檔:

https://kubernetes.io/zh-cn/

https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/

 

原文地址:https://www.ryanzoe.top/k8s/kubernetes-k8s-%e5%9f%ba%e7%a1%80%e5%85%a5%e9%97%a8/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章