k8s中常用命令总结

进入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

猜你喜欢

转载自blog.csdn.net/adminstate/article/details/132696688
今日推荐