在學(xué)習(xí)本章前杯活,請確保你已經(jīng)掌握了Linux及docker的相關(guān)知識及操作
簡介
Kubernetes(簡稱K8S)是開源的容器集群管理系統(tǒng)狰腌,可以實現(xiàn)容器集群的自動化部署柳畔、自動擴縮容鼎姐、維護等功能哪雕。它既是一款容器編排工具船殉,也是全新的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案。在Docker技術(shù)的基礎(chǔ)上热监,為容器化的應(yīng)用提供部署運行捺弦、資源調(diào)度、服務(wù)發(fā)現(xiàn)和動態(tài)伸縮等功能,提高了大規(guī)模容器集群管理的便捷性列吼。
基本術(shù)語
- pod:的最小調(diào)度單元幽崩,一個pod中可以有多個容器,多個容器共享網(wǎng)絡(luò)和存儲卷
- service:kubernetes抽象出來一個概念寞钥,可以理解為負載均衡器慌申,后端接pod
- cluster ip:service在集群中的ip,相當(dāng)負載均衡器的ip
- ingress: 對集群外部暴露集群內(nèi)部service的一種方式
- nodeport: 對集群外部暴露服務(wù)的第二種方式理郑,跟隨service配置蹄溉,讓集群中的node節(jié)點都監(jiān)聽相應(yīng)的端口,可以通過node節(jié)點訪問集群內(nèi)部service
- loadbalancer: 對集群外部暴露集群內(nèi)部service的一種方式您炉,一般只有在云平臺才能使用
- deployment:封裝了pod/replicaset柒爵,可以實現(xiàn)指定pod副本數(shù)量,滾動更新赚爵,擴容pod棉胀,一般一個應(yīng)用(服務(wù))一個deployment
- statefullSet:相當(dāng)于有狀態(tài)服務(wù)的deployment,重啟后冀膝,主機名和pod的名稱不會改變
- daemonSet:在每個node節(jié)點都需要運行的pod可以使用daemonSet
- job: 一次性任務(wù)
- cronJob:類似于crontab定時執(zhí)行任務(wù)
- dns:kube-dns/coredns提供集群中的dns服務(wù)唁奢,可以解析service到cluster ip,實現(xiàn)服務(wù)發(fā)現(xiàn)
- pv:管理員用來提前創(chuàng)建好的存儲空間窝剖,供用戶申請使用
- pvc:用戶用來申請存儲空間
- storageClass:定義存儲類供pvc使用麻掸,當(dāng)用戶通過pvc并指定storageClass請求pv時kubernetes可以根據(jù)storageClass動態(tài)創(chuàng)建pv
基礎(chǔ)組件介紹
- etcd:etcd是kubernetes集群用來存儲集群相關(guān)數(shù)據(jù)的數(shù)據(jù)倉庫
master節(jié)點組件
master節(jié)點是主集群中的大腦,負責(zé)處理外部的api請求赐纱,分配調(diào)度任務(wù)以及管理容器的副本數(shù)等
kube-apiserver:kubernetes對外的服務(wù)入口脊奋,其他組件通信的紐帶,服務(wù)無狀態(tài)千所,可水平擴容
kube-scheduler:負責(zé)pod的任務(wù)調(diào)度
kube-controller-manager:處理node節(jié)點當(dāng)機情況狂魔、負責(zé)保證pod的副本數(shù)、管理endpoint淫痰,連接service和pod最楷、為新namespace創(chuàng)建默認api token和accounts
node節(jié)點組件
node節(jié)點負責(zé)干活,執(zhí)行master節(jié)點指派的相關(guān)任務(wù)
- kubelet:負責(zé)啟動停止容器待错,保證容器運行籽孙。
- kube-proxy:負責(zé)根據(jù)service生成網(wǎng)絡(luò)規(guī)則,生成路由規(guī)則
為什么需要 Pod
K8S 引入 Pod 主要基于下面兩個目的:
- (1) 可管理性
有些容器天生就是需要緊密聯(lián)系,一起工作火俄。Pod提供了比容器更高層次的抽象,將它們封裝到一個部署單元中犯建。Kubernetes以Pod為最小單位進行調(diào)度、擴展瓜客、共享資源适瓦、管理生命周期竿开。 - (2) 通信和資源共享
Pod中的所有容器使用同一個網(wǎng)絡(luò)namespace,即相同的IP地址和Port空間。它們可以直接用localhost通信玻熙。同樣的,這些容器可以共享存儲,當(dāng)Kubernetes掛載volume到Pod,本質(zhì)上是將volume掛載到 Pod中的每一個容器否彩。
容器五種共享資源
- PID命名空間:Pod中的不同應(yīng)用程序可以看到其他應(yīng)用程序的進程ID。
- 網(wǎng)絡(luò)命名空間:Pod中的多個容器能夠訪問同一個IP和端口范圍嗦随。
- IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信列荔。
- UTS命名空間:Pod中的多個容器共享一個主機名。
- Volumes(共享存儲卷):Pod中的各個容器可以訪問在Pod級別定義的Volumes枚尼。
為什么需要 Service
Deployment 可以部署多個副本,每個 Pod 都有自己的IP,外界如何訪問這些副本呢? 通過 Pod 的IP嗎? 要知道 Pod 很可能會被頻繁地銷毀和重啟,它們的IP會發(fā)生變化,用IP來訪問不太現(xiàn)實贴浙。這個時候,Service 就出現(xiàn)了署恍。
k8s 中 Service 是一個面向微服務(wù)架構(gòu)的設(shè)計崎溃,它從k8s本身解決了容器集群的負載均衡,這些被服務(wù)標(biāo)記的 Pod 一般都是通過label selector選擇的盯质。
五種類型的 Service
ClusterIP
- 創(chuàng)建一個 ClusterIP 來提供集群內(nèi)部訪問
- 默認選項
NodePort
在每個節(jié)點 IP 上暴露一個端口(NodePort)來提供服務(wù)笨奠,集群外部通過這種方式來訪問:<NodeIP>:<NodePort>,同時會創(chuàng)建一個
ClusterIP
- 這種類型使用較多
- 默認暴露的隨機端口范圍:30000-32767
可以通過 nodePort 字段來顯式的指定端口
LoadBalancer
通過和 cloud provider’s load balancer 關(guān)聯(lián)使用唤殴,此時 NodePort and ClusterIP 將自動創(chuàng)建
ExternalName
將 service 名稱映射到一個 externalName (例如一個域名),通過 kube-dns 來提供 DNS 到 CNAME 記錄
附A:排錯技巧
- 查看日志 kubectl logs pod-name
- 查看事件 kubectl describe pod-name
- 查看docker日志
通過kubectl get pod -o wide找到容器運行的node節(jié)點
在node節(jié)點上通過docker ps -a找到出錯的容器
docker logs container-id - 查看kubelet及其他組件日志:journalctl -u kubelet