部署一個簡單pod

例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 標(biāo)簽的 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 還負責(zé)在 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信息,包括名字或標(biāo)簽之類的。
    每一個 API 對象都有一個叫作 Metadata 的字段,這個字段是 API 對象的"標(biāo)識",即元數(shù)據(jù),
    也是我們從 Kubernetes 里找到這個對象的主要依據(jù)。

  • labels:Labels是最主要的字段,是一組 key-value 格式的標(biāo)簽,k8s中的所有資源都支持?jǐn)y帶label,默認情況下,pod的label會復(fù)制rc的label
    k8s使用用戶自定義的key-value鍵值對來區(qū)分和標(biāo)識資源集合(就像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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 虛擬機: VMware ESXi 操作系統(tǒng):CentOS Linux release 7.5 # 固定靜態(tài)IP [...
    andrewkk閱讀 2,077評論 0 2
  • Kubernetes 簡介 Kubernetes 是什么? Kubernetes 是一個可移植的、可擴展的開源平臺...
    王勇1024閱讀 927評論 0 2
  • 可以把容器想像成豆莢里的豆子,把一個或多個關(guān)系緊密的豆子包在一起就是豆莢(一個Pod)。在k8s中我們不會直接操作...
    xuxw閱讀 460評論 0 0
  • K8S一、二進制搭建1.安裝要求(1)CentOS 7(2)禁止swap(3)集群間互通 2.操作系統(tǒng)初始化(1)...
    Saka_2859閱讀 576評論 0 0
  • 控制器管理的 Pod: 生產(chǎn)環(huán)境中可以用控制器創(chuàng)建和管理多個 pod。控制器在 pod 失敗的情況下可以處理副本、...
    菜頭_355f閱讀 865評論 0 1

友情鏈接更多精彩內(nèi)容