pod启动过程,pod调度失败怎么解决

首页 > 经验 > 作者:YD1662022-11-04 18:06:18

在上一章节,有一个问题一直没有解决

[qq@k8snode1 ~]$ kubectl get pod -n dev NAME READY STATUS RESTARTS AGE nginx-64b7c758f4-46xld 1/1 Running 0 45h nginx-64b7c758f4-k2gk5 1/1 Running 0 45h nginx-64b7c758f4-wwhn4 1/1 Running 0 45h pod-base 1/2 CrashLoopBackOff 13 (2m29s ago) 44m 《这里的pod一直没有执行成功,这一章节我们就了解一下为何这个pod无法启动》

这关系到docker的一个机制,docker创建容器以后,容器内一定要执行一个程序,才能保证我们的实验环境持续运行,如果docker发现没有程序运行,就会关掉那个容器,而我们创建的第二个容器busbox其实是一个工具的集合,并不是一个程序,所以容器就会不断的关闭,kubectl启动修复,没有程序执行再关闭

解决方法就是,它要求有个程序执行,我们就给他个程序执行

老规矩,创建个文件执行先 你可以使用上次的文件,加以修改就可 [qq@k8snode1 ~]$ cp pod-imagepullpolicy.yaml pod-command.yaml [qq@k8snode1 ~]$ vi pod-command.yaml [qq@k8snode1 ~]$ cat pod-command.yaml apiVersion: v1 kind: Pod metadata: name: pod-command namespace: dev spec: containers: - name: nginx image: nginx:1.17.1 - name: busybox image: busybox:1.30 command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date %T) >> /tmp/hello.txt; sleep 3; done"] 这部分是个shell语句,有时间也许我会搞一期出来 大致意思就是,每隔三秒往一个叫hello.txt输入日期无限循环 /bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date %T) >> /tmp/hello.txt; sleep 3; done kubectl要程序,我们给他个程序就行了 [qq@k8snode1 ~]$ kubectl apply -f pod-command.yaml pod/pod-command created [qq@k8snode1 ~]$ kubectl get pod -n dev NAME READY STATUS RESTARTS AGE nginx-64b7c758f4-46xld 1/1 Running 0 6d2h nginx-64b7c758f4-k2gk5 1/1 Running 0 6d2h nginx-64b7c758f4-wwhn4 1/1 Running 0 6d2h pod-base 1/2 CrashLoopBackOff 41 (4m49s ago) 4d5h pod-command 2/2 Running 0 4m22s pod-imagepullpolicy 1/2 CrashLoopBackOff 27 (4m30s ago) 4d4h 执行成功 pod-command 2/2 Running 0 4m22s 两个全启动了,状态是running 做到这里了,我们可以进去看一下容器的内部看看,那个hello.txt文件 进入容器的命令和docker很相似 kubectl exec pod名称 -n 命名空间 -it -c 容器名称 /bin/sh docker exec -it 容器ID 语句bashShell 是在容器中打开新的终端,并且可以启动新的进程 好,废话少说我们进去看一哈子 [qq@k8snode1 ~]$ kubectl exec pod-command -n dev -it -c busybox /bin/sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # ls bin dev etc home proc root sys tmp usr var 看脚本得知,我们的文件在tmp下 / # cd tmp/ /tmp # ls hello.txt /tmp # tail -f hello.txt 11:15:38 11:15:41 11:15:44 11:15:47 11:15:50 11:15:53 11:15:56 11:15:59 11:16:02 11:16:05 11:16:08 11:16:11 11:16:14 11:16:17 11:19:02 ^C /tmp # exit

特别说明:
通过上面发现command已经可以完成启动命令和传递参数的功能,为什么这里还要提供一个args选项,用于传递参数呢?这其实跟docker有点关系,kubernetes中的command、args两项其实是实现覆盖Dockerfile中ENTRYPOINT(配置容器启动后执行的命令)的功能。
1 如果command和args均没有写,那么用Dockerfile的配置。
2 如果command写了,但args没有写,那么Dockerfile默认的配置会被忽略,执行输入的command
3 如果command没写,但args写了,那么Dockerfile中配置的ENTRYPOINT的命令会被执行,使用当前args的参数
4 如果command和args都写了,那么Dockerfile的配置被忽略,执行command并追加上args参数

到这里我们可以发现其实kubectl的yaml文件的主要功能是代替DockerFile的功能

kubectl env,环境变量,用于在pod中的容器设置环境变量。

docker ENV #构建的时候设置环境变量

来看一下怎么写 apiVersion: v1 kind: Pod metadata: name: pod-env namespace: dev spec: containers: - name: busybox image: busybox:1.30 command: ["/bin/sh","-c","while true;do /bin/echo $(date %T);sleep 60; done;"] env: # 设置环境变量列表 - name: "username" value: "admin" - name: "password" value: "123456" [qq@k8snode1 ~]$ vi pod-env.yaml [qq@k8snode1 ~]$ kubectl apply -f pod-env.yaml pod/pod-env created [qq@k8snode1 ~]$ kubectl get pod -n dev NAME READY STATUS RESTARTS AGE nginx-64b7c758f4-46xld 1/1 Running 0 6d2h nginx-64b7c758f4-k2gk5 1/1 Running 0 6d2h nginx-64b7c758f4-wwhn4 1/1 Running 0 6d2h pod-base 1/2 CrashLoopBackOff 48 (3m45s ago) 4d6h pod-command 2/2 Running 0 39m pod-env 1/1 Running 0 23s pod-imagepullpolicy 1/2 CrashLoopBackOff 34 (3m40s ago) 4d5h [qq@k8snode1 ~]$ kubectl exec pod-env -n dev -c busybox -it /bin/sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # echo $username admin / # echo $password 123456 / # exit [qq@k8snode1 ~]$

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.