最大的坑是 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
在容器调度方面的霸权——毕竟,如果你跟女朋友分手了,也不会想给她买新衣服,对吧?