簡介
Kubernetes(簡稱K8S)是開源的容器集羣管理系統,可以實現容器集羣的自動化部署、自動擴縮容、維護等功能。它既是一款容器編排工具,也是全新的基於容器技術的分佈式架構領先方案。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等功能,提高了大規模容器集羣管理的便捷性。
基本術語
- pod:的最小調度單元,一個pod中可以有多個容器,多個容器共享網絡和存儲卷
- service:kubernetes抽象出來一個概念,可以理解爲負載均衡器,後端接pod
- cluster ip:service在集羣中的ip,相當負載均衡器的ip
- ingress: 對集羣外部暴露集羣內部service的一種方式
- nodeport: 對集羣外部暴露服務的第二種方式,跟隨service配置,讓集羣中的node節點都監聽相應的端口,可以通過node節點訪問集羣內部service
- loadbalancer: 對集羣外部暴露集羣內部service的一種方式,一般只有在雲平臺才能使用
- deployment:封裝了pod/replicaset,可以實現指定pod副本數量,滾動更新,擴容pod,一般一個應用(服務)一個deployment
- statefullSet:相當於有狀態服務的deployment,重啓後,主機名和pod的名稱不會改變
- daemonSet:在每個node節點都需要運行的pod可以使用daemonSet
- job: 一次性任務
- cronJob:類似於crontab定時執行任務
- dns:kube-dns/coredns提供集羣中的dns服務,可以解析service到cluster ip,實現服務發現
- pv:管理員用來提前創建好的存儲空間,供用戶申請使用
- pvc:用戶用來申請存儲空間
- storageClass:定義存儲類供pvc使用,當用戶通過pvc並指定storageClass請求pv時kubernetes可以根據storageClass動態創建pv
基礎組件介紹
K8S系統架構
- etcd:etcd是kubernetes集羣用來存儲集羣相關數據的數據倉庫
master節點組件
master節點是主集羣中的大腦,負責處理外部的api請求,分配調度任務以及管理容器的副本數等
kube-apiserver:kubernetes對外的服務入口,其他組件通信的紐帶,服務無狀態,可水平擴容
kube-scheduler:負責pod的任務調度
kube-controller-manager:處理node節點當機情況、負責保證pod的副本數、管理endpoint,連接service和pod、爲新namespace創建默認api token和accounts
node節點組件
node節點負責幹活,執行master節點指派的相關任務
- kubelet:負責啓動停止容器,保證容器運行。
- kube-proxy:負責根據service生成網絡規則,生成路由規則
爲什麼需要 Pod
K8S 引入 Pod 主要基於下面兩個目的:
- (1) 可管理性
有些容器天生就是需要緊密聯繫,一起工作。Pod提供了比容器更高層次的抽象,將它們封裝到一個部署單元中。Kubernetes以Pod爲最小單位進行調度、擴展、共享資源、管理生命週期。 - (2) 通信和資源共享
Pod中的所有容器使用同一個網絡namespace,即相同的IP地址和Port空間。它們可以直接用localhost通信。同樣的,這些容器可以共享存儲,當Kubernetes掛載volume到Pod,本質上是將volume掛載到 Pod中的每一個容器。
容器五種共享資源
- PID命名空間:Pod中的不同應用程序可以看到其他應用程序的進程ID。
- 網絡命名空間:Pod中的多個容器能夠訪問同一個IP和端口範圍。
- IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信。
- UTS命名空間:Pod中的多個容器共享一個主機名。
- Volumes(共享存儲卷):Pod中的各個容器可以訪問在Pod級別定義的Volumes。
爲什麼需要 Service
Deployment 可以部署多個副本,每個 Pod 都有自己的IP,外界如何訪問這些副本呢? 通過 Pod 的IP嗎? 要知道 Pod 很可能會被頻繁地銷燬和重啓,它們的IP會發生變化,用IP來訪問不太現實。這個時候,Service 就出現了。
k8s 中 Service 是一個面向微服務架構的設計,它從k8s本身解決了容器集羣的負載均衡,這些被服務標記的 Pod 一般都是通過label selector選擇的。
五種類型的 Service
ClusterIP
- 創建一個 ClusterIP 來提供集羣內部訪問
- 默認選項
NodePort
在每個節點 IP 上暴露一個端口(NodePort)來提供服務,集羣外部通過這種方式來訪問:<NodeIP>:<NodePort>,同時會創建一個
ClusterIP
- 這種類型使用較多
- 默認暴露的隨機端口範圍:30000-32767
可以通過 nodePort 字段來顯式的指定端口
LoadBalancer
通過和 cloud provider’s load balancer 關聯使用,此時 NodePort and ClusterIP 將自動創建
ExternalName
將 service 名稱映射到一個 externalName (例如一個域名),通過 kube-dns 來提供 DNS 到 CNAME 記錄
附A:排錯技巧
- 查看日誌 kubectl logs pod-name
- 查看事件 kubectl describe pod-name
- 查看docker日誌
通過kubectl get pod -o wide找到容器運行的node節點
在node節點上通過docker ps -a找到出錯的容器
docker logs container-id - 查看kubelet及其他組件日誌:journalctl -u kubelet