k8s ready 不调度_从零开始学K8s: 10.在K8s上运行应用
上一節我們學習了如何使用Minikube搭建一個k8s環境,這一節開始我們來學習如何將之前創建的Node.js應用程序部署到這個k8s環境里
在部署之前,通常我們都會先準備好YAML或者JSON格式的清單(k8s中稱作manifest),這個清單詳細說明了我們想要部署的組件。但是為了讓大家更快進入到k8s的世界,我還不打算講解k8s中的組件類型,先讓我們通過一個簡單的例子來了解如何讓程序先運行起來。我的個人學習理念是先窺全貌、動手實踐再深入了解,你都不知道困住你的這個龐然大物是個什么東西,就想去先去了解內部細節,只會讓自己一頭霧水、理解緩慢。
1.kubectl run命令
現在開始運行之前已經發布到阿里云的鏡像,執行如下命令讓其在k8s中運行:
kubectl run test1 --image=registry.cn-shanghai.aliyuncs.com/david-ns01/test1:1.0 --port=8080
kubectl run命令會為我們創建一個名為test1的Pod(關于pod下面有介紹)。
查看Pod的狀態:
kubectl get pods可以看到當前狀態為ContainerCreating,意味著正在創建容器。
過一會兒再執行這個命令,可以看到狀態變為Running了:
之所以Pod的狀態沒有立刻變成Running,是因為Pod所在的工作節點需要先下載容器鏡像,當下載完成后就會在Pod中創建容器,然后才會變成Running狀態。
可能到此處有些同學會有些疑惑,這個Pod是什么?我們的程序是運行在容器里嗎?那么容器在哪里可以看到?能不能有個命令顯示所有正在運行的容器?然而kubenetes并不是以容器為單位來進行管理的,它不會直接與容器打交道,而是使用Pod。
2.什么是Pod
Pod就是一組緊密關聯的容器的集合,它可以包含一個或者多個容器,還包含了存儲、網絡等各個容器可以共享的資源。這些容器總是在同一個Linux命名空間下運行在同一臺工作節點上。
一個Pod只包含一個容器是最常用的應用方式。除非特別需要,比如應用之間耦合度比較高,一般都不推薦使用多容器Pod的方式。不過對于包含多個容器的Pod,Kubernetes能夠保證這些容器都運行在同一臺物理主機或虛擬主機中。Pod就像一個獨立的邏輯機器,它有自己的IP、主機名和進程等等。同一個Pod中的容器共享IP地址和端口范圍,容器之間可以通過 localhost 互相訪問。
更多關于Pod的知識,后面我們再專門進行介紹。
通過執行如下命令可以列出:
kubectl get pods上圖中的READY列顯示的就是這個名為test1的Pod中的容器數,以及處于READY狀態的容器數。因為當前這個Pod只有一個容器,所以顯示的都是1。
如果想要探查Pod更多的信息,可以使用如下命令:
kubectl describe pod如果Pod的狀態一直未變成Running,就可以通過這個命令查看具體的原因,有可能就是Kubernetes在拉取鏡像的時候出錯了。
3.背后的原理
上面通過kubectl run命令創建了一個Pod,可以通過下圖來了解具體的原理:
- 1.開發人員在本地機器上執行推送鏡像test1:1.0的命令
- 2.鏡像被推送到鏡像倉庫(Docker Hub、阿里云等等)
- 3.開發人員在本地機器上運行kubectl run命令
- 4.Kubectl向k8s的API Server發送REST HTTP請求
- 5.創建一個Pod并通過Scheduler分配到某個工作節點
- 6.發送消息給Kubelet
- 7.某個工作節點上的Kubelet發現新創建的Pod被分配給了自己,于是通知Docker去拉取鏡像
- 8.Docker去鏡像倉庫拉取鏡像并在這個Pod中創建和運行容器
4.訪問應用
Pod已經運行起來了,那如何才能訪問到我們創建的Node.js應用程序呢?我們知道每個Pod其實都是有自己獨立的網絡環境,有自己的IP地址和主機名,但是這個地址是K8s集群內部的地址,無法在集群外部訪問。因此需要想辦法將我們的應用對外暴露出去。
可以使用一個叫做Service的Kubernetes對象來完成這個任務。為了演示,現在我們創建一個類型為LoadBalancer的Service對象:
kubectl expose pod test1 --type=LoadBalancer --name test1-http通過如下命令可以查看剛創建的Service對象:
kubectl get services創建類型為LoadBalancer的Service會自動創建一個外部的負載均衡器(load balancer),我們可以通過這個負載均衡器的公共IP訪問Pod。
test1-http就是我們剛才創建的服務。EXTERNAL-IP列顯示的是pending狀態,因為創建負載均衡器需要花些時間。一旦負載均衡器創建好了之后,EXTERNAL-IP列就會顯示分配的外部IP地址。但是我們發現EXTERNAL-IP的狀態似乎一直是pending。
因為我們當前使用的是Minikube,它是不支持LoadBalancer類型的Service的,所以上面的test1-http一直獲取不到外部IP地址。但是我們也可以發現PORT(S)列其實是有端口映射的,說明通過30768端口是可以訪問到這個服務的。
可以通過如下命令來獲取外部IP地址:
minikube service test1-http這里的172.17.0.3其實就是名為minikube的節點的地址
通過curl命令來向我們的應用程序發送請求:
curl http://172.17.0.3:30768如果將service刪除掉后再訪問就會失敗:
kubectl delete service test1-http[謝謝]如果覺得本文對您有幫助,歡迎關注我的頭條號訂閱更新,我會不斷推出更多高質量的文章。您的支持是我持續創作的最大動力![謝謝]
總結
以上是生活随笔為你收集整理的k8s ready 不调度_从零开始学K8s: 10.在K8s上运行应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5g的控制信道编码方式_5gnr上行支持
- 下一篇: 亚马逊 开发者api 调用_关于微信AP