软件开发架构师

第五章 运行应用

架构 275 2019-03-22 23:12

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

 

 

 

 

  

  

  

    

 

  

 

文章评论