程序操作kubernetes資源時, 沒有等舊的資源刪除完畢就立即創建了同名的新資源, 導致出現了一些錯誤.
具體表現爲kubernetes命令行刪除StatefulSet時報錯, timed out waiting for "mysql" to be synced, 刪除多次卡住, 然後報這個超時錯誤.
查看這個StatefulSet:
root@kub3:~# kubectl -n admin-d2069c get statefulset mysql -o yaml
...
spec:
podManagementPolicy: OrderedReady
replicas: 0
revisionHistoryLimit: 10
selector:
matchLabels:
app: mysql
appname: mysql
name: mysql
serviceName: mysql
template:
metadata:
creationTimestamp: null
labels:
app: mysql
appname: mysql
name: mysql
name: mysql
...
replicas爲0, 但是查看其下有兩個狀態爲terminating的pod:
statefulsets/mysql 0 2 19h
po/mysql-0 0/1 Terminating 0 19h
po/mysql-1 0/1 Terminating 0 19h
然後使用如下命令再次進行刪除操作:
kubectl -n admin-d2069c delete statefulset mysql --cascade=false
成功.
出現這種情況的原因是, 刪除StatefulSet時會級聯刪除其下pod資源, 然而yaml定義中的replica爲0導致了混亂, 使用--cascade=false禁用級聯刪除則成功, 然後單獨刪除其下的兩個pod.
刪除pod時也要注意, 因爲正常情況下, StatefulSet負責管理其下的pod而不需要人爲干預。所以這裏要使用強制刪除:
若使用1.5或者更高版本的kubectl強制刪除Pod,請執行以下命令:
kubectl delete pods <pod> --grace-period=0 --force
如果您使用1.4或者更低版本的kubectl,需要省略--force選項:
kubectl delete pods <pod> --grace-period=0