删除资源姿势不对
什么是 Finalizers
刚接触到 k8s 的同学会经常遇到资源删不掉的问题,明明执行了
kubectl delete
命令,可是一会发现被删除的资源还保留在集群里。没有大规模集群,如何做压测
部署在容器中的应用如何做到不断流
原生资源Protobuf序列化
controlller-runtime已经默认了,kruise团队
- 其他语言通过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"
- 如果遇到pod对应的镜像地址不存在的情况怎么办,从node节点上捞出来镜像 ctr 命令 export,然后导入本地上传到公共镜像地址,重启拉取
- patch的时候 / 转义为 ~1
kubectl patch cloneset/demo --type=json --patch [{"op":"replace","path":"/spec/template/metadata/annotations/alibabacloud.com~1skip-select-pool","value":"true"},
- 资源删除不掉? 搜下 Finalizers
- 使用 controller-runtime 中 Client 更新 CR 资源的时候,无法直接更新子资源,如果更新status字段,需要显示指定,如client.Status().Update()
- 为什么我控制器性能这么低?调调QPS?
- Debug小技巧,配置UserAgent
- 序列化协议尽量用 PB
- 优先使用 Patch 接口
- Indexer同步延迟
- 加索引很有必要
- 避免无脑DeepCopy导致OOM
- Merge Patch,Strategic Merge Patch,Three Way Merge Patch
你在做 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。
- 本地调试webhook利器
- 控制器的promethus指标(workqueue)
- featuregate包
- set集合
- spyd和websoket
exec实现和如果代理请求
- upgradePorxy
- pod dns解析错误,看resolve.conf
- api-runtime
compbasemetrics
"k8s.io/component-base/metrics"
统一的metrics指标
Loading Comments...