在學習完docker之後,也很有必要再學習k8s的一些理論和技術。
一、基礎概念
kubernetes(k8s)和docker在容器管理領域具有不同的側重點和優勢。當前docker主要關注單個容器的構建、執行和管理,而k8s則專注於大規模的容器編排和管理。k8s在以下幾個特性中,更具有優勢。
特性1:自動化部署和管理
特性2:服務發現和負載均衡
特性3:自動擴充套件、自愈能力
簡單說,k8s屬於master-worker架構,master節點負責核心排程,管理,worker節點用來執行使用者程式。建議master節點單獨部署(一臺實體伺服器),但可以有多個master node。master node所需的一些元件,kube-apiserver、scheduler、etcd。worker node所需的一些元件,kubelet、kube-proxy、container runtime。
k8s服務參考圖
二、k8s叢集的操作和命令
1、我們使用kubectl,kubectl
是與 Kubernetes 叢集互動的主要命令列工具。其基本語法結構為:
kubectl [command] [TYPE] [NAME] [flags]
2、常見操作命令
叢集相關
# 檢視所有節點 kubectl get nodes # 檢視叢集資訊 kubectl cluster-info
pod:Pod 是 Kubernetes 中的最小可部署單位,代表一組緊密耦合的容器。每個 Pod 包含一個或多個容器,這些容器共享網路和儲存。通常,一個 Pod 執行一個主容器(例如,Web伺服器),以及一些輔助容器(如日誌收集、監控代理等)。
Pod 通常不直接建立,而是透過更高階別的控制器(如 Deployment)來管理。
相關操作:
# 檢視Pod列表 kubectl get pods # 檢視指定名稱空間下的Pod kubectl get pods -n <namespace> # 詳細描述Pod:輸出Pod的詳細資訊,包括事件、狀態、配置資訊等 kubectl describe pod <pod-name> # 檢視Pod的日誌 kubectl logs <pod-name> # 進入Pod的容器 kubectl exec -it <pod-name> -- /bin/bash # 刪除Pod kubectl delete pod <pod-name> --force
service:是一種用於定義一組 Pod 的網路訪問策略的資源物件。它為外部系統或內部元件提供了穩定的訪問入口,即使這些 Pod 的 IP 地址會隨著 Pod 的建立和銷燬而變化。Service 透過將流量分發到符合選擇條件的 Pod 來實現負載均衡。
Kubernetes 支援多種型別的 Service,不同型別的 Service 適用於不同的網路需求:
-
ClusterIP(預設型別):
- 僅在叢集內部可訪問。
- 為 Service 建立一個虛擬 IP(Cluster IP),用於在叢集內部的其他服務間進行通訊。
- 適用於服務之間的內部通訊。
-
NodePort:
- 將服務暴露在每個節點的某個埠上(範圍是 30000-32767),透過
<NodeIP>:<NodePort>
訪問。 - 適用於需要從叢集外部直接訪問服務的情況。
- 將服務暴露在每個節點的某個埠上(範圍是 30000-32767),透過
-
LoadBalancer:
- 在支援的雲環境中(如 AWS、GCP),自動建立一個外部負載均衡器,並將其與 Service 關聯。
- 將流量轉發到 Service 對應的 NodePort 或 ClusterIP。
- 適用於需要自動建立雲提供商的負載均衡器來暴露服務的情況。
-
ExternalName:
- 將服務的 DNS 名稱對映到外部的 DNS 名稱。
- 沒有選擇器,與其他服務型別不同,它不會選擇叢集中的 Pod,而是返回 CNAME 記錄。
- 適用於訪問叢集外部的資源,如資料庫服務。
相關操作:
# 檢視Service列表:列出所有Service及其對應的ClusterIP、外部IP等資訊 kubectl get services # 檢視Service詳細資訊 kubectl describe service <service-name> # 刪除service kubectl delete service <service-name>
deployment:Deployment 是一種用於管理應用程式的 Kubernetes 控制器。它提供宣告式更新機制,使你能夠管理應用的副本數量、更新策略等。Deployment 是管理 Pod 的常用方式,它確保指定數量的 Pod 始終執行,並且可以自動執行滾動更新和回滾操作。
相關操作:
# 建立Deployment:使用指定映象建立一個新的Deployment kubectl create deployment <deployment-name> --image=<image-name> # 檢視Deployment列表 kubectl get deployments # 檢視Deployment詳細資訊 kubectl describe deployment <deployment-name> # 更新Deployment的映象:更新Deployment中容器的映象,會觸發滾動更新 kubectl set image deployment/<deployment-name> <container-name>=<new-image> # 擴充套件或縮減Deployment的Pod副本數 kubectl scale deployment <deployment-name> --replicas=<number> # 編輯Deployment kubectl edit deployment <deployment-name> # 刪除Deployment kubectl delete deployment <deployment-name>
ConfigMap資源:是 Kubernetes 中用於儲存非機密配置資訊的物件。它將配置資訊以鍵值對的形式儲存,可以將這些配置注入到容器中作為環境變數、命令列引數,或掛載為檔案。ConfigMap 允許配置與容器映象分離,使得應用程式更易於配置和管理。
相關操作:
# 建立ConfigMap kubectl create configmap <configmap-name> --from-literal=<key>=<value> # 檢視ConfigMap列表 kubectl get configmaps # 檢視ConfigMap詳細資訊 kubectl describe configmap <configmap-name> # 編輯Configmap kubectl edit configmap <configmap-name>
名稱空間:是 Kubernetes 中用於資源隔離的邏輯分割槽。它允許你在同一個叢集中隔離不同的專案或團隊的資源。每個 Namespace 之間的資源是獨立的,例如 Pod、Service 等,因此可以避免不同應用或團隊之間的衝突。
相關操作:
# 檢視名稱空間列表 kubectl get namespaces # 建立新的名稱空間 kubectl create namespace <namespace-name> # 刪除名稱空間 kubectl delete namespace <namespace-name> # 在指定名稱空間中操作:可以用 -n 標誌指定操作的名稱空間 kubectl get pods -n <namespace-name>
資源監控
# 持續監控pod kubectl get pods -w # 監控特定資源 kubectl top pod