kubectl常见命令及错误排除

Posted 石工记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubectl常见命令及错误排除相关的知识,希望对你有一定的参考价值。

一、常见命令

kubectl 详细命令用法可以参考官网:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

kubectl 常用的命令总结
只显示默认命名空间的pods
kubectl get pods

显示所有空间的pod
kubectl get pods --all-namespaces

显示指定空间的pod
kubectl get pods -o wide --namespace apm

其中–namespace 与-n 作用等同,后面接命名空间参数
kubectl get deployment -n apm
kubectl get pods,svc,rc -n apm svc和services是一样的
这些命令都可以通过 kubectl get --help 来查看帮助

删除
只能删除默认命名空间的deployment
kubectl delete deployment nginx

删除指定空间的deployment/其他资源等
kubectl  delete TYPE RESOURCE -n NAMESPACE
具体如下:
kubectl  delete deployment shop-app -n test-shop  
kubectl  delete TYPE --all -n NAMESPACE
kubectl  delete all -n NAMESPACE
kubectl  delete all --all

使用yaml文件创建pod
kubectl apply -f apptrace-receiver-deployment.yaml
apply 和 create 命令都可以后跟yaml,创建所需资源,初次创建pod时可以互相替换使用;如果已有pod只是用于更新的话,又可以和replace相互替换使用;本着化繁就简的原则,create和replace都使用apply; 而且apply属于申明式语法,这个更加灵活,多次执行不会报错,只会更新改变的部分;像Jenkinsfile也已经从脚本语法向申明式转变。

使用kubectl命令把pod、卷、各种资源导出为yaml格式:
kubectl  get pods podA -n NAMEAPSCE-A -o yaml --export> padA.yaml
pod 可以换成其他申明式资源如卷、services等;如果不带上--export  生成文件会有很多无用的内容

现在很多产品如rancher openshift,等;UI界面 直接可视化操作导出各种资源,掌握命令很多时候,可以事半功倍。-o更详细用法 下面有单独说明。

查看命名空间apm的collector服务详情
--namespace 和-n  作用相同

查看pod日志
kubectl logs podname --namespace apm (可以带上 -f 参数)

为节点机apm-docker001打标签 zookeeper-node=apm-docker001,查看标签等;
为节点机打标签和查看
kubectl label nodes apm-docker001 zookeeper-node=apm-docker001
kubectl get nodes --show-labels
为命名空间打标签和查看
kubectl label namespace $your-namesapce istio-injection=enabled
kubectl  get namespaces  --show-labels

给名为foo的Pod添加label unhealthy=true
kubectl label pods foo unhealthy=true

查看某种类型字段下有哪些参数;
kubectl explain pods
kubectl explain Deployment
kubectl explain Deployment.spec
kubectl explain Deployment.spec.spec
kubectl explain Deployment.spec.template
kubectl explain Deployment.spec.template.spec


如查看Deployment.spec.template 可以有哪些参数
[root@k8s-master ~]# kubectl explain Deployment.spec.template
KIND:     Deployment
VERSION:  extensions/v1beta1

RESOURCE: template <Object>

DESCRIPTION:
     Template describes the pods that will be created.

     PodTemplateSpec describes the data a pod should have when created from a
     template

FIELDS:
   metadata     <Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

   spec <Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status



在pod内部,执行shell命令
kubectl exec podname printenv | ps aux | cat、ls 某个文件(如果pod不在默认空间,用-n 指定相应空间)
如:kubectl  exec   app-demo-68b4bd9759-sfpcf -n test-shop printenv

或者在kubectl exec podname -- 再跟shell命令 如:
kubectl exec -it spark-master-xksl -c spark-master -n spark  -- mkdir -p /usr/local/spark  
shell命令前,要加-- 号,不然shell命令中的参数,不能识别

kubectl  exec  后面只能是pod,目前还不支持deployment daemonnset等

巧用kubectl 帮助文件
如你只记得部分命令 get ,可以用
kubectl get --help
同理
kubectl create rolebinding
不知道后面接什么 也可以–help一下,记得关键字越多 带上后再使用help,如果只记得部分 就先help

kubectl create --help
这样create 所有类型的应用怎么创建 都有了
同样也可以直接 kubectl --help
这样kubectl 有哪些用法就显示出来,
我们要一级级的利用帮助 可能刚开始记住前面一个关键字,写完关键字 help一下 又有很多详细的用法

二、常见错误排除

Kubernetes 部署失败的 10 个最普遍原因
详细说明链接:http://dockone.io/article/2247;注意一定勤看日志

** kubectl  describe  pod  kube-state-metrics-xntdx-978bb474d-8x7pg  -n efk-jpvgs**
** 查看event部分:**

Events:
  Type     Reason     Age               From                   Message
  ----     ------     ----              ----                   -------
  Normal   Scheduled  3m                default-scheduler      Successfully assigned efk-jpvgs/kube-state-metrics-xntdx-978bb474d-8x7pg to szly-manager
  Normal   Pulling    1m (x4 over 3m)   kubelet, szly-manager  pulling image "k8s.gcr.io/kube-state-metrics:v1.5.0"
  Warning  Failed     1m (x4 over 3m)   kubelet, szly-manager  Failed to pull image "k8s.gcr.io/kube-state-metrics:v1.5.0": rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  Warning  Failed     1m (x4 over 3m)   kubelet, szly-manager  Error: ErrImagePull
  Warning  Failed     1m (x6 over 3m)   kubelet, szly-manager  Error: ImagePullBackOff
  Normal   BackOff    52s (x7 over 3m)  kubelet, szly-manager  Back-off pulling image "k8s.gcr.io/kube-state-metrics:v1.5.0"

这个就说明了问题 镜像拉取失败 ,记住遇到问题 一定要先看日志,要不然像无头苍蝇,瞎修改

如果已经启动成了的 容器(pod) 可以通过命令:

kubectl  logs   efk-jpvgs-elasticsearch-0  -n efk-jpvgs

来查看,或者直接在rancher里面选择pod后view logs ,查看 events 区域的提示内容
查看etcd 健康状态

kubectl get componentstatuses 或者kubectl get cs
NAME                 STATUS      MESSAGE                                                                                         ERROR
controller-manager   Healthy     ok                                                                                              
etcd-1               Unhealthy   Get https://172.16.31.16:2379/health: dial tcp 172.16.31.16:2379: connect: connection refused   
scheduler            Healthy     ok                                                                                              
etcd-2               Healthy     "health": "true"                                                                              
etcd-0               Healthy     "health": "true"   

更详细的排错方案见:
https://kubernetes.feisky.xyz/pai-cuo-zhi-nan/pod

kubectl 与 Docker 命令关系 可以参考:
http://docs.kubernetes.org.cn/70.html

特别说明 docker run redis --requirepass,RedisP@ssw0rd
像这种 run 镜像后面的参数,则可以在docker-compose或者k8s的cmd或者入口处定义,无需二次制作镜像

也参考官网镜像的dockerfile,如dockerfile最后的一句话是CMD [“redis-server”],我们
部署时,在rancher UI命令(CMD)
redis-server --requirepass 自己的密码
填写完成后启动redis,并测试密码是否生效;
如果没有找到镜像的dockerfile,当run镜像后,指定了工作路径,路径里面一般会有个可执行的二进制文件,一般可以在入口命令中,设置执行二进制文件,后面跟参数 ;./xx -args args_value 但这个需要灵活应变;

kubectl 命令规律总结
先看一组命令

kubectl  delete  sa  metricbeat  -n  efk
kubectl  get  sa  --all-namespaces
kubectl  delete  daemon-set  metricbeat  -n  efk

1.会发现,kubectl 不管get 、delete describe等操作 后面跟资源类型 如果sa(serviceaccout) deployment pod,然后是资源名称,如果没有资源名称,则删除、获取此类型所有的资源;最后限定某个命名空间,或者全部命名空间;这个限定命名空间 可以放在kubectl 后面,也可以放在所有参数后面
-o 是指定输出格式
输出格式 说明
-o=custom-columns= 根据自定义列名进行输出,以逗号分隔
-o=custom-colimns-file= 从文件中获取自定义列名进行输出
-o=json 以JSON格式显示结果
-o=jsonpath= 输出jsonpath表达式定义的字段信息
-o=jsonpath-file= 输出jsonpath表达式定义的字段信息,来源于文件
-o=name 仅输出资源对象的名称
-o=wide 输出额外信息。对于Pod,将输出Pod所在的Node名
-o=yaml 以yaml格式显示结果
如下:

kubectl  get  sa   -n  efk  -o  yaml 
kubectl  get  sa  efk-elaticsearch -n  efk  -o  yaml  >xxx.yaml 
kubectl  get pod efk-elaticsearch-0 -n  efk  -o  wide

更多用法可以参照官网或者国内翻译的博客
https://blog.csdn.net/xingwangc2014/article/details/51204224

因为k8s 采用的是REST API接口,所有命令都最终会转换成curl -X PUT POS等形式,为什么不直接使用curl命令,因为需要一堆相关授权,rancher UI里面 在deploy或其他资源中,选择api查看 就可以查到,也可以点击右侧的edit编辑后 通过curl命令提交
API Request
cURL command line: 
curl -u "$CATTLE_ACCESS_KEY:$CATTLE_SECRET_KEY" \\
-X PUT \\
-H 'Accept: application/json' \\
-H 'Content-Type: application/json' \\
-d '"annotations":"cattle.io/timestamp":"", "cni.projectcalico.org/podIP":"10.42.1.44/32", "containers":["allowPrivilegeEscalation":false, "exitCode":null, "image":"172.16.35.31:1180/apm-images/gettoken:1.0", "imagePullPolicy":"IfNotPresent", "initContainer":false, "name":"genttoken", "ports":["containerPort":8001, "dnsName":"genttoken-nodeport", "kind":"NodePort", "name":"8001tcp301001", "protocol":"TCP", "sourcePort":30100, "type":"/v3/project/schemas/containerPort"], "privileged":false, "procMount":"Default", "readOnly":false, "resources":"type":"/v3/project/schemas/resourceRequirements", "restartCount":0, "runAsNonRoot":false, "state":"running", "stdin":true, "stdinOnce":false, "terminationMessagePath":"/dev/termination-log", "terminationMessagePolicy":"  等等

 

以上是关于kubectl常见命令及错误排除的主要内容,如果未能解决你的问题,请参考以下文章

kubectl 常用命令梳理

kubectl 常用命令

kubectl 常用命令总结

k8s kubectl常用命令总结

06-kubectl常见命令整理

微信小程序常见错误及基本排除方法