出国游做的好的网站,wordpress access denied.,潍坊网站建设价格,怎么分析一个网站seo背景
1.28.2 版本 k8s 中的一台 worker 节点内存异常#xff0c;需要关机换内存#xff0c;正好可以测试一下 pod 的迁移。
发现
deployment 管理的 pod 是能够重新创建飘到其他节点上的#xff0c;但是 statefulset 管理的 pod 一直处于 Terminating 状态无法迁移#…背景
1.28.2 版本 k8s 中的一台 worker 节点内存异常需要关机换内存正好可以测试一下 pod 的迁移。
发现
deployment 管理的 pod 是能够重新创建飘到其他节点上的但是 statefulset 管理的 pod 一直处于 Terminating 状态无法迁移pod 就一直无法提供服务。官方文档中解释如下 当某节点关闭但 kubelet 的节点关闭管理器未检测到这一事件时 在那个已关闭节点上、属于 StatefulSet 的 Pod 将停滞于终止状态并且不能移动到新的运行节点上。 这是因为已关闭节点上的 kubelet 已不存在亦无法删除 Pod 因此 StatefulSet 无法创建同名的新 Pod。 如果 Pod 使用了卷则 VolumeAttachments 不会从原来的已关闭节点上删除 因此这些 Pod 所使用的卷也无法挂接到新的运行节点上。 所以那些以 StatefulSet 形式运行的应用无法正常工作。 如果原来的已关闭节点被恢复kubelet 将删除 Pod新的 Pod 将被在不同的运行节点上创建。 如果原来的已关闭节点没有被恢复那些在已关闭节点上的 Pod 将永远滞留在终止状态 解决办法
官方提供的解决办法是给该节点添加一个 NoExecute 的污点。尝试发现并不行而且 node 长期处于 NotReadynode control 会给该节点自动添加 NOExecute 的污点。
有尝试过升级 k8s 版本到 1.31.1发现也并不行。
后续搜索发现可以强制删除节点上的 pod原理是强制删除不需要等待该节点上的 kubelet 的响应。
kubectl delete pod pod_name -n namespace --grace-period0 --force
我们可以创建 deployment 来定时查找长期处于 Terminating 状态的 pod或者说是 cronJob。
编写查询并删除 pod 的脚本 configmap
apiVersion: v1
kind: ConfigMap
metadata:name: delete-terminating-pods-scriptnamespace: ops
data:delete_terminating_pods.sh: |#!/bin/bashtemp_file/tmp/terminating_pods.txt $temp_filewhile true; dokubectl get pod -A | grep Terminating | awk {print $1,$2} $temp_filesleep 60kubectl get pod -A | grep Terminating | awk {print $1,$2}| while read namespace pod_name; doif grep -q $namespace $pod_name $temp_file; then #避免删除优雅退出的 podkubectl delete pod $pod_name -n $namespace --grace-period0 --forcefidone $temp_filesleep 60done创建一个 ServiceAccount 并给予权限
apiVersion: v1
kind: ServiceAccount
metadata:name: delete-terminating-pods-sanamespace: ops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: pod-deleter
rules:
- apiGroups: []resources: [pods]verbs: [get, list, delete]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: delete-terminating-pods-crb
subjects:
- kind: ServiceAccountname: delete-terminating-pods-sanamespace: ops
roleRef:kind: ClusterRolename: pod-deleterapiGroup: rbac.authorization.k8s.io
编写一个 deploymentkubectl 的版本与自己集群版本相同即可
apiVersion: apps/v1
kind: Deployment
metadata:name: kubectlnamespace: ops
spec:replicas: 1selector:matchLabels:app: kubectltemplate:metadata:labels:app: kubectlspec:serviceAccountName: delete-terminating-pods-sacontainers:- name: kubectl-containerimage: bitnami/kubectl:1.31.1command: [/bin/bash, /scripts/delete_terminating_pods.sh]volumeMounts:- name: script-volumemountPath: /scriptsvolumes:- name: script-volumeconfigMap:name: delete-terminating-pods-script到此就可以自动发现并删除 节点意外情况 sts 管理的 pod 了有更好的办法评论区可以留言。