正文 周五寫了一整天學海計劃,周六跟了一天的編曲教程,今天則是把第三章剩下的教程跟完。最後,迴旋曲寫是寫出來了,就是把自己聽笑了。寫得實在太爛了。 昨天晚上買了回來的機票。9 月 10 號一早。該說不說機票是真的貴啊…… 同時,我發現我過去的機票,執飛飛機是波音 737-800…… 我怎麼才發現。我 ...
在學習完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