Kubernetes Basic

Create a Deployment

要在k8s上部署容器化應用,需要創建一個k8s配置文件。
使用kubectl API來創建部署,創建部署需要指明所使用地容器鏡像和創建數量。

通過 kubectl run 來創建一個部署:

這裏寫圖片描述

--port指定了端口號

這裏寫圖片描述

Deployment vs Service

Deployment的主要目的是管理相似的Pods,除此之外,升級pods也是通過deployment進行的。

Service是邏輯上定義了一個或多個pods,是它們的高層抽象。它也定義了訪問內部pods(也稱作“微服務”)的方法,但是對於deployment卻沒有。Service都有Label,也決定了pods是哪(幾)個services的,但是deployment卻可以不依賴於selector。

在啓動Deployment和Service的時候並沒有太多的差別。

在尋找ReplicaSet的時候,Deployment只有通過label進行篩選,因爲屬於Deployment的ReplicaSet遠比屬於Service的多。

對於服務來說,Pods的唯一缺點是依賴於Nodes, 當一個node消失的時候,pods也緊接着自動消失,在另一方面, pods在deployment中不依賴於nodes。但是deployment沒辦法將內部pods暴露在外,只能通過service來實現

Explore APP

Pods

  • 共享Volumes
  • 共享Network
  • 包含如何運行各個container的information,例如image信息和ports信息

這裏寫圖片描述

Nodes

每個Nodes至少運行了:

  • Kubelet,用於與kuberletes其他節點(包括主節點)進行交流的進程,它管理着Pods和Containers
  • 一個容器管理進程(例如Docker)

這裏寫圖片描述

使用如下幾條指令來查看集羣狀態:

  • kubectl get - list resources
  • kubectl describe - show detailed information about a resource
  • kubectl logs - print the logs from a container in a pod
  • kubectl exec - execute a command on a container in a pod

Using Service to Expose APP

每個Pod有個自己的IP地址,但是隻能內部訪問,需要通過Service來暴露給外部。

服務可以通過不同的方式暴露給外部,通過確定ServiceSpec中的type來達到,type分爲4類:

  • ClusterIP(默認): 在集羣內部IP中暴露服務,這讓服務只能在cluster內部訪問
  • NodePort: 在每個選中的集羣中的Node上,相同的Port,暴露服務。讓服務可以通過<NodeIP>:<NodePort>進行訪問,是ClusterIP的更高級的形式
  • LoadBalancer: 在現有云中創建一個外部負載均衡器,指定一個穩定的外部IP來暴露服務,是NodePort的更高級的形式
  • ExternalName: 使用任意的名字暴露服務(在spec中指定externalName)通過返回一個CNAME record。

然後對於Service來說,Port有x種:

  • Port: 服務監聽的端口號(本身的端口)
  • targetPort:需要轉發到後端Pod的端口號(與Service Port形成映射)
  • nodePort:當spec.type=NodePort時,指定映射到物理機的端口號

這裏寫圖片描述

Services通過 Labels and Selectors 來與多個Pods相匹配

這裏寫圖片描述

舉個栗子

首先考慮簡單情況,一個單節點(Node)的集羣,在這個節點上運行着單個Pod(kubernetes-bootcamp-5c69669756-8bprt),裏面只有單個container,根據下圖可以看出,這個ContainerPort是8080端口,PodIP爲172.18.0.2,NodeIP爲172.17.0.65:

這裏寫圖片描述

然後我們再通過service來expose服務,指定Port爲8080(這個爲ServicePort),這個操作將Service的8080端口映射到了NodePort:30041,然後Service的8080端口通過kube-proxy轉發到後端的Pod實例上,注意Service的8080端口,和Container的8080端口是兩個不一樣的東西,但是它們形成了映射(如何形成的可能是因爲相同而默認或者是有設置):

這裏寫圖片描述

然後,我們就可以通過三種不同的方式來訪問cluster內部:

  • 通過NodePort訪問,即<NodeIP, NodePort>,再type爲“NodePort”情況下,只有這種方式可以通過外部進行訪問
  • 內部訪問,通過ClusterIP,ServicePort,通過服務轉發訪問,clusterIP也成爲ServiceIP,無法ping通
  • 內部訪問,通過PodIP, ContainerPort訪問,直接定位到容器(PodIP是可以ping通的)

這裏寫圖片描述

Scaling an application

對cluster進行操作都是通過deployment來進行操作的,Service只是一個高層抽象,例如scale部署到4個replicas:

#kubectl scale deployments/kubernetes-bootcamp --replicas=4

這裏寫圖片描述

用圖片表示如圖:

這裏寫圖片描述

Rolling Update

滾動更新使集羣能夠進行運行時更新,而不需要停止,在更新期間,Service會自動load-balance到可用的Pods,具體步驟如下:

  • 通過容器鏡像創建一個應用
  • Rollback之前的版本
  • 零停機時間的應用程序的連續集成和連續傳遞

例如可以通過如下指令進行部署更新:

#kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

這裏寫圖片描述

參考: kubernetes-basics

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章