例1:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
例2:在上面yaml的基礎(chǔ)上添加了volume
[root@kub-k8s-master prome]# vim deployment.yaml
apiVersion: apps/v1 #注意版本號
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector: #屬性,選擇器
matchLabels:
app: nginx
replicas: 2 #管理的副本個數(shù)
template: #模板屬性
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: daocloud.io/library/nginx
ports:
- containerPort: 80
volumeMounts: #定義掛載卷
- mountPath: "/usr/share/nginx/html"
name: nginx-vol
volumes: #定義共享卷
- name: nginx-vol
emptyDir: {}
創(chuàng)建Deployment:
將上述的YAML文件保存為deployment.yaml,然后創(chuàng)建Deployment:
[root@kub-k8s-master prome]# kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
*檢查Deployment的列表:啟動之后需要創(chuàng)建時間比較長
通過 kubectl get 命令檢查這個 YAML 運行起來的狀態(tài):
[root@kub-k8s-master prome]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 2m22s
[root@kub-k8s-master prome]# kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-59c4b86474-2llrt 1/1 Running 0 2m51s
nginx-deployment-59c4b86474-n2r2m 1/1 Running 0 2m51s
- 在這里加上了一個 -l 參數(shù)钧忽,即獲取所有匹配 app: nginx 標簽的 Pod。需要注意的是瘟则,在命令行中,所有 key-value 格式的參數(shù)枝秤,都使用"="而非":"表示醋拧。
刪除Deployment:
[root@k8s-master ~]# kubectl delete deployments nginx-deployment
deployment "nginx-deployment" deleted
或者
[root@k8s-master ~]# kubectl delete -f deployment.yaml
如果Pod出現(xiàn)故障,對應(yīng)的服務(wù)也會掛掉宿百,所以Kubernetes提供了一個Deployment的概念 趁仙,
目的是讓Kubernetes去管理一組Pod的副本洪添,也就是副本集 垦页,這樣就能夠保證一定數(shù)量的副本一直可用,不會因為某一個Pod掛掉導(dǎo)致整個服務(wù)掛掉干奢。
Deployment 還負責在 Pod 定義發(fā)生變化時痊焊,對每個副本進行滾動更新(Rolling Update)。
這樣使用一種 API 對象(Deployment)管理另一種 API 對象(Pod)的方法忿峻,在 k8s 中薄啥,叫作"控制器"模式(controller pattern)。Deployment 扮演的正是 Pod 的控制器的角色逛尚。
apiVersion:注意這里apiVersion對應(yīng)的值是extensions/v1beta1或者apps/v1.這個版本號需要根據(jù)安裝的Kubernetes版本和資源類型進行變化垄惧,記住不是寫死的。此值必須在kubectl apiversion中 :
[root@kub-k8s-master prome]# kubectl api-versions
apps/v1beta1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1beta1
autoscaling/v1
batch/v1
certificates.k8s.io/v1alpha1
extensions/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1alpha1
storage.k8s.io/v1beta1
v1
kind:資源類型:這里指定為Deployment绰寞。
metadata:指定一些meta信息到逊,包括名字或標簽之類的。
每一個 API 對象都有一個叫作 Metadata 的字段滤钱,這個字段是 API 對象的"標識"觉壶,即元數(shù)據(jù),
也是我們從 Kubernetes 里找到這個對象的主要依據(jù)件缸。labels:Labels是最主要的字段,是一組 key-value 格式的標簽,k8s中的所有資源都支持攜帶label,默認情況下铜靶,pod的label會復(fù)制rc的label
k8s使用用戶自定義的key-value鍵值對來區(qū)分和標識資源集合(就像rc、pod等資源)他炊,這種鍵值對稱為label争剿。
像 Deployment 這樣的控制器對象已艰,就可以通過這個 Labels 字段從 Kubernetes 中過濾出它所關(guān)心的被控制對象。Annotations:在 Metadata 中蚕苇,還有一個與 Labels 格式旗芬、層級完全相同的字段叫 Annotations,
它專門用來攜帶 key-value 格式的內(nèi)部信息捆蜀。所謂內(nèi)部信息疮丛,指的是對這些信息感興趣的,
是 Kubernetes 組件本身辆它,而不是用戶誊薄。所以大多數(shù) Annotations,都是在 Kubernetes 運行過程中锰茉,被自動加在這個 API 對象上呢蔫。selector:過濾規(guī)則的定義,是在 Deployment 的"spec.selector.matchLabels"字段飒筑。一般稱之為:Label Selector片吊。
pod的label會被用來創(chuàng)建一個selector,用來匹配過濾攜帶這些label的pods协屡。
使用labels定位pods:
[root@kub-k8s-master prome]# kubectl get pods -l app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-59c4b86474-2llrt 1/1 Running 0 16m 10.244.2.15 kub-k8s-node2
nginx-deployment-59c4b86474-n2r2m 1/1 Running 0 16m 10.244.1.39 kub-k8s-node1
檢查你的Pod的IPs:
[root@kub-k8s-master prome]# kubectl get pods -l app=nginx -o json | grep podIP
"podIP": "10.244.2.15",
"podIPs": [
"podIP": "10.244.1.39",
"podIPs": [
spec : 一個 k8s 的 API 對象的定義俏脊,大多可以分為 Metadata 和 Spec 兩個部分。
前者存放的是這個對象的元數(shù)據(jù)肤晓,對所有 API 對象來說爷贫,這一部分的字段和格式基本上是一樣的;
而后者存放的补憾,則是屬于這個對象獨有的定義漫萄,用來描述它所要表達的功能。
這里定義需要兩個副本盈匾,此處可以設(shè)置很多屬性腾务,主要是受此Deployment影響的Pod的選擇器replicas:定義的 Pod 副本個數(shù) (spec.replicas) 是:2
template:定義了一個 Pod 模版(spec.template),這個模版描述了想要創(chuàng)建的 Pod 的細節(jié)削饵。
例子里岩瘦,這個 Pod 里只有一個容器,這個容器的鏡像(spec.containers.image)是 nginx:latest葵孤,這個容器監(jiān)聽端口(containerPort)是 80担钮。volumes:是屬于 Pod 對象的一部分。需要修改 template.spec 字段
例2中尤仍,在 Deployment 的 Pod 模板部分添加了一個 volumes 字段箫津,定義了這個 Pod 聲明的所有 Volume。它的名字叫作 nginx-vol,類型是 emptyDir苏遥。
關(guān)于emptyDir 類型:等同于 Docker 的隱式 Volume 參數(shù)饼拍,即:不顯式聲明宿主機目錄的 Volume。
所以田炭,Kubernetes 也會在宿主機上創(chuàng)建一個臨時目錄师抄,這個目錄將來就會被綁定掛載到容器所聲明的 Volume 目錄上。
k8s 的 emptyDir 類型教硫,只是把 k8s 創(chuàng)建的臨時目錄作為 Volume 的宿主機目錄叨吮,交給了 Docker。這么做的原因瞬矩,是 k8s 不想依賴 Docker 自己創(chuàng)建的那個 _data 目錄茶鉴。
volumeMounts:Pod 中的容器,使用的是 volumeMounts 字段來聲明自己要掛載哪個 Volume景用,并通過 mountPath 字段來定義容器內(nèi)的 Volume 目錄涵叮,比如:/usr/share/nginx/html。
hostPath:k8s 也提供了顯式的 Volume 定義伞插,它叫做 hostPath割粮。比如下面的這個 YAML 文件:
...
volumes:
- name: nginx-vol
hostPath:
path: /var/data
這樣,容器 Volume 掛載的宿主機目錄媚污,就變成了 /var/data