文章目录
- 进入pod容器的命令
- pod中只有1个用户容器
- pod中只有2个(含)以上用户容器
- yaml中的字段不清楚后面跟什么,通过explain来查看
- 查看pod内指定容器的日志
- Pod内各个容器的服务端口不能相同
- 资源对象的创建
- 方式一
- 方式二
- 查看pod的详细信息
- 查看yaml文件的创建后的资源对象的信息
- 查看pod的事件信息(pod状态异常时有用)
- 查看node的详情信息
- 删除pod的方式
进入pod容器的命令
可选项:
-c, --container='': 容器的名字. 如果忽略, 默认是进入pod中的第一个容器
-p, --pod='': Pod的名字 (-p 可以省略 后面直接跟 pod的名字)
-i, --stdin=false: 传递标准输入到容器中
-t, --tty=false: 标准输入是一个终端
-n, --namespace string 如果存在, 命令行请求的命名空间作用范围
pod中只有1个用户容器
只有一个容器时,进入时不需要指定容器,
# 例如 test-pod 为pod名称
kubectl exec -it test-pod -n test -- /bin/sh
pod中只有2个(含)以上用户容器
当有多个容器时就必须加上指定容器(否则默认进入第一个容器),
因此需要明确指定你想进入的容器名称
kubectl exec -it test-pod -c mysql -n test -- /bin/sh
exec:表示在容器内执行命令
-- /bin/sh:表示在容器内打开一个shell终端
遇到的问题:
kubectl exec -it -p mysql-n6tc2 -c mysql -n default – /bin/sh
提示:-p POD_NAME is DEPRECATED and will be removed in a future version. Use exec POD_NAME instead。
意思大概说的是 将来的版本不再 支持 -p pod名字 ,使用 exec pod名字来代替。
kubectl exec -it -c mysql -n default – /bin/sh #错误,会报错
提示:error: expected ‘exec POD_NAME COMMAND [ARG1] [ARG2] … [ARGN]’.
POD_NAME and COMMAND are required arguments for the exec command (意思是说对于exec命令来说 POD的名字和 命令是必须的)
See ‘kubectl exec -h’ for help and examples.kubectl exec -h #查看exec后面可以跟什么命令或参数 -h 是 -help的缩写
Usage:
kubectl exec POD [-c CONTAINER] – COMMAND [args…] [options]
yaml中的字段不清楚后面跟什么,通过explain来查看
kubectl explain pods.spec.volumes.emptyDir
kubectl explain pods.spec.containers.command
查看pod内指定容器的日志
和kubectl exec 一样,如果一个pod内存在多个容器时,需要通过 -c 指定容器名
kubectl logs test-pod -c nginx-1 #test-pod是pod名称 nginx-1是容器名称
如果存在多个容器,不指定 -c的话,会报以下错误:
#error: a container name must be specified for pod redis-php, choose one of: [frontend redis-master] 意思大概是:必须为pod名为redis-php的pod,指定一个容器名,可选择的容器为 frontend 和 redis-master。
Pod内各个容器的服务端口不能相同
1.注意不能在同一个Pod中创建两个使用相同端口的容器,因为同一个pod内容器之间的访问是通过localhost:端口/接口名的方式,即共享网络栈。pod有自己的ip,但是pod内的容器没有自己的独立ip。公用pod的ip。
2.同一个node里的不同pod之间是隔离的(类似于直接通过docker命令 在虚拟机或物理机上创建的容器)。而同一个pod内的不同容器之间是不隔离的,会共享ip,数据卷等资源。
3.k8s管理调度的最小单元是pod,不是pod内的各个容器。
4.一般情况下一个pod内只有一个用户容器,只有当一组容器有紧密联系时,才把这组容器放到一个pod里。
资源对象的创建
方式一
kubectl create -f xxxx.yaml
用于创建 Kubernetes 对象。如果对应的资源已经存在,则会返回错误,
此时需要先删除原有的资源对象,然后再执行创建操作。如果资源对象不存在,
则会自动创建对应的资源对象
kubectl replace -f pod1.yaml --force
这种先使用 kubectl create 命令,修改yaml配置文件后,然后再使用 kubectl replace 命令的操作,称为命令式配置文件操作。
命令执行完成后,名为 pod1 的 Pod 会被删除后再新建
例如:
[root@k8s-master k8s]# kubectl replace -f frontend-localredis-pod.yaml --force
pod “redis-php” deleted
pod/redis-php replaced
方式二
kubectl apply -f xxxx.yaml
用于创建或更新一个 Kubernetes 对象。如果该资源对象已经存在,则会首先尝试更新对应的字段值和
配置,如果不存在则会自动创建资源对象。
kubectl apply -f pod1.yaml 修改yaml配置文件后
再次使用 kubectl apply 命令更新 Pod。
命令执行完成后,名为 pod1 的 Pod 不会删除后再新建,也不会另外创建新 Pod。只会在原 Pod 基础
上进行内部配置修改。
注意
:由 kubectl apply 命令创建的 Pod,可以修改对应的 YAML 文件来修改 Pod中的参数。但不能修改metadata.name(Pod名),否则将重新创建一个新 Pod。
kubectl create -f 适用于初始化资源对象的场景;
而kubectl apply -f 则更加适合更新和修改已有的资源对象,因为它会对比新的 YAML 配置文件和已有的资源对象配置,只更新需要更新的部分,而不会覆盖已有的全部配置
查看pod的详细信息
kubectl get pods -n 命名空间 # 查看指定命名空间下的pod
kubectl get pods -o wide # 显示pod的IP地址及Pod所在的Node节点机器主机名称
kubectl get pods -A # 显示所有命名空间下的pod信息,并在第一列展示命名空间
kubectl get pods # 不指定命名空间,则只显示默认 default,等价于 kubectl get pods -n default
kubectl get pods -A -o wide #显示的比较全的信息命令组合
查看yaml文件的创建后的资源对象的信息
kubectl -n default get pod -o yaml redis-php
查看pod的事件信息(pod状态异常时有用)
kubectl describe pod POD名称 #pod启动失败 就看这个的事件日志就行
查看node的详情信息
kubectl describe node node名称或者node的地址 #查看node的详情信息
删除pod的方式
kubectl delete pod pod名称
或
kubectl delete -f vmware-nginx.yaml #创建pod的资源配置文件
都可以实现删除pod