在上一章节,有一个问题一直没有解决
[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 ~]$