k8s_PaaS/终章——常用操作命令及相关方案.md

6.1 KiB
Raw Permalink Blame History

终章——常用操作命令及相关方案

本章节会增加一些在工作中常用的操作,以及开发交付的一些贴近场景的组件及工具代替原本教程中的内容

命令

查-POD级

K8s查日志信息describe即启动时的描述在最下面的Event里。logs是deploy写好的输出日志

# 先找到对应的pod空间和名字第一列是空间名NAMESPACE第二列是pod名PODNAME
kubectl get po -A | grep $PODNAME 
kubectl describe po -n$NAMESPACE $PODNAME
kubectl logs -n$NAMESPACE $PODNAME
# 进入到pod里
kubectl exec -it -n$NAMESPACE $PODNAME -- /bin/bash

k8s查找pod配置内容

kubectl get $DEPLOY -n$NAMESPACE -o yaml |grep $SEARCH_SOMETHINE

查看哪个名称空间中那个类型配置里有这个内容,-o yaml 输出yaml格式内容

查某个服务ip

kubectl get svc $DEPLOYNAME -n$NAMESPACE

k8s查找全部未运行成功的pod-A指全部owide可以看到是在哪个宿主下

kubectl get pod -Aowide | grep -ivE 'running|completed' 

更强大的查看未运行成功的命令因为有的pod虽然处于running但还是0/1即未就绪状态下面命令能把未就绪的也过滤出来

IFS_OlD=$IFS;IFS=$'\n';for i in `kubectl get po -A -owide|grep -v NAME|grep -v Comple`;do desire=`echo $i|awk '{print $3}'|awk -F '/' '{print $1}'`;reality=`echo $i|awk '{print $3}'|awk -F '/' '{print $2}'`;if [[ "$desire" != "$reality" ]];then echo $i; fi; done;IFS=$IFS_OLD

查-NODE级

# 查看有多个节点
kubectl get nodes
# 查看集群信息
kubectl cluster-info
# 显示节点的资源使用情况
kubectl top node

查看node的资源使用情况

for node in `kubectl get node | awk '{print $1}'|grep -v NAME`;do echo "======$node"; echo "==Capacity:" ;kubectl describe  node $node | grep -A 12 "Capacity:" | grep -E "cpu:|memory:|nvidia.com\/gpu|vcuda-core|vcuda-memory:"; echo "=request&limit:"; kubectl describe node $node |grep -E "cpu | memory  |nvidia.com/gpu                             |vcuda-core               |vcuda-memory                " ;done

重启遇事不决重启pod

重启/删除不同空间下的不同条件的pod-A看到全部

kubectl get pod -A | grep -E 'testA| testB' | awk '{print $1" "$2}' | while read line ; do kubectl delete pod -n $line ; done

可以先使用如下命令确认过滤出来的命名空间和pod是否一致其中testA和testB是要过滤出来的pod名

kubectl get pod -A | grep -E 'testA| testB' | awk '{print $1" "$2}' 

也可以使用如下方法来重启/删除不同命名空间下非running状态的pod

kubectl get pod -A | grep -ivE 'running|completed' | awk '{print $1" "$2}' | while read line ; do kubectl delete pod -n $line ; done

强制重启在delete pod 后面跟上 --grace-period=0 --force

kubectl get pod -A | grep -ivE 'running|completed' | awk '{print $1" "$2}' | while read line ; do kubectl delete pod --grace-period=0 --force -n $line ; done

全部重启/删除指定空间下的pod

kubectl delete pods --all -n$NAMESPACE
kubectl delete --all pods --namespace=$NAMESPACE

删除deploy之前可以先批量下载到一个文件kubectl get deploy -n$NAMESPACE -o yaml > backup.yaml然后再批量创建 kubectl create -f backup.yaml -n$NAMESPACE

批量重启/删除指定空间下的pod

kubectl get pods -n$NAMESPACE| grep -v Running | awk '{print $1}' | xargs kubectl delete pod -n$NAMESPACE

grep -v反取没有running状态的pod

awk '{print $1}' stdin出来pod名字传递给xargs使用

# 一般有现成的xxx.yaml文件如下
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    ports:
    - containerPort: 80
# 定义了一个名为 my-pod 的 Pod它运行一个单独的容器该容器使用 nginx 镜像,并且开放了 80 端口。
kubectl apply -f pod-example.yaml
# 或者直接运行命令
kubectl run my-pod --image=nginx --port=80

# 以上面创建的pod为例子先导出yaml到本地。一般都有命名空间
kubectl get deploy -n$NAMESPACE my-deployment -o yaml > my-deployment.yaml

# 编辑现有的deploy编辑后保存退出
kubectl edit deploy -n$NAMESPACE my-deployment

# 异常回滚方法一:
kubectl rollout undo deployment my-deployment
# 异常回滚方法二apply之前保留的yaml文件恢复旧配置
kubectl apply -f my-deployment.yaml

相关方案

关于监控

第七章节中我们用到Promtheus来做监控随着不断更新换代为了更轻便、快速和简洁以及更好的兼容其他不同程序我们会采用Jaeger、ELK、Telegraf、Grafana的组合再加上时序数据库InfluxDB。去掉Dashboard、Promtheus因为客户只需要开发平台而不需要频繁的修改k8s。

  • Jaeger分布式追踪系统go语言微服务系统更需要全链路跟踪传统中页面bug我们会开始排查前端问题前端确认没问题说调用接口有错误日志我们在去看后端看完后端说底层就报错我们再去排查集群问题实在太耗费时间了而全链路跟踪可以直接明了的看到是哪一环节的问题。
  • ELKES、Logstash、Kibana
  • Telegraf数据采集工具go语言代替Prometheus
  • InfluxDB时序数据库go语言代替TSDB各个指标都高于TSDB随着推出时间越来越久对市面上的产品也已经很兼容了。
  • Grafana监控指标展示工具go语言
关于InfluxDB在实际应用中遇到的情况

在生产中由于机器数过多使用默认配置的InfluxDB直接撑爆内存重启内存会逐渐增大然后挂掉也没办法进入会报refused并提示确认是否在running解决办法是直接把influx对应的路径下大的数据目录_retention结尾下的数字文件夹全部删掉这样就有足够的空间进入influx修改数据保存日期alter retention policy "db_name__retention" on "db_name" duration 7d default