100 K8s Mistakes and How to Avoid Them
100 K8s Mistakes and How to Avoid Them

100 K8s Mistakes and How to Avoid Them

Created
Oct 24, 2022 11:54 PM
Text
一直从事k8s相关的开发工作,不可避免的遇到一些常犯的错误以及经典的开发和调试技巧,本文的名字借鉴于 100 Go Mistakes and How to Avoid Them,希望能帮助到遇到这类问题的同学
Tags
k8s
 

删除资源姿势不对

什么是 Finalizers

刚接触到 k8s 的同学会经常遇到资源删不掉的问题,明明执行了kubectl delete命令,可是一会发现被删除的资源还保留在集群里。

没有大规模集群,如何做压测

部署在容器中的应用如何做到不断流

原生资源Protobuf序列化

controlller-runtime已经默认了,kruise团队
 
  1. 其他语言通过websoket直连apiserver实现exec功能的时,执行命令需要做编码操作,有时候通过kubectl执行exec可以实现预期功能,但通过curl执行会出现问题,一般是因为指令编码出现问题,这时候可以开启kubectl的debug功能查看kubectl调用apiserver的具体url路径是什么,如下加上-v 10参数,让kubectl打印出更多的调试日志
k exec nginx-deployment-75b69bd684-nh6zm nginx -it -v 10 -- /bin/sh -i -c "bash || clear; /bin/sh"
  1. 如果遇到pod对应的镜像地址不存在的情况怎么办,从node节点上捞出来镜像 ctr 命令 export,然后导入本地上传到公共镜像地址,重启拉取
  1. patch的时候 / 转义为 ~1
kubectl patch cloneset/demo --type=json --patch [{"op":"replace","path":"/spec/template/metadata/annotations/alibabacloud.com~1skip-select-pool","value":"true"},
  1. 资源删除不掉? 搜下 Finalizers
  1. 使用 controller-runtime 中 Client 更新 CR 资源的时候,无法直接更新子资源,如果更新status字段,需要显示指定,如client.Status().Update()
  1. 为什么我控制器性能这么低?调调QPS?
  1. Debug小技巧,配置UserAgent
  1. List一次开销这么大 https://arthurchiao.art/blog/k8s-reliability-list-data-zh/
  1. 序列化协议尽量用 PB
  1. 优先使用 Patch 接口
  1. Indexer同步延迟
  1. 加索引很有必要
  1. 避免无脑DeepCopy导致OOM
  1. Merge Patch,Strategic Merge Patch,Three Way Merge Patch
    1. 你在做 Patch 的时候,最佳实践是把 original 的 UID 填在 patch 里。因为 API server 的 key-value store 是以“namespace + name”作为 key 的。在任意一个时间,这个组合都是唯一的。但是如果把时间这条轴加进来的话,比如你有一个 pod,删除后过了一会儿,又在同一个 namespace 下建了同名的 pod,但是把所有的 spec 都改掉了,那么 controller 旧的 patch 可能会被应用到这个新建的 pod 上,这样就会有 bug 了。如果在 patch 里加入 uid 的话,一旦发生刚才所说的情况,apiserver 会以为你是要修改 uid,这个是不允许的,所以这个 patch 就会 fail 掉,防止了 bug。
      resourece version 是 kubernetes 里面一个 logical clock,用作 optimistic concurrency。如果没有设置 resourceversion,api-server 收到请求后会从 etcd 读出最新的值。但设为 0 的话,APIserver 就会从 local 的 cache 里面把值读取出来,cache 的值可能会有一定的延迟。这样可以减轻 APIserver 和 etcd 后端的压力。现在是用得比较多的是 kubelet,经常要 get node status,但是不需要最新的 node status,如果集群很大,就能够省不少 cpu/memory 的开销。如果 resource version 设成非常大的值,get request 会在 api-server 挂起,没有响应的话会 time-out。
  1. 本地调试webhook利器
  1. 控制器的promethus指标(workqueue)
  1. featuregate包
  1. set集合
  1. spyd和websoket
    1. exec实现和如果代理请求
  1. upgradePorxy
  1. pod dns解析错误,看resolve.conf
  1. api-runtime
  1. compbasemetrics "k8s.io/component-base/metrics" 统一的metrics指标
     

    Loading Comments...