最大的坑是 deprecated apiVersion
Kubernetes 的 apiVersion 是会过期的
以 1.16来说,DaemonSet, Deployment, StatefulSet, ReplicaSet 全部统一使用 apps/v1
NetworkPolicy  使用 networking.k8s.io/v1
PodSecurityPolicy 使用 networking.k8s.io/v1
所以,在 1.16 中使用 apps/v1beta2, extensions/v1beta1 等废弃API都会出错
拥抱变化
检查受影响资源
1
2
3
4
5
6
7
8
9
10
11
12
kubectl get NetworkPolicy,PodSecurityPolicy,DaemonSet,Deployment,ReplicaSet \
--all-namespaces \
-o 'jsonpath={range .items[*]}{.metadata.annotations.kubectl\.kubernetes\.io/last-applied-configuration}{"\n"}{end}' | grep '"apiVersion":"extensions/v1beta1"'
kubectl get DaemonSet,Deployment,StatefulSet,ReplicaSet \
--all-namespaces \
-o 'jsonpath={range .items[*]}{.metadata.annotations.kubectl\.kubernetes\.io/last-applied-configuration}{"\n"}{end}' | grep '"apiVersion":"apps/v1beta'
kubectl get --raw="/metrics" | grep apiserver_request_count | grep 'group="extensions"' | grep 'version="v1beta1"' | grep -v ingresses | grep -v 'client="hyperkube' | grep -v 'client="kubectl' | grep -v 'client="dashboard'
kubectl get --raw="/metrics" | grep apiserver_request_count | grep 'group="apps"' | grep 'version="v1beta' | grep -v 'client="hyperkube' | grep -v 'client="kubectl' | grep -v 'client="dashboard'
recreate
是的,你没有听错,只能删除后重建。
我的建议是,在业务低峰期,建同label deploy 覆盖旧的resource,旧的resource缩容至0,并加上deprecated:true的label观察一段时间后,再彻底删除.
后记
apiVersion 变动的频繁,在某种程度上也可以证明 Kubernetes 在容器调度方面的霸权——毕竟,如果你跟女朋友分手了,也不会想给她买新衣服,对吧?
