1. 程式人生 > 其它 >第五章 執行應用 第五章 執行應用

第五章 執行應用 第五章 執行應用

 

第五章 執行應用

轉載自:

 https://www.cnblogs.com/liufei1983/p/10190321.html

5.1 Deployment

   5.1.1 執行Deployment

       kubectl create namespace liufei                                  #  建立namespace

  kubectl run nginx-deployment -n liufei  --image=nginx:1.7.9 --replicas=2             # 執行deployment 

       kubectl get deployment -n liufei                              #  檢視deployment

  kubectl describe deployment -n liufei                                                                    # 檢視deployment更詳細的資訊

     kubectl get replicaset -n liufei                                                                                #  檢視副本控制器

  kubectl describe replicaset -n liufei                                                                       #   副本控制器詳細資訊

       總結一下執行deployment的過程:

               A:使用者通過kubectl建立deployment。

               B:Deployment建立ReplicaSet。

       C:ReplicaSet建立Pod。  

       5.1.2 命令 VS 配置檔案

  K8s兩種建立資源的方式:

  (1)用kubectl命令的方式直接建立:比如前面的建立deployment

  (2)通過配置檔案和kubectl apply建立,

          kubectl apply -f nignx.yml   

apiVersion: extensions/v1beta1             # 配置格式的版本
kind: Deployment                           # 建立的資源型別,這裡是deployment                          
metadata:                                  # 元資料
  name: nginx-deployment                   # name是必須的元資料
spec: # spec是Deployment的規格說明 replicas: 2                 # 副本數量 template:                   # Pod的模板 metadata: # Pod的元資料,至少要定義label labels: app: web_server # label的key和value可以隨意指定 spec:                     # 描述Pod的規格,此部分定義Pod中每一個容器的屬性,nameimage是必須的 containers: - name: nginx image: nginx:1.7.9

  5.1.3 Deployment配置檔案簡介

  上面檔案中介紹了各個欄位的含義。

   如何刪除這些資源:

   kubectl delete deployment nginx-deployment           # 刪除之後deployment 和 pods就都沒有了。

        或   kubectl  delete -f nginx.yml

     5.1.4 伸縮(線上增加或減少Pod的副本數)

  可以改replicas的數來更改Pod副本數量。預設不會將Pod排程到Master節點。當然,通過命令也可以將Master節點也當做Node來用。

   如何使得Deployment的改動生效:

  (1)改動nginx.yml檔案後, 直接執行  kubeclt apply -f nginx.yml 就可以生效。

  (2) kubectl edit deployment    deployment_XXXX,  改動後,儲存,即刻生效。

     5.1.5 Failover 

   當有一個Node故障時,k8s會檢測到,並且Pod狀態會變成Unknown, 其他狀態良好的Node上回建立新Pod來保證Pod副本的數量。

  5.1.6 用label控制Pod的位置

  預設,Scheduler會將Pod排程到所有可用的Node。但是有時希望將Pod部署到指定的Node,比如將有大量磁碟IO的Pod部署到配置了SSD的Node;或者Pod需要GPU,需要執行在配置了GPU的節點上。

  K8s通過label來實現這個功能。

  label是key-value對,各種資源都可以設定label,靈活新增各種自定義屬性。比如執行如下命令標註galaxykubernetes03 是配置了SSD的節點。

  kubectl label node galaxykubernetes03 disktype=ssd             # 給節點打上label

 

   kubeusr@GalaxyKubernetesMaster:~$ kubectl label node galaxykubernetes03 disktype=ssd
   node "galaxykubernetes03" labeled

         kubectl get node --show-labels                         #  檢視label

   可以發現galaxykubernetes03 被打上了label

  下面可以指定將Pod部署到galaxykubernetes03, 編輯nginx.yml

   

         在Pod模板的spec裡通過nodeSelector指定將此Pod部署到具有label具有disktype=ssd的node上。

    然後檢視pod執行情況:發現Pod都執行在指定的node上了。

kubeusr@GalaxyKubernetesMaster:~$ kubectl get pods -o wide
NAME                                READY     STATUS    RESTARTS   AGE       IP            NODE
nginx-deployment-6fdd68f578-7djlh   1/1       Running   0          14s       10.244.2.40   galaxykubernetes03
nginx-deployment-6fdd68f578-dqhlb   1/1       Running   0          14s       10.244.2.41   galaxykubernetes03
nginx-deployment-6fdd68f578-hr9fd   1/1       Running   0          14s       10.244.2.43   galaxykubernetes03
nginx-deployment-6fdd68f578-n2jh6   1/1       Running   0          14s       10.244.2.39   galaxykubernetes03
nginx-deployment-6fdd68f578-r5rx6   1/1       Running   0          14s       10.244.2.42   galaxykubernetes03

          刪除label:

         kubectl label node galaxykubernetes03 disktype-

 5.2 DaemonSet

  Deployment部署的副本Pod會分佈在各個Node上,每個node都可能執行好幾個副本。

   DaemonSet的不同之處是: 每個Node上最多隻能執行一個副本。其典型應用場景:

  (1)在叢集的每個節點上執行儲存Daemon,比如glusterd或ceph

  (2)在每個節點上執行日誌收集Deamon,比如flunentd或 logstash。

  (3)在每個節點上執行監控Deamon,比如Prometheus Node Exporter或collectd.

 

kubeusr@GalaxyKubernetesMaster:~$ kubectl get DaemonSet -n kube-system
NAME              DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR                   AGE
kube-flannel-ds   5         5         5         5            5           beta.kubernetes.io/arch=amd64   127d
kube-proxy        5         5         5         5            5           <none>                          127d

 

     5.2.1 kube-flannel-ds

  5.2.2 kube-proxy

         kubeusr@GalaxyKubernetesMaster:~$ kubectl edit daemonSet kube-proxy --namespace=kube-system

  5.2.3 執行自己的daemonSet

         略

 5.3 Job

  Job適於:

  (1)一次性任務,比如批處理,執行完就銷燬

  (2)定期執行的任務, 比如Cronjob

apiVersion: batch/v1               # Job的apiVersion
kind: Job
metadata:
  name: myjob
spec:
  template:
    metadata:
      name: myjob
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo", "hell k8s job! "]
      restartPolicy: Never        # 在什麼情況下會重啟容器,對於job可以是Never or OnFailure。  對於controller(deployment)可以是Always 

 kubectl apply -f myjob.yml
 job.batch "myjob" created

kubeusr@GalaxyKubernetesMaster:~$ kubectl get job
NAME      DESIRED   SUCCESSFUL   AGE
myjob     1         1            3mkubeusr@GalaxyKubernetesMaster:~$ kubectl get pod --show-all

kubectl get pod --show-all (書上說需要使用--show-all引數才能看見completed 狀態的jOb,但是我不加--show-all, 也能看見)           

Flag --show-all has been deprecated, will be removed in an upcoming release
NAME                             READY    STATUS  RESTARTS  AGE
myjob-mx6rc                          0/1     Completed      0    4m            # Job已經執行完了
nginx-deployment-6fdd68f578-7djlh    1/1     Running        0    10h
nginx-deployment-6fdd68f578-dqhlb    1/1     Running        0    10h
nginx-deployment-6fdd68f578-hr9fd    1/1     Running        0    10h
nginx-deployment-6fdd68f578-n2jh6    1/1     Running        0    10h
nginx-deployment-6fdd68f578-r5rx6    1/1     Running        0    10h

檢視job輸出的日誌

kubectl logs -f myjob-mx6rc
hell k8s job!

  5.3.1 Pod失敗的情況

   看如下的命令。

kubeusr@GalaxyKubernetesMaster:~$ kubectl get job
NAME      DESIRED   SUCCESSFUL   AGE                          # SUCCESSFUL的數目為0
myjob     1         0            31s
/*/*/*/*/*/*/*/*

kubeusr@GalaxyKubernetesMaster:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-n2bwz 0/1 ContainerCannotRun 0 1m
myjob-pmx7t 0/1 ContainerCannotRun 0 1m
myjob-rzm5m 0/1 ContainerCreating 0 43s
nginx-deployment-6fdd68f578-7djlh 1/1 Running 0 10h
nginx-deployment-6fdd68f578-dqhlb 1/1 Running 0 10h
nginx-deployment-6fdd68f578-hr9fd 1/1 Running 0 10h
nginx-deployment-6fdd68f578-n2jh6 1/1 Running 0 10h
nginx-deployment-6fdd68f578-r5rx6 1/1 Running 0 10h

/*/*/*/*/*/*/*/*

kubeusr@GalaxyKubernetesMaster:~$ kubectl logs -f myjob-n2bwz
container_linux.go:247: starting container process caused "exec: \"invalid_command\": executable file not found in $PATH"

5.3.2 Job的並行性

  同時執行多個job,提高Job的執行效率。這個可以通過parallelism、completions設定。

  實際中用處不大。

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  completions: 6               # 最多有6個job是completion狀態
  parallelism: 2               # 並行2個,預設1
  template:
    metadata:
      name: myjob
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo", "hell k8s job! "]
      restartPolicy: Never

5.3.3 定時Job

  Cronjob是K8s提供的定時任務。

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: hello
spec:
  schedule:"*/1 * * * *"               #每分鐘啟動一次
  jobTemplate:                        #job的模板
    spec:
      template:
        spec:
          containers:
          - name:hello
            image:busybox
            command: ["echo", "hell k8s cron job! "]
          restartPolicy:OnFailure

  kubeusr@GalaxyKubernetesMaster:~$ kubectl apply -f cronjob.yml
  error: unable to recognize "cronjob.yml": no matches for kind "CronJob" in version "batch/v2alpha1"

  建立任務失敗。因為K8s預設沒有enable cronjob

  安裝如下步驟:

   (1)切換到root,進入/etc/kubernetes/manifests        

        執行:  chmod -R 777 *   改檔案的屬性。

       (2)修改 /etc/kubernetes/manifests/kube-apiserver.yaml, enable cronjob.

                  加上    --runtime-config=batch/v2alpha1=true

          (3) 重啟kubelet服務。

           systemctl restart kubelet.service

 

     kubectl api-versions|grep v2               # 檢視是否生效
    autoscaling/v2beta1
    batch/v2alpha1

         (4)  再次建立cronjob 

kubeusr@GalaxyKubernetesMaster:~$ kubectl apply -f cronjob.yml
cronjob.batch "hello" created

       

kubeusr@GalaxyKubernetesMaster:~$ kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST SCHEDULE   AGE
hello     */1 * * * *   False     0         <none>          49s
kubeusr@GalaxyKubernetesMaster:~$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1546050900   1         1            38s
kubeusr@GalaxyKubernetesMaster:~$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1546050900   1         1            1m
hello-1546050960   1         0            14s

 

每隔一分鐘啟動一個Pod