好玩的K8s之讀書(shū)筆記01:《K8權(quán)威指南》(第4版)

下內(nèi)容整理自這本書(shū)的讀書(shū)筆記:《Kubernetes權(quán)威指南:從Docker到Kubernetes實(shí)踐全接觸(第4版)刑然,各大書(shū)店有售

一懦窘、無(wú)狀態(tài)的服務(wù)

1.pod

1)基本概念

pod的組成


pod远舅、容器和node之間的關(guān)系
Pod與周邊對(duì)象


2)配置文件樣例

apiVersion: v1

kind: Pod

metadata:

? name: myweb

? labels:

? ? app: myweb

spec:

? containers:

? - name: myweb

? ? image: kubeguide/tomcat-app:v1

? ? ports:

? ? - containerPort: 8080

? ? env:

? ? - name: MYSQL_SERVICE_HOST

? ? ? value: 'mysql'

? ? - name: MYSQL_SERVICE_PORT

? ? ? value: '3306'

3)命令行例子

kubectl get pod -o wide


kubectl describe pod?

里面的IP是POD的IP

kubectl describe pod frontend-5cb785b459-6cn6w

里面有個(gè)container可以查看pod里各個(gè)容器的情況:包括容器name千贯、image髓堪,服務(wù)端口等送朱,加上ip就可以獲取EndPoint

kubectl get endpoints

kubectl edit pod frontend-5cb785b459-6cn6w?

執(zhí)行pod內(nèi)容器的命令

kubectl exec -it frontend-5cb785b459-6cn6w -c tomcat-demo -- mkdir /tmp/abc

kubectl exec -it frontend-5cb785b459-6cn6w -c tomcat-demo -- bash

會(huì)出現(xiàn)shell提示符,可以使用env干旁,ls等命令

也可以在相應(yīng)的node節(jié)點(diǎn)執(zhí)行以下命令驶沼,進(jìn)入到docker中的容器

sudo docker exec -it 5e45393d667c bash


2.label

1)基本概念

一個(gè)Label是一個(gè)key=value的鍵值對(duì),其中key與value由用戶(hù)自己指定争群。Label可以被附加到各種資源對(duì)象上回怜,例如Node、Pod、Service玉雾、RC等

YAML中的標(biāo)簽定義格式:

? labels:

? ? key: value

labels:

? ? app: myweb

給某個(gè)資源對(duì)象定義一個(gè)Label翔试,隨后可以通過(guò)Label Selector(標(biāo)簽選擇器)查詢(xún)和篩選擁有某些Label的資源對(duì)象,當(dāng)前有兩種Label Selector表達(dá)式:基于等式的(Equality-based)和基于集合的(Set-based)

基于等式的操作符:=复旬,!=

基于集合的操作符:in,notin,exists,doesnotexist

matchLabels用于定義一組Label垦缅,與直接寫(xiě)在Selector中的作用相同

selector:

? ? app: mysql

與下面的表達(dá)式等價(jià)

selector:

? ??matchLabels

? ? ? ? app: mysql

matchExpressions用于定義一組基于集合的篩選條件,可用的條件運(yùn)算符包括in,notin,exists,doesnotexist驹碍。

selector:?

? ? matchExpressions:?

? ? ? ? - {key: name1,? operator: In , values:[v1,v2]}

? ??????- {key: name2,? operator: In , values:[v3,v4]}

可以通過(guò)多個(gè)Label Selector表達(dá)式的組合實(shí)現(xiàn)復(fù)雜的條件選擇壁涎,多個(gè)表達(dá)式之間用“,”進(jìn)行分隔即可志秃,幾個(gè)條件之間是“AND”的關(guān)系怔球,即同時(shí)滿(mǎn)足多個(gè)條件

如果同時(shí)設(shè)置了matchLabels和matchExpressions,則兩組條件為AND關(guān)系

Label Selector在Kubernetes中的重要使用場(chǎng)景如下浮还。

◎ kube-controller進(jìn)程通過(guò)在資源對(duì)象RC上定義的Label Selector來(lái)篩選要監(jiān)控的Pod副本數(shù)量竟坛,使Pod副本數(shù)量始終符合預(yù)期設(shè)定的全自動(dòng)控制流程。

◎ kube-proxy進(jìn)程通過(guò)Service的Label Selector來(lái)選擇對(duì)應(yīng)的Pod钧舌,自動(dòng)建立每個(gè)Service到對(duì)應(yīng)Pod的請(qǐng)求轉(zhuǎn)發(fā)路由表担汤,從而實(shí)現(xiàn)Service的智能負(fù)載均衡機(jī)制。

◎ 通過(guò)對(duì)某些Node定義特定的Label延刘,并且在Pod定義文件中使用NodeSelector這種標(biāo)簽調(diào)度策略漫试,kube-scheduler進(jìn)程可以實(shí)現(xiàn)Pod定向調(diào)度的特性。

3.Replication Controller/Replica Set

注:Replica Set與Deployment這資源對(duì)象逐步替代了之前RC的作用

1)基本概念

定義了一個(gè)期望的場(chǎng)景碘赖,即聲明某種Pod的副本數(shù)量在任意時(shí)刻都符合某個(gè)預(yù)期值驾荣,所以RC的定義包括如下幾個(gè)部分。

◎ Pod期待的副本數(shù)量普泡。

◎ 用于篩選目標(biāo)Pod的Label Selector播掷。

◎ 當(dāng)Pod的副本數(shù)量小于預(yù)期數(shù)量時(shí),用于創(chuàng)建新Pod的Pod模板(template)撼班。

在定義了一個(gè)RC并將其提交到Kubernetes集群中后歧匈,Master上的Controller Manager組件就得到通知,定期巡檢系統(tǒng)中當(dāng)前存活的目標(biāo)Pod砰嘁,并確保目標(biāo)Pod實(shí)例的數(shù)量剛好等于此RC的期望值件炉,如果有過(guò)多的Pod副本在運(yùn)行,系統(tǒng)就會(huì)停掉一些Pod矮湘,否則系統(tǒng)會(huì)再自動(dòng)創(chuàng)建一些Pod斟冕。可以說(shuō)缅阳,通過(guò)RC磕蛇,Kubernetes實(shí)現(xiàn)了用戶(hù)應(yīng)用集群的高可用性

Node 2上的Pod 2意外終止,則根據(jù)RC定義的replicas數(shù)量2,Kubernetes將會(huì)自動(dòng)創(chuàng)建并啟動(dòng)一個(gè)新的Pod秀撇,以保證在整個(gè)集群中始終有兩個(gè)redis-slave Pod運(yùn)行超棺。

在運(yùn)行時(shí),我們可以通過(guò)修改RC的副本數(shù)量呵燕,來(lái)實(shí)現(xiàn)Pod的動(dòng)態(tài)縮放(Scaling)棠绘,這可以通過(guò)執(zhí)行kubectl scale命令來(lái)一鍵完成

kubectl scale rc redis-slave --replicas=3

Replication Controller由于與Kubernetes代碼中的模塊Replication Controller同名衷戈,同時(shí)“Replication Controller”無(wú)法準(zhǔn)確表達(dá)它的本意获三,所以在Kubernetes 1.2中,升級(jí)為另外一個(gè)新概念—Replica Set险毁,官方解釋其為“下一代的RC”霍衫。Replica Set與RC當(dāng)前的唯一區(qū)別是,Replica Sets支持基于集合的Label selector(Set based selector)侯养,而RC只支持基于等式的Label Selector(equality-based selector)敦跌,這使得Replica Set的功能更強(qiáng)。

2)配置文件樣例

apiVersion: v1

kind: ReplicationController

metadata:

? name: mysql

spec:

? replicas: 1

? selector:

? ? app: mysql

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: mysql

? ? spec:

? ? ? containers:

? ? ? - name: mysql

? ? ? ? image: mysql

? ? ? ? ports:

? ? ? ? - containerPort: 3306

? ? ? ? env:

? ? ? ? - name: MYSQL_ROOT_PASSWORD

? ? ? ? ? value: "123456"

上述的ReplicationController逛揩,可以替換為ReplicaSet關(guān)鍵字

3.Deployment

1)基本概念

Deployment在內(nèi)部使用了Replica Set來(lái)實(shí)現(xiàn)目的柠傍,無(wú)論從Deployment的作用與目的、YAML定義辩稽,還是從它的具體命令行操作來(lái)看惧笛,我們都可以把它看作RC的一次升級(jí),兩者的相似度超過(guò)90%

Deployment的典型使用場(chǎng)景有以下幾個(gè)逞泄。

◎ 創(chuàng)建一個(gè)Deployment對(duì)象來(lái)生成對(duì)應(yīng)的Replica Set并完成Pod副本的創(chuàng)建患整。

◎ 檢查Deployment的狀態(tài)來(lái)看部署動(dòng)作是否完成(Pod副本數(shù)量是否達(dá)到預(yù)期的值)。

◎ 更新Deployment以創(chuàng)建新的Pod(比如鏡像升級(jí))喷众。

◎ 如果當(dāng)前Deployment不穩(wěn)定各谚,則回滾到一個(gè)早先的Deployment版本。

◎ 暫停Deployment以便于一次性修改多個(gè)PodTemplateSpec的配置項(xiàng)到千,之后再恢復(fù)Deployment昌渤,進(jìn)行

新的發(fā)布。

◎ 擴(kuò)展Deployment以應(yīng)對(duì)高負(fù)載憔四。

◎ 查看Deployment的狀態(tài)膀息,以此作為發(fā)布是否成功的指標(biāo)。

◎ 清理不再需要的舊版本ReplicaSets了赵。

2)配置文件樣例

apiVersion: apps/v1

kind: Deployment

metadata:

? name: frontend

spec:

? replicas: 1

? selector:

? ? matchLabels:

? ? ? tier: frontend

? ? matchExpressions:

? ? ? - {key: tier, operator: In, values: [frontend]}

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: app-demo

? ? ? ? tier: frontend

? ? spec:

? ? ? containers:

? ? ? - name: tomcat-demo

? ? ? ? image: tomcat

? ? ? ? imagePullPolicy: IfNotPresent

? ? ? ? ports:

? ? ? ? - containerPort: 8080

3)命令行例子

創(chuàng)建deployment
kubectl create -f frontend-deployment.yaml

查看Deployment的信息

kubectl get deploy -o wide

查看相應(yīng)的Replica Set

kubectl get rs -o wide

kubectl describe rs?frontend-5cb785b459

查看相應(yīng)的Pod

kubectl get pod -o wide

kubectl describe pod frontend-5cb785b459-7trhb

注意這個(gè)pod的名稱(chēng)前綴潜支,與相應(yīng)的deploy和rs的名稱(chēng)是相同的

要是pod還處在Pulling image ...,還可以到相應(yīng)的node上查看images的pull狀態(tài)

sudo docker images

sudo docker pull tomcat

直到出現(xiàn)Running

基于deploy的伸縮

kubectl scale deploy frontend --replicas=2

5.Horizontal Pod Autoscaler

1)基本概念

通過(guò)手工執(zhí)行kubectl scale命令斟览,我們可以實(shí)現(xiàn)Pod擴(kuò)容或縮容毁腿。如果僅僅到此為止,顯然不符合谷歌對(duì)Kubernetes的定位目標(biāo)—自動(dòng)化、智能化已烤。在谷歌看來(lái)鸠窗,分布式系統(tǒng)要能夠根據(jù)當(dāng)前負(fù)載的變化自動(dòng)觸發(fā)水平擴(kuò)容或縮容,因?yàn)檫@一過(guò)程可能是頻繁發(fā)生的胯究、不可預(yù)料的稍计,所以手動(dòng)控制的方式是不現(xiàn)實(shí)的。

HPA有以下兩種方式作為Pod負(fù)載的度量指標(biāo)裕循。

◎ CPUUtilizationPercentage臣嚣。

◎ 應(yīng)用程序自定義的度量指標(biāo),比如服務(wù)在每秒內(nèi)的相應(yīng)請(qǐng)求數(shù)(TPS或QPS)剥哑。

2)配置文件樣例

apiVersion: autoscaling/v1

kind: HorizontalPodAutoscaler

metadata:

? name: frontend

? namespace: default

spec:

? maxReplicas: 10

? minReplicas: 1

? scaleTargetRef:

? ? kind: Deployment

? ? name: frontend

? targetCPUUtilizationPercentage: 90

3)命令行例子

命令行格式:kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [options]

kubectl autoscale deploy frontend --min=1?--max=10?--cpu-percent=90

二硅则、有狀態(tài)的服務(wù)

6.StatefulSet

1)基本概念

在Kubernetes系統(tǒng)中,Pod的管理對(duì)象RC株婴、Deployment怎虫、DaemonSet和Job都面向無(wú)狀態(tài)的服務(wù)。但現(xiàn)實(shí)中有很多服務(wù)是有狀態(tài)的困介,特別是一些復(fù)雜的中間件集群大审,例如MySQL集群、MongoDB集群座哩、Akka集群徒扶、ZooKeeper集群等,這些應(yīng)用集群有4個(gè)共同點(diǎn)根穷。

(1)每個(gè)節(jié)點(diǎn)都有固定的身份ID姜骡,通過(guò)這個(gè)ID,集群中的成員可以相互發(fā)現(xiàn)并通信缠诅。

(2)集群的規(guī)模是比較固定的溶浴,集群規(guī)模不能隨意變動(dòng)。

(3)集群中的每個(gè)節(jié)點(diǎn)都是有狀態(tài)的管引,通常會(huì)持久化數(shù)據(jù)到永久存儲(chǔ)中士败。

(4)如果磁盤(pán)損壞,則集群里的某個(gè)節(jié)點(diǎn)無(wú)法正常運(yùn)行褥伴,集群功能受損谅将。

StatefulSet,StatefulSet從本質(zhì)上來(lái)說(shuō)重慢,可以看作Deployment/RC的一個(gè)特殊變種饥臂,它有如下特性。

◎ StatefulSet里的每個(gè)Pod都有穩(wěn)定似踱、唯一的網(wǎng)絡(luò)標(biāo)識(shí)隅熙,可以用來(lái)發(fā)現(xiàn)集群內(nèi)的其他成員稽煤。假設(shè)StatefulSet的名稱(chēng)為kafka,那么第1個(gè)Pod叫kafka-0囚戚,第2個(gè)叫kafka-1酵熙,以此類(lèi)推。

◎ StatefulSet控制的Pod副本的啟停順序是受控的驰坊,操作第n個(gè)Pod時(shí)匾二,前n-1個(gè)Pod已經(jīng)是運(yùn)行且準(zhǔn)備好的狀態(tài)。

◎ StatefulSet里的Pod采用穩(wěn)定的持久化存儲(chǔ)卷拳芙,通過(guò)PV或PVC來(lái)實(shí)現(xiàn)察藐,刪除Pod時(shí)默認(rèn)不會(huì)刪除與StatefulSet相關(guān)的存儲(chǔ)卷(為了保證數(shù)據(jù)的安全)。

StatefulSet除了要與PV卷捆綁使用以存儲(chǔ)Pod的狀態(tài)數(shù)據(jù)舟扎,還要與Headless Service配合使用分飞,即在每個(gè)StatefulSet定義中都要聲明它屬于哪個(gè)Headless Service。Headless Service與普通Service的關(guān)鍵區(qū)別在于睹限,它沒(méi)有Cluster IP浸须,如果解析Headless Service的DNS域名,則返回的是該Service對(duì)應(yīng)的全部Pod的Endpoint列表邦泄。StatefulSet在Headless Service的基礎(chǔ)上又為StatefulSet控制的每個(gè)Pod實(shí)例都創(chuàng)建了一個(gè)DNS域名,這個(gè)域名的格式為:

$(podname).$(HeadlessServicename)

比如一個(gè)3節(jié)點(diǎn)的Kafka的StatefulSet集群對(duì)應(yīng)的Headless Service的名稱(chēng)為kafka裂垦,StatefulSet的名稱(chēng)為kafka顺囊,則StatefulSet里的3個(gè)Pod的DNS名稱(chēng)分別為kafka-0.kafka、kafka-1.kafka蕉拢、kafka-3.kafka特碳,這些DNS名稱(chēng)可以直接在集群的配置文件中固定下來(lái)。

7.Service

1)基本概念

Kubernetes里的每個(gè)Service其實(shí)就是我們經(jīng)常提起的微服務(wù)架構(gòu)中的一個(gè)微服務(wù)晕换,下圖顯示了Pod午乓、RC與Service的邏輯關(guān)系:Kubernetes的Service定義了一個(gè)服務(wù)的訪問(wèn)入口地址,前端的應(yīng)用(Pod)通過(guò)這個(gè)入口地址訪問(wèn)其背后的一組由Pod副本組成的集群實(shí)例闸准,Service與其后端Pod副本集群之間則是通過(guò)Label Selector來(lái)實(shí)現(xiàn)無(wú)縫對(duì)接的益愈。RC的作用實(shí)際上是保證Service的服務(wù)能力和服務(wù)質(zhì)量始終符合預(yù)期標(biāo)準(zhǔn)。

2)配置文件樣例

deploymentYAML文件

#nginx-deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

? name: nginx-web1

spec:

? replicas: 1

? selector:

? ? matchLabels:

? ? ? app: nginx-web1

? ? matchExpressions:

? ? ? - {key: tier, operator: In, values: [frontend]}

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: nginx-web1

? ? ? ? tier: frontend

? ? spec:

? ? ? containers:

? ? ? - name: nginx-web1

? ? ? ? image: nginx

? ? ? ? imagePullPolicy: IfNotPresent

? ? ? ? ports:

? ? ? ? - containerPort: 80


單端口svc版本

#nginx-service.yaml

apiVersion: v1

kind: Service

metadata:

? name: nginx-web1-svc-s

spec:

? ports:

? - port: 80

? selector:

? ? app: nginx-web1

? ? tier: frontend


在spec.ports的定義中夷家,targetPort屬性用來(lái)確定提供該服務(wù)的容器所暴露(EXPOSE)的端口號(hào)蒸其,即具體業(yè)務(wù)進(jìn)程在容器內(nèi)的targetPort上提供TCP/IP接入;port屬性則定義了Service的虛端口库快。前面定義Tomcat服務(wù)時(shí)沒(méi)有指定targetPort摸袁,則默認(rèn)targetPort與port相同,如下面的作用與上述是等價(jià)的

? ports:

? - port: 80

? ? targetPort: 80

(targetPort與port的縮進(jìn)要相同)

多端口版本

#nginx-service-multiple-ports.yaml
apiVersion: v1

kind: Service

metadata:

? name: nginx-web1-svc-m

spec:

? ports:

? - port: 81

? ? name: service-port

? ? targetPort: 80

? - port: 82? ?

? ? name: shutdown-port

? ? targetPort: 80

? selector:

? ? app: nginx-web1

? ? tier: frontend


nodePort svc版本

#nginx-service-nodeport.yaml

apiVersion: v1

kind: Service

metadata:

? name: nginx-web1-svc-n

spec:

type: NodePort

ports:

? - port: 83

? ? targetPort: 80

? ? nodePort: 31002

selector:

? ? app: nginx-web1

? ? tier: frontend


3)命令行例子

kubectl create -f nginx-deployment.yaml

kubectl create -f?nginx-service.yaml

kubectl create -f nginx-service-multiple-ports.yaml

kubectl create -f?nginx-service-nodeport.yaml

kubectl get svc -o wide

kubectl get pod -o wide

以下命令在master或者node上都可以執(zhí)行

#Pod IP:port

curl 10.244.36.73:80????

#單端口版本ClusterIP類(lèi)型Svc义屏,用 ClusterIP:port

curl 10.105.151.82:80????

#多端口版本ClusterIP類(lèi)型Svc靠汁,用 ClusterIP:port

curl 10.106.206.123:81

curl 10.106.206.123:82?

#NodePort類(lèi)型Svc蜂大,用 ClusterIP:port或者NodeIP:EXPOSE_PORT

curl 10.100.25.130:83? ??

curl 10.1.13.26:31002? ??

或者在瀏覽器里瀏覽:http://10.1.13.26:31002? ??

可以查看監(jiān)聽(tīng)端口

sudo netstat -tlp|grep 31002

查看svc詳情

kubectl describe svc nginx-web1-svc-m

可以看出svc的ip:port與pod的endpoints之間的對(duì)應(yīng)關(guān)系

8.Job(批處理任務(wù))

1)基本概念

批處理任務(wù)通常并行(或者串行)啟動(dòng)多個(gè)計(jì)算進(jìn)程去處理一批工作項(xiàng)(work item),在處理完成后蝶怔,整個(gè)批處理任務(wù)結(jié)束奶浦。

Job是一種特殊的Pod副本自動(dòng)控制器,同時(shí)Job控制Pod副本與RC等控制器的工作機(jī)制有以下重要差別添谊。

(1)Job所控制的Pod副本是短暫運(yùn)行的财喳,可以將其視為一組Docker容器,其中的每個(gè)Docker容器都僅僅運(yùn)行一次斩狱。當(dāng)Job控制的所有Pod副本都運(yùn)行結(jié)束時(shí)耳高,對(duì)應(yīng)的Job也就結(jié)束了。Kubernetes在1.5版本之后又提供了類(lèi)似crontab的定時(shí)任務(wù)——CronJob所踊,解決了某些批處理任務(wù)需要定時(shí)反復(fù)執(zhí)行的問(wèn)題泌枪。

(2)Job所控制的Pod副本的工作模式能夠多實(shí)例并行計(jì)算,以TensorFlow框架為例秕岛,可以將一個(gè)機(jī)器學(xué)習(xí)的計(jì)算任務(wù)分布到10臺(tái)機(jī)器上碌燕,在每臺(tái)機(jī)器上都運(yùn)行一個(gè)worker執(zhí)行計(jì)算任務(wù),這很適合通過(guò)Job生成10個(gè)Pod副本同時(shí)啟動(dòng)運(yùn)算继薛。

9.Volume(存儲(chǔ)卷)

1)基本概念

Volume(存儲(chǔ)卷)是Pod中能夠被多個(gè)容器訪問(wèn)的共享目錄修壕。

Kubernetes中的Volume被定義在Pod上,然后被一個(gè)Pod里的多個(gè)容器掛載到具體的文件目錄下

Kubernetes中的Volume與Pod的生命周期相同遏考,但與容器的生命周期不相關(guān)慈鸠,當(dāng)容器終止或者重啟時(shí),Volume中的數(shù)據(jù)也不會(huì)丟失

Kubernetes支持多種類(lèi)型的Volume灌具,例如GlusterFS青团、Ceph等先進(jìn)的分布式文件系統(tǒng)

通過(guò)以下命令可以查看系統(tǒng)支持得存儲(chǔ)卷類(lèi)型

kubectl explain pods.spec.volumes

臨時(shí)存儲(chǔ):emptyDir

半持久化存儲(chǔ):hostPath

持久化存儲(chǔ):pvc,pv咖楣,nfs

分布式存儲(chǔ): glusterfs督笆,rbd,cephfs诱贿,云存儲(chǔ)(EBS,等)

各種類(lèi)型的存儲(chǔ)卷配置方法參見(jiàn)下面的例子

1) emptyDir

volumes:

? ? ? - name: tmp

? ? ? ? emptyDir: {}

2) hostPath

volumes:

? ? ? - name: data

? ? ? ? hostPath:

? ? ? ? ? ? path: "/data"

2)?nfs

volumes:

- name: nfs

? ? ? ? nfs:

? ? ? ? ? ? server: 10.1.1.1?

? ? ? ? ? ? path: "/data"

2)配置文件樣例

#volume-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

? name: web-volume

spec:

? replicas: 1

? selector:

? ? matchLabels:

? ? ? app: web-volume

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: web-volume

? ? spec:

? ? ? volumes:

? ? ? - name: data

? ? ? ? hostPath:

? ? ? ? ? ? path: "/data"

? ? ? - name: tmp

? ? ? ? emptyDir: {}

? ? ? containers:

? ? ? - name: web-volume

? ? ? ? image: nginx

? ? ? ? volumeMounts:

? ? ? ? - mountPath: /test/data

? ? ? ? ? name: data

? ? ? ? - mountPath: /test/tmp

? ? ? ? ? name: tmp

? ? ? ? imagePullPolicy: IfNotPresent

? ? ? ? ports:

? ? ? ? - containerPort: 80

3)命令行例子

kubectl explain pods.spec.volumes

kubectl create -f volume-deploy.yaml

kubectl?get pod

kubectl exec -it?web-volume-869968c6b-bqqvw -- bash

ls看看/test有沒(méi)有兩個(gè)子目錄

9.Persistent Volume(持久化?存儲(chǔ)卷)

1)基本概念

PV可以被理解成Kubernetes集群中的某個(gè)網(wǎng)絡(luò)存儲(chǔ)對(duì)應(yīng)的一塊存儲(chǔ)娃肿,它與Volume類(lèi)似,但有以下區(qū)別瘪松。

◎ PV只能是網(wǎng)絡(luò)存儲(chǔ)咸作,不屬于任何Node,但可以在每個(gè)Node上訪問(wèn)宵睦。

◎ PV并不是被定義在Pod上的记罚,而是獨(dú)立于Pod之外定義的。

◎ PV目前支持的類(lèi)型包括:gcePersistentDisk壳嚎、AWSElasticBlockStore桐智、AzureFile末早、AzureDisk、FC(Fibre Channel)说庭、Flocker然磷、NFS、iSCSI刊驴、RBD(Rados Block Device)姿搜、CephFS、Cinder捆憎、GlusterFS舅柜、VsphereVolume、Quobyte Volumes躲惰、VMware Photon致份、Portworx Volumes、ScaleIO Volumes和HostPath(僅供單機(jī)測(cè)試)础拨。

◎ 需要定義一個(gè)PersistentVolumeClaim對(duì)象,?PV 和 PVC 的 storageClassName 字段必須一樣氮块。

◎ 創(chuàng)建Pod是引用和mount

比較重要的是PV的accessModes屬性,目前有以下類(lèi)型诡宗。

◎ ReadWriteOnce:讀寫(xiě)權(quán)限滔蝉,并且只能被單個(gè)Node掛載。

◎ ReadOnlyMany:只讀權(quán)限塔沃,允許被多個(gè)Node掛載锰提。

◎ ReadWriteMany:讀寫(xiě)權(quán)限,允許被多個(gè)Node掛載芳悲。

2)配置文件樣例

#pv.yaml

kind: PersistentVolume

apiVersion: v1

metadata:

? name: pv-volume

? labels:

? ? type: local

spec:

? storageClassName: manual

? capacity:

? ? storage: 1Gi

? accessModes:

? ? - ReadWriteOnce

? hostPath:

? ? path: "/data/pv"

#pvc.yaml

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

? name: pv-claim

spec:

? storageClassName: manual

? accessModes:

? ? - ReadWriteOnce

? resources:

? ? requests:

? ? ? storage: 1Gi

#pv-pod.yaml

kind: Pod

apiVersion: v1

metadata:

? name: pv-pod

spec:

? volumes:

? ? - name: pv-storage

? ? ? persistentVolumeClaim:

? ? ? ? ? claimName: pv-claim

? containers:

? ? - name: pv-container

? ? ? image: nginx

? ? ? ports:

? ? ? ? - containerPort: 80

? ? ? ? ? name: "http-server"

? ? ? volumeMounts:

? ? ? ? - mountPath: "/usr/share/nginx/html"

? ? ? ? ? name: pv-storage

#pv-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

? name: pv-web

spec:

? replicas: 1

? selector:

? ? matchLabels:

? ? ? app: pv-web

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: pv-web

? ? spec:

? ? ? volumes:

? ? ? - name: pv-storage

? ? ? ? persistentVolumeClaim:

? ? ? ? ? ? claimName: pv-claim

? ? ? containers:

? ? ? - name: pv-web

? ? ? ? image: nginx

? ? ? ? volumeMounts:

? ? ? ? - mountPath: /data

? ? ? ? ? name: pv-storage

? ? ? ? imagePullPolicy: IfNotPresent

? ? ? ? ports:

? ? ? ? - containerPort: 80

3)命令行例子

kubectl create -f pv.yaml

kubectl create -f pvc.yaml

kubectl create -f pv-pod.yaml

kubectl get pv

kubectl get pvc

#對(duì)應(yīng)的deploy掛載的卷

kubectl exec -it pv-pod bash

ls?/usr/share/nginx/html

#對(duì)應(yīng)的deploy掛載的卷

kubectl exec -it pv-web-66c4dc975c-q2mjp -- bash

ls /data

在node上/data/pv目錄下touch文件,回到容器中看看是否有這個(gè)文件

10.Namespace

1)基本概念

Namespace(命名空間)是Kubernetes系統(tǒng)中的另一個(gè)非常重要的概念边坤,Namespace在很多情況下用于實(shí)現(xiàn)多租戶(hù)的資源隔離名扛。Namespace通過(guò)將集群內(nèi)部的資源對(duì)象“分配”到不同的Namespace中,形成邏輯上分組的不同項(xiàng)目茧痒、小組或用戶(hù)組肮韧,便于不同的分組在共享使用整個(gè)集群的資源的同時(shí)還能被分別管理。

2)配置文件樣例

#ns.yaml

---

apiVersion: v1

kind: Namespace

metadata:

? name: dev

---

apiVersion: apps/v1

kind: Deployment

metadata:

? name: web-ns1

? namespace: dev

spec:

? replicas: 1

? selector:

? ? matchLabels:

? ? ? app: web-ns1

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: web-ns1

? ? spec:

? ? ? containers:

? ? ? - name: web-ns1

? ? ? ? image: nginx

? ? ? ? imagePullPolicy: IfNotPresent

? ? ? ? ports:

? ? ? ? - containerPort: 80

3)命令行例子

kubectl get ns

kubectl get pod -n dev


11.Annotation

Annotation(注解)與Label類(lèi)似旺订,也使用key/value鍵值對(duì)的形式進(jìn)行定義弄企。不同的是Label具有嚴(yán)格的命名規(guī)則,它定義的是Kubernetes對(duì)象的元數(shù)據(jù)(Metadata)区拳,并且用于Label Selector拘领。Annotation則是用戶(hù)任意定義的附加信息,以便于外部工具查找樱调。在很多時(shí)候约素,Kubernetes的模塊自身會(huì)通過(guò)Annotation標(biāo)記資源對(duì)象的一些特殊信息

12.ConfigMap

Docker通過(guò)將程序届良、依賴(lài)庫(kù)、數(shù)據(jù)及配置文件“打包固化”到一個(gè)不變的鏡像文件中的做法圣猎,解決了應(yīng)用的部署的難題士葫,但這同時(shí)帶來(lái)了棘手的問(wèn)題,即配置文件中的參數(shù)在運(yùn)行期如何修改的問(wèn)題送悔。我們不可能在啟動(dòng)Docker容器后再修改容器里的配置文件慢显,然后用新的配置文件重啟容器里的用戶(hù)主進(jìn)程。為了解決這個(gè)問(wèn)題欠啤,Docker提供了兩種方式:

◎ 在運(yùn)行時(shí)通過(guò)容器的環(huán)境變量來(lái)傳遞參數(shù)荚藻;

◎ 通過(guò)Docker Volume將容器外的配置文件映射到容器內(nèi)。

這兩種方式都有其優(yōu)勢(shì)和缺點(diǎn)跪妥,

◎ 在目標(biāo)主機(jī)上先創(chuàng)建好對(duì)應(yīng)的配置文件鞋喇,然后才能映射到容器里。

◎ 在分布式情況下變得更為嚴(yán)重眉撵,寫(xiě)入(修改)多臺(tái)服務(wù)器上的某個(gè)指定文件侦香,并確保這些文件保持一致

Kubernetes使用ConfigMap資源對(duì)象:把所有的配置項(xiàng)都當(dāng)作key-value字符串,比如password=123456纽疟、user=root罐韩,這些配置項(xiàng)可以作為Map表中的一個(gè)項(xiàng),整個(gè)Map的數(shù)據(jù)可以被持久化存儲(chǔ)在Kubernetes的Etcd數(shù)據(jù)庫(kù)中污朽,然后提供API以方便Kubernetes相關(guān)組件或客戶(hù)應(yīng)用CRUD操作這些數(shù)據(jù)散吵。


2)配置文件樣例

#cm-appvars.yaml

appvars.yaml

apiVersion: v1

kind: ConfigMap

metadata:

? name: cm-appvars

data:

? apploglevel: info

? appdatadir: /var/data

#test-pod-envfrom-and-use-envvar.yaml

apiVersion: v1

kind: Pod

metadata:

? name: cm-test-pod

spec:

? containers:

? - name: cm-test

? ? image: nginx

? ? command: [ "/bin/sh", "-c", "env" ]

? ? envFrom:

? ? - configMapRef:

? ? ? name: cm-appvars

? ? env:

? ? - name: APPLOGLEVEL

? ? ? valueFrom:

? ? ? ? configMapKeyRef:

? ? ? ? ? name: cm-appvars

? ? ? ? ? key: apploglevel

? ? - name: APPDATADIR

? ? ? valueFrom:

? ? ? ? configMapKeyRef:

? ? ? ? ? name: cm-appvars

? ? ? ? ? key: appdatadir

? restartPolicy: Never


3)命令行例子

kubectl create -f?cm-appvars.yaml

kubectl create -f?test-pod-envfrom-and-use-envvar.yaml

kubectl log?cm-test-pod

就可以看到cm-appvars.yaml中定義的環(huán)境變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蟆肆,隨后出現(xiàn)的幾起案子矾睦,更是在濱河造成了極大的恐慌,老刑警劉巖炎功,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枚冗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛇损,警方通過(guò)查閱死者的電腦和手機(jī)赁温,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淤齐,“玉大人股囊,你說(shuō)我怎么就攤上這事「模” “怎么了稚疹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祭务。 經(jīng)常有香客問(wèn)我贫堰,道長(zhǎng)穆壕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任其屏,我火速辦了婚禮喇勋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偎行。我一直安慰自己川背,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蛤袒。 她就那樣靜靜地躺著熄云,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妙真。 梳的紋絲不亂的頭發(fā)上缴允,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音珍德,去河邊找鬼练般。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锈候,可吹牛的內(nèi)容都是我干的薄料。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼泵琳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摄职!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起获列,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谷市,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后击孩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體歌懒,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年溯壶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甫男。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡且改,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出板驳,到底是詐尸還是另有隱情又跛,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布若治,位于F島的核電站慨蓝,受9級(jí)特大地震影響感混,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜礼烈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一弧满、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧此熬,春花似錦庭呜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至阴汇,卻和暖如春数冬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搀庶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工拐纱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人地来。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓戳玫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親未斑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咕宿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容