k8s技術總結(一)

jpx發表於2024-08-12

在學習完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 適用於不同的網路需求:

  1. ClusterIP(預設型別)

    • 僅在叢集內部可訪問。
    • 為 Service 建立一個虛擬 IP(Cluster IP),用於在叢集內部的其他服務間進行通訊。
    • 適用於服務之間的內部通訊。
  2. NodePort

    • 將服務暴露在每個節點的某個埠上(範圍是 30000-32767),透過 <NodeIP>:<NodePort> 訪問。
    • 適用於需要從叢集外部直接訪問服務的情況。
  3. LoadBalancer

    • 在支援的雲環境中(如 AWS、GCP),自動建立一個外部負載均衡器,並將其與 Service 關聯。
    • 將流量轉發到 Service 對應的 NodePort 或 ClusterIP。
    • 適用於需要自動建立雲提供商的負載均衡器來暴露服務的情況。
  4. 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

相關文章