K8S是一個容器編排工具,其實也是管理應用的全生命週期的一個工具。從建立應用,應用的部署,應用提供服務,擴容收縮應用,應用更新都很是的方便。並且能夠作到故障自愈,例如一個服務器掛了,能夠自動將這個服務器上的應用調度到另一個主機上運行,無需人工干預。node
k8s的全生命週期管理:在k8s進行管理應用的時候,基本步驟是:建立集羣,部署應用,發佈應用,擴展應用,更新應用。mysql
k8s集羣: k8s在物理上進行劃分的時候,劃分了兩種類型的主機,一個是master節點:主要用來調度,控制集羣的資源等,另外是node節點:主要用來運行容器的節點,也就是運行服務的節點。nginx
其實集羣都差很少,master用來控制,存儲各類元數據,node節點是一個工做節點,真正來幹活的。node節點定時與master進行通信,經過kubectl進程進行彙報信息。git
建立集羣的目的是爲了提供服務,讓應用程序可以在集羣上運行。github
有了image以後,一條指令就能運行一個應用。因此在開發完應用以後,須要程序打包成image,而後放到registry中,而後可以運行應用了。sql
kubectl run key --image=nginx:1.79 --port=80api
kubectl get deployments/kel服務器
在完成應用部署以後,就能夠看到應用的名稱,指望狀態是運行一個pod,當前有一個pod,活動的也是一個。網絡
那麼什麼是pod呢? 在k8s裏面,集羣調度的最小單元就是一個pod,一個pod能夠是一個容器,也能夠是多個容器,例如你使用一個程序,其中使用了nginx,使用了mysql,使用了jetty,那麼能夠將這三個使用在同一個pod中,對他們提供統一的調配能力,一個pod只能運行在一個主機上,而一個主機能夠運行多個pod。負載均衡
爲何要使用pod,爲何不能直接使用容器呢?使用pod至關於一個邏輯主機,還記得建立一個VM,在VM上運行幾個進程麼,道理是同樣的。pod的存在主要是讓幾個緊密連接的幾個容器直接共享,例如ip地址,共享存儲信息。若是直接調度容器的話,那麼幾個容器可能運行在不一樣的主機上,這樣就增長了系統的複雜性。
發佈應用
發佈應用就是爲對外提供服務,可能會有人提出疑問,我都運行了服務爲什還不能提供服務,這是由於在集羣中,建立的IP地址等資源,只有在同一個集羣中才能訪問,每一個pod都會有惟一的ip地址。當有多個pod提供相同的服務的時候,就須要有負載均衡的能力。從而這裏涉及到的一個概念就是service,專門用來提供服務。
基於pod建立一個service:
kubectl expose deployment kel --type="NodePort" --port=80
kubectl get services/kel
服務主要用來提供對外訪問的接口,服務能夠關聯一組pod,這些pod的ip地址各不相同。而service至關於一個負載均衡的vip,用來指向各個pod。當pod的ip地址發生變化的時候,也能作到自動化負載均衡,在關聯的時候,service與pod直接主要經過label來關聯,也就是標籤(-l表示label)
kubectl get services -l run=kel
kubectl get pods -l run=kel
kubectl describe service/kel
容器擴容:
在業務上線以後,怎樣進行動態的擴容和收縮呢? 只要有一個pod,那麼就能夠產生無數個pod。這樣就具有了橫行擴展的能力
kubectl scale deployments/kel --replicas=3
應用更新:
有新版本了,須要發佈。滾動更新,根據新的image建立一個pod,分配各類資源。而後自動負載均衡,刪除老的pod,而後繼續更新,不會中斷服務。
kubectl set image deployments/kel kel=nginx:1.8
滾動更新:根據新的image建立一個pod,分配各類資源,而後自動負載均衡,刪除老的pod,而後繼續更新。不會出現中斷服務。
kubectl rollout undo deployments/kel
DashBoard
1.建立dashboard服務
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
2. 生成登錄token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
3. 啓動API Server
kubectl proxy
4.訪問dashboard 本地訪問URL
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default
基於k8s部署的應用如何訪問:
首先了解kubernate 網絡模型設計的基礎原則:每一個pod擁有一個獨立的ip地址,而且假定全部的pod都在一個直接連通的,扁平的網絡空間中。
1.集羣內部訪問:
1.1 經過pod的ip訪問 這種方式是不可靠的,當pod重啓後,它的IP會從新分配。
不一樣的pod的訪問方式能夠用endpoint方式:pod的IP+容器的端口
1.2 經過服務訪問 經過建立service,能夠爲一組具備相同功能的容器應用提供統一的入口地址,這個地址不會由於pod的重啓而發生變化。
訪問方式:clusterIp+containerPort
2.集羣外表訪問
2.1 直接訪問容器
在啓動pod的rc/deployment中指定容器的hostport,並設置pod級別的hostwork=true,這樣直接經過主機ip+hostport就能夠實現訪問
2.2 經過service訪問。
2.2.1 NodePort方式
在service的yaml中配置nodePort參數。這一集羣會在每個node上爲須要外部訪問的service開啓一個TCP監聽端口,外部系統只須要用任意一個Node的ip地址+具體的NodePort端口號就能夠訪問此服務。不過這種方式沒有解決node層負載均衡問題。(pod層kube-proxy會自動實現負載均衡分發到多個pod上,可是node層不能負載分發到多個node)
2.2.2 若是使用外部公有云平臺,如aws,azure部署時,可使用 loadbalance方式,配置外部負載均衡器,對service的請求
2.3 Ingress
Ingress是k8s單獨定義的對象,它的做用就是單獨對外暴露負載訪問的均衡,它和service的自己的loadbalance區別在於:
Ingress支持L4,L7負載均衡,LoadBalance設計上支持L4.
Ingress基於pod部署 ,並將pod設置爲external network。
Ingress controller支持nginx,Haproxy,GCE-L7,可以知足企業內部使用。