第五章 运行应用
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中每一个容器的属性,name和image是必须的 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