使用K8S Deployment來部屬App

閱讀時間約 9 分鐘
總結一下,前幾篇介紹了:
1. 使用Minikube安裝Kubernetes
2. 將Docker image部屬到Minikube
3. 透過K8S Ingress 和 NodePort service直接連線Pod中的App

簡單的說,我們開發完成後,會將app build成一個docker image,透過指令指定image建立k8s pod,將我們開發好的app部屬在k8s pod中。
有發現不方便的地方了嗎? 也就是每次我只要有change,我必須從頭開始,把最新的code build成image,將舊的pod刪掉,然後再透過指令建立最新的pod,將最新的app部屬到k8s pod中。
因此,這邊可以使用K8S 的一個resource,叫做Deployment
一般來說,實務上我們不會直接把app部屬到pod,而是會使用Deployment,使用它有很多好處呢!
例如:
1. code進版後,我們可以直接把pod刪除,讓Deployment直接幫我們根據最新的image長出新的pod。
=> 也就是說Deployment會幫忙redeploy pod,一旦有pod死掉或刪除,會自動重新長出來,可以指定要多少pod。
2. 指定image tag來取代目前的pod。
如果是照著前幾篇過來的,先把前面建立的pod, service, ingress都刪除:
$ kubectl delete pods hello-world
$ kubectl delete svc hello-world
$ kubectl delete ingress vic-example
-------------------------------------------------------------------------------------
以下內容, 會一步一步教學如何使用K8S Deployment來部屬App,即使沒看過前面幾篇也沒關係,因為在大部分情況下,都會直接用Deployment。


在開始之前,先啟動minikube:
$ minikube start --driver=docker
$ eval $(minikube docker-env)
=> 這個指令一定要做,才能使用local image

建立docker image:

按照之前的教學,建立image vic/hello_world,這邊不再贅述。
建立Deployment:

使用本機image 「vic/hello_world」 建立 「hello-world」 deployment:
$ kubectl create deployment hello-world --image=vic/hello_world
kubectl create deployment這個語法,加上之前提到的--image-pull-policy=Never來使用本機image,會發現根本沒有這個語法,因此先建立好deployment後再來修改,取得dashboard url:
$ minikube dashboard --url
瀏覽器打開dashboard,找到剛建立的Deployment來編輯:
原本imagePullPolicy是Always改為Never!
查詢剛剛建立的deployment:
$ kubectl get deployment hello-world
可以看到pod也被建立上去了:
$ kubectl get pods

建立Service:
使用 kubectl expose指令公開 Deployment,創建「hello-world」 Service:
$ kubectl expose deployment hello-world --port=6000 --target-port=5000
可以看到service已經建立上去了:
注意: 這邊跟上篇提到的node port是不一樣的,這邊是ClusterIP。

建立ingress:
接著照著上篇的教學,啟用ingress(如果已經有做過上篇,應該已經enable過了):
$ minikube addons enable ingress

Ingress需要撰寫yaml檔來做設定,以 minikube 內建的 Nginx Ingress 為例,建立一個hello-world-ingress.yaml:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: vic-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello.world.minikube
http:
paths:
- path: /(.*|$)
backend:
serviceName: hello-world
servicePort: 6000
其中host是對外的domain name,有點類似在設定apache的server name,設定好申請的domain即可從外部直接連線過來。 serviceName跟servicePort則填寫上面建立好的Service。
建立一個名為vic-example的Ingress:
$ kubectl apply -f hello-world-ingress.yaml
查看Ingress:
$ kubectl get ingress
由於這只是範例,並不是真的有hello.world.minikube這個domain name,因此為了模擬測試,可以在/etc/hosts中加入host ip mapping:
$ sudo nano /etc/hosts
打開瀏覽器測試APP:
了解Deployment的好處:
1. 試著把pod刪除看看:
可以發現,才剛刪除沒多久,就自動長出pod了。

2. 讓 Deployment 用指定 tag 的 image 取代原本的 Pod:
首先,假如我們有新版本的code開發完了:
build一個 v2.0 tag 的 image:
$ docker build -t vic/hello_world:v3.0 .

查看docker images:
$ docker images
接著讓 Deployment 用指定 tag 的 image 取代原本的 Pod:
$ kubectl set image deployment/hello-world hello-world-rf7wm=vic/hello_world:v2.0 --record
#kubectl set image deployment-name container-name=image-name

其中hello-world-rf7wm=container name,要從dashboard那邊查,找到Deployment後,按下編輯的圖示,如下圖紅框:
在 Pod 重新建立後,可以驗證一下 image 是不是更新了:
$ kubectl get pods -l app=hello-world -o jsonpath='{.items[0].spec.containers[0].image}'

檢查 Deployment 的歷史紀錄,確認是否有更新:
$ kubectl rollout history deployment hello-world
由於service跟ingress前面都建立過了是一樣的,所以直接用瀏覽器打開app看有無更新:
#Note:
刪除Deployment:
$ kubectl delete deployment xxx
刪除 Service:
$ kubectl delete svc xxx
刪除 Ingress:
$ kubectl delete ingress xxx
為什麼會看到廣告
20會員
161內容數
留言0
查看全部
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
Factory design pattern
閱讀時間約 1 分鐘
Abstract Factory design pattern
閱讀時間約 1 分鐘
什麼是CI/CD?
閱讀時間約 2 分鐘
使用Minikube安裝Kubernetes
閱讀時間約 6 分鐘
將Docker image部屬到Minikube
閱讀時間約 5 分鐘
你可能也想看
使用紫妍萃第一型膠原蛋白精華凝露的使用體驗 | 陳菊安陳菊安分享她使用紫妍萃第一型膠原蛋白精華凝露的使用體驗,純粹的第一型膠原蛋白能全面改善肌膚問題,質地輕盈且易吸收,是值得推薦的護膚產品。
Thumbnail
avatar
陳菊安
2024-06-20
使用 VBA 進行檔案操作:新增、刪除與移動Visual Basic for Applications(VBA)是一種功能強大的程式語言,廣泛用於自動化 Microsoft Office 應用程式中的重複性任務。在這篇教學文章中,我們將介紹如何使用 VBA 來新增、刪除和移動檔案。
Thumbnail
avatar
Pochi
2024-06-17
使用Wix網站架設好嗎?Wix網站設計平台:優缺點解析 Wix架設網站的優點 Wix最大的特色在於其簡單易用的拖放式編輯工具,這使得即便是不會寫程式的新手,也能輕鬆打造出美觀的網站,無論是為品牌還是個人用途。 Wix架設網站的缺點 然而,使用Wix架設網站也有一些缺點。免費版本的功能較為有限,且會有廣告,許多設計模
Thumbnail
avatar
Arthur
2024-06-14
【使用Obsidian 5年後,我的3個重大发現】無論是學術工作者還是生活愛好者, 都能從這篇文章中找到使用Obsidian的好處。 這篇文章將揭示如何有效地管理和利用資訊。 透過實踐, Obsidian已成為我生活與工作中的重要工具。 ▋發現1 - 高效的學術閱讀管理 在學術工作中, 我利用Obsidia
avatar
王啟樺
2024-06-12
使用 Gemini AI 聊天整理 YouTube 影片摘要使用 Gemini AI 聊天服務時,點擊「設定>擴充功能」啟用「YouTube」功能,即可在對話中利用 @YouTube 指令尋找 YouTube 影片和詢問內容。
Thumbnail
avatar
xiaoyao
2024-06-12
「使用權社宅」非既定政策 內政部發文澄清📷 房市示意圖。圖/實價登錄比價王資料庫 有關媒體報導新內閣將推動「使用權社宅」一事,內政部長林右昌表示,「使用權社宅」並非既定政策,請勿以訛傳訛!林右昌指出,社會住宅有三個很重要的精神: 1. 在最需要的時候,留給最需要的人 2. 要有一定的周轉率 3. 要有退場機制 林右昌說明,現行使用社宅的
avatar
5168_E. Grey
2023-02-09
使用方格子成癮 我會不會太老?方格子第二次的「創作者成長學院」,從我這裡加拿大西部的亞伯達省「山區時間」,十一月二十三日早上六點幾乎準點開始。 兩個三十幾歲的年輕人和幾個團隊成員,誠心和六十幾位參加的創作者們分享自我經營的祕訣,我這四十五歲的喔吧桑頓時覺得自己年輕了起來!
Thumbnail
avatar
佩格澀思
2022-11-23
使用合成原料來調整氣味只將合成原料用來調整氣味的作法,和一般調香師的思維背道而馳。若是你/妳想要學習仿香,那這篇文章並不適合你。但如果你喜歡天然原料,但又想作出商業香水的輕盈感、明亮度、持久力,那你可以參考看看我們的作法。 我們會接續【在天然香水配方裏添加合成原料】這篇,介紹更多的合成原料/單體。
Thumbnail
avatar
調香師的日常修練
2022-04-30
使用水刀清洗步道磚戶外的步道磚,因為常年受陽光與雨水的滋潤,常常產生青苔。
Thumbnail
avatar
Justin Wu(吳寓林所)
2022-03-26
使用類固醇會長不高?氣喘常見用藥及迷思破解今天要跟大家分享的主題,主要會圍繞在氣喘的簡介、常見症狀、常見藥物以及相關的迷思破解。 當出現咳喘、喘鳴聲、甚至呼吸窘迫等典型氣喘的症狀之後,家長通常會趕緊帶孩童去看醫生,醫生會根據孩童的病程發展及嚴重度選用最適合的藥物。氣喘的藥物分成兩大類...
Thumbnail
avatar
蒼藍鴿
2020-10-26