基本概念
無狀(zhuang)態(tai)工(gong)作(zuo)負載:即kubernetes中的(de)“Deployment”,無狀(zhuang)態(tai)工(gong)作(zuo)負載支持彈性(xing)伸縮與滾動(dong)升級,適(shi)用于實(shi)例完(wan)全(quan)獨(du)立、功能相同的(de)場景,如:nginx、wordpress等。
操作場景
在(zai)運行中(zhong)始(shi)終不保(bao)存任何(he)數據或(huo)狀態(tai)的工作(zuo)負(fu)載稱(cheng)為“無(wu)狀態(tai)負(fu)載 Deployment”,例如(ru)nginx。您(nin)可(ke)以通過控制臺或(huo)kubectl命令(ling)行創(chuang)建無(wu)狀態(tai)負(fu)載。
前提條件
在(zai)創建(jian)容器工作(zuo)負載前,您需要存在(zai)一(yi)個可(ke)用(yong)集群。若沒有可(ke)用(yong)集群 ,請參照集群開通中(zhong)內(nei)容進行創建(jian)。
若工作負載(zai)需要被外網(wang)訪問,請(qing)確保集群中至(zhi)少有一個節點已綁定彈性IP,或已購(gou)買負載(zai)均衡實例。
創建多個工(gong)作負載時,請確(que)保容器(qi)使用的端口不沖(chong)突 ,否(fou)則部署會(hui)失敗(bai)。
操作步驟及說明
創建Deployment的參(can)(can)數(shu)較多,下面(mian)將分模塊來介紹創建Deployment的參(can)(can)數(shu),請務必留意(yi)這里的參(can)(can)數(shu)解釋,其他四種類型的工(gong)作負載的參(can)(can)數(shu)與Deployment的參(can)(can)數(shu)相(xiang)似
創建一個Deployment的參數最小配置(tomcat為例)


如(ru)上圖的配(pei)置即(ji)可成(cheng)功啟動一個tomcat
備注:鏡像憑證請在高級設置中配置。
參數解釋
數據卷

Deployment的(de)數(shu)據(ju)卷共6種(zhong)類(lei)型,總結如(ru)下表:
| 數據卷類型 | 對應k8s中的類型 | 用途 | 解釋 |
|---|---|---|---|
| 臨時目錄 | emptyDir | 主要用于某些應用程序無需永久保存的臨時目錄,多個容器的共享目錄 | 當Pod分配到Node上時,將會創建emptyDir,當Pod(不管任何原因)從Node上被刪除時,emptyDir也同時會刪除,存儲的數據也將永久刪除。 |
| 主機目錄 | hostPath | hostPath允許掛載Node上的文件系統到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。 | 在使用hostPath volume卷時,即便pod已經被刪除了,volume卷中的數據仍在。但是Pod調度到其他節點之后就無法使用這個目錄了。 |
| secret | secret | 用于將敏感信息(如密碼)傳遞給pod | 將k8s中的Secret資源對象掛載到Pod中 |
| configMap | configMap | 用于掛載配置文件到Pod中 | 將k8s中的ConfigMap資源對象掛載到Pod中 |
| 使用已有PVC | persistentVolumeClaim | 用來掛載持久化磁盤 | 需要提前創建持久卷聲明(PVC) |
| downwardAPI | downwardAPI | 將Pod的信息掛載到容器中(如上圖中將Pod的標簽掛載到容器中,并且用”labels”這個文件存儲Pod的標簽),pod版本號要么不填要么填’v1’ | Downward API提供了兩種方式用于將POD的信息注入到容器內部,一是此處介紹的Volume掛載,二是下面我們將介紹的環境變量 |
實例數量
實(shi)例的數量指(zhi)的是Pod的數量,設置Pod的數量有2種方式

手(shou)動設置:我(wo)們(men)可以手(shou)動指定(ding)Pod的數量(liang)是多少,默認為1,這(zhe)種(zhong)方(fang)式下Pod的數量(liang)在我(wo)們(men)手(shou)動更(geng)新(xin)之前是不會改(gai)變的
自動設置(zhi):這種方式下,Pod的(de)數(shu)量(liang)(liang)會根(gen)據(ju)Pod的(de)資源使用情況自動的(de)調(diao)(diao)整(zheng)(zheng),因此,自動伸縮需要我們設置(zhi)Pod自動調(diao)(diao)整(zheng)(zheng)數(shu)量(liang)(liang)的(de)規則(ze)以(yi)及自動調(diao)(diao)整(zheng)(zheng)數(shu)量(liang)(liang)的(de)范圍
伸(shen)縮規則:即告(gao)訴Pod通過什么規則來自動(dong)調(diao)整數量(liang)(liang)(liang),目前我(wo)們可以通過cpu的(de)使用(yong)百分(fen)比、cpu的(de)使用(yong)量(liang)(liang)(liang)、內存(cun)的(de)使用(yong)百分(fen)比、內存(cun)的(de)使用(yong)量(liang)(liang)(liang)這四個規則來自動(dong)調(diao)整Pod數量(liang)(liang)(liang)
伸縮范圍(wei):即告訴Pod在哪(na)個范圍(wei)內自(zi)(zi)動(dong)調(diao)整(zheng)數(shu)量,自(zi)(zi)動(dong)調(diao)整(zheng)數(shu)量時不會超出這個范圍(wei)
容器參數設置
鏡像

可(ke)以添加多(duo)個(ge)容(rong)器在(zai)一個(ge)Pod中
容器的名稱、鏡(jing)像(xiang)、鏡(jing)像(xiang)版本號(hao)是必填參數
鏡像拉取策略:
IfNotPresent:僅當主機上沒有沒有指定的(de)鏡像時(shi)才去拉取
Always:不管主機上是否有指(zhi)定鏡像,都(dou)會重新(xin)拉取
Never:從不拉取鏡(jing)像
掛載點

如(ru)果(guo)有(you)多(duo)個容器,那么數據卷可以掛載到任意容器的掛載點上
掛載點與上(shang)面介紹的數(shu)據卷是(shi)一(yi)一(yi)對應的關系
容器(qi)路徑:必填且不能為/,表示要將(jiang)數據卷掛載(zai)到容器(qi)里(li)的哪個路徑下
子路徑:選(xuan)填且不能以(yi)/開(kai)頭,表(biao)示僅將數據(ju)卷中(zhong)的(de)子對象項(xiang)掛載(zai)到(dao)容器路徑下,子對象可以(yi)理解為目(mu)錄(lu)的(de)子目(mu)錄(lu)或者ConfigMap的(de)一個data項(xiang)
CPU/內存限制

request數(shu)據(ju):用于預分配(pei)資源,可以理解(jie)為容器(qi)設(she)(she)置(zhi)需要(yao)的最小資源,為了防止出(chu)現Pod無法(fa)調度的問題,強(qiang)烈(lie)建議request數(shu)據(ju)設(she)(she)置(zhi)的盡可能小
limit數據(ju):用(yong)于限制運行時容器占(zhan)用(yong)的(de)資源
環境變量

目前支持四種類型的環境(jing)變量設置(zhi)
keyValue:key-value鍵值對形式為容器設置環境變(bian)量
configMapKeyRef:需要提前創建ConfigMap并且包(bao)含(han)data項,這里會將data中的value值引用(yong)為環境變量(liang)
secretKeyRef:需要提前創建Secret并且包含data項,這里會將data中的value值引用為環境變量
- 方式一:把兩行內容都寫到一個文件里,使用導入YAML把文件導入就行;
- 方式二:使用保密字典,上傳文本文件,第一個文件,文件名是MINIO_ACCESS_KEY,文件內容是sunseaiot;第二個文件,文件名是MINIO_SECRET_KEY,文件內容是sunseaiot1 ;
- 方式三:使用配置項,上傳文件,第一個文件,文件名是MINIO_ACCESS_KEY,文件內容是sunseaiot;第二個文件,文件名是MINIO_SECRET_KEY,文件內容是sunseaiot1fieldRef:引用Pod中的某個字段作為環境變量,如引用Pod的名稱使用metadata.name、引用Pod所在命名空間使用metadata.namespace。
日志掛載

需要提前(qian)安(an)裝日志插件
需要(yao)填(tian)寫容(rong)器的日志(zhi)輸出在哪個目(mu)錄,只有(you)填(tian)寫了(le)正確的容(rong)器日志(zhi)目(mu)錄才(cai)能被日志(zhi)插件采集到
高級設置
啟停處理

啟動(dong)(dong)(dong)執(zhi)行:用于(yu)指定容器在(zai)啟動(dong)(dong)(dong)時執(zhi)行的命(ming)令(ling)和參(can)數(shu)。雖然啟動(dong)(dong)(dong)執(zhi)行里有添(tian)加命(ming)令(ling)和添(tian)加參(can)數(shu)兩(liang)個按鈕,但是我們可(ke)以只(zhi)是用添(tian)加命(ming)令(ling)、或(huo)者只(zhi)使(shi)(shi)用添(tian)加參(can)數(shu)、或(huo)者兩(liang)者同時使(shi)(shi)用,其達到的效果是完全一致的
啟動后(hou)處理:配置容器在啟動完(wan)成后(hou)執(zhi)行的(de)命(ming)令。用法上和上面(mian)的(de)啟動執(zhi)行完(wan)全一致
停(ting)止(zhi)前處理:配置(zhi)容(rong)器在停(ting)止(zhi)前執(zhi)(zhi)行的(de)命令。用法(fa)上和上面的(de)啟動執(zhi)(zhi)行完全一致(zhi)
容器健康檢查

容器(qi)的(de)健康檢(jian)查支持就緒檢(jian)查和存活檢(jian)查兩種,建議給容器(qi)都(dou)配上這(zhe)兩種健康檢(jian)查方式
就緒檢查:會(hui)檢查容器(qi)是否(fou)處于ready狀態(tai),不就緒則停止(zhi)轉(zhuan)發流量到當前實例(li)
存活檢查:檢查容器(qi)是否正常(chang)(chang),不正常(chang)(chang)則重(zhong)啟實(shi)例
三種健(jian)康檢查(cha)方式的公共參數解釋:

目前(qian)支持三種健康(kang)檢查方式:
Http方式:需要填(tian)寫(xie)端口、協議(yi)、請求路徑等參數,然后kubelet 會向容(rong)(rong)器內運(yun)行(xing)的程序發送一個 HTTP GET 請求來執行(xing)探測(ce)。如果容(rong)(rong)器的處理(li)程序返(fan)回(hui)成(cheng)功(gong)碼,則(ze)kubelet認(ren)為(wei)容(rong)(rong)器是存活/就(jiu)緒的。如果處理(li)程序返(fan)回(hui)失敗碼,則(ze)kubelet會殺死這個容(rong)(rong)器并且重新啟(qi)動它/認(ren)為(wei)它沒有(you)就(jiu)緒
Tcp方式:需(xu)要填寫主機(ji)、端口(kou)等參(can)數,然后kubelet 會嘗試在指定端口(kou)和容器(qi)建(jian)立套接字(zi)鏈接。如果能建(jian)立鏈接,這(zhe)個容器(qi)就被(bei)看作是健康的(de)(de)/就緒的(de)(de),如果不能則這(zhe)個容器(qi)就被(bei)看作是有問題的(de)(de)/沒有就緒的(de)(de)
命令方式:需(xu)要添(tian)加命令,然后(hou)kubelet 在(zai)容器(qi)(qi)中執行該命令來進行檢(jian)測。如(ru)果命令執行成功并(bing)且返回值為(wei)(wei)0,kubelet會認為(wei)(wei)這(zhe)個(ge)容器(qi)(qi)是健(jian)康存(cun)活的/就(jiu)緒(xu)的。如(ru)果這(zhe)個(ge)命令返回非 0 值,kubelet 會殺死這(zhe)個(ge)容器(qi)(qi)并(bing)重新啟動它/認為(wei)(wei)它沒有就(jiu)緒(xu)
特權級容器

特(te)權(quan)級容(rong)器(qi)(qi):即(ji)給容(rong)器(qi)(qi)賦予主機的(de)root用(yong)戶(hu)權(quan)限,一般情況下都不需要設置。一個(ge)常見的(de)使用(yong)場景是,使用(yong)主機目(mu)(mu)錄掛載時,如果該目(mu)(mu)錄是root用(yong)戶(hu)權(quan)限的(de),那么(me)(me)容(rong)器(qi)(qi)想要操作這(zhe)么(me)(me)目(mu)(mu)錄,那么(me)(me)必須(xu)開啟(qi)特(te)權(quan)級容(rong)器(qi)(qi),開啟(qi)特(te)權(quan)容(rong)器(qi)(qi)后(hou),容(rong)器(qi)(qi)內的(de)用(yong)戶(hu)會設置為root用(yong)戶(hu)
Deployment高級設置
負載注解與負載標簽

支(zhi)持給(gei)Deployment設(she)置注解,注解將會以(yi)(yi)key-value形式(shi)(shi)寫入Deployment - 支(zhi)持給(gei)Deployment設(she)置標(biao)(biao)簽,標(biao)(biao)簽將會以(yi)(yi)key-value形式(shi)(shi)寫入Deployment
鏡像拉取憑證

支持給(gei)Deployment設置鏡像拉取憑證(zheng)
鏡像拉(la)取(qu)憑(ping)證(zheng)(zheng)主要適用(yong)于(yu):如果我們給Deployment設置(zhi)的鏡像屬于(yu)私有(you)倉庫中(zhong)的鏡像,那么一定(ding)要先創(chuang)建鏡像拉(la)取(qu)憑(ping)證(zheng)(zheng),然后再此處添加鏡像拉(la)取(qu)憑(ping)證(zheng)(zheng)
節點選擇器

支持發布(bu)Deployment到(dao)(dao)指定節(jie)點上,選擇了(le)key-value之后,可以(yi)通過查看節(jie)點查看Deployment可以(yi)發布(bu)到(dao)(dao)哪(na)些節(jie)點上。
注意如果所有的節點都無法滿足節點選擇器,那么(me)Pod將(jiang)不會調度,會出現類似的事件0/3 nodes match node selector。
主機別名配置

如(ru)果(guo)我(wo)們希(xi)望給(gei)運行在k8s上的(de)Pod增加一些域(yu)名(ming)的(de)解(jie)析(例如(ru)宿(su)主(zhu)機(ji)的(de)主(zhu)機(ji)名(ming)),那么我(wo)們可以通過主(zhu)機(ji)別名(ming)配置(zhi)往容器的(de)/etc/hosts文件中添加域(yu)名(ming)解(jie)析
給Deployment設置的主機別名可以(yi)等容器(qi)啟動后,進(jin)入容器(qi)終端執行命令(ling)cat/etc/hosts查(cha)看
Pod主機名設置

如果我(wo)們(men)想要固定容器的hostname,那么可(ke)以設置Pod主(zhu)機(ji)名
設置了Pod主機名(ming)后,這個(ge)(ge)Pod里(li)的所有容器的hostname都會變成我們設定的這個(ge)(ge)值(zhi)
通過在master節(jie)點上執行命令kubectl exec hostname可(ke)以查看容器的(de)hostname
主機網絡

選擇使用主機(ji)網絡(luo),那么pod中(zhong)運(yun)行的(de)應(ying)用程(cheng)序可以(yi)直接(jie)看(kan)到宿(su)主主機(ji)的(de)網絡(luo)接(jie)口(kou) - 使用主機(ji)網絡(luo),Pod IP和(he)節點IP將會一樣 。
如果(guo)不加(jia)上dnsPolicy:ClusterFirstWithHostNet ,pod默(mo)認使用(yong)所(suo)在宿主主機使用(yong)的DNS,這樣也會導致容器(qi)內不能通過service name 訪問k8s集群中其(qi)他POD。
一般情況下(xia),請在(zai)使用(yong)主機網絡(luo)之前優(you)先考慮使用(yong)NodePort。
升級方式與升級策略

快速升級(ji):選擇(ze)快速升級(ji)時(shi),每次全量(liang)替換(huan)升級(ji)Deployment的(de)時(shi)候,會刪除所有已存(cun)在(zai)的(de)pod,重新(xin)創建新(xin)的(de);
滾(gun)動升(sheng)級:選擇滾(gun)動升(sheng)級時,每次(ci)全量替換升(sheng)級Deployment的(de)(de)時候,會(hui)采取逐(zhu)步(bu)替換的(de)(de)策略,等新創建出(chu)來的(de)(de)Pod處于running狀態之后才(cai)會(hui)銷毀舊的(de)(de)Pod,參數詳(xiang)解:
- maxSurge:升級過程中最多可以比原先設置多出的POD數量,如maxSurage=1,replicas=5,則表示k8s會先啟動1一個新的Pod后才刪掉一個舊的POD,整個升級過程中最多會有5+1個POD
- maxUnavaible: 升級過程中最多有多少個POD處于無法提供服務的狀態,當maxSurge不為0時,該值也不能為0,例如:maxUnavaible=1,則表示Deployment整個升級過程中最多會有1個POD處于無法服務的狀態
開啟訪問設置

表示創建Deployment的同時,創建一個配套的服務(Service),詳見Service管理