manifests/ping-all-node/job-busybox.yaml
2025-04-12 13:11:34 +08:00

102 lines
3.4 KiB
YAML

apiVersion: batch/v1
kind: CronJob
metadata:
name: ping-nodes
namespace: cron
spec:
schedule: "*/5 * * * *" # 每5分钟执行一次
concurrencyPolicy: Allow
jobTemplate:
spec:
template:
spec:
serviceAccountName: ping-nodes-sa
containers:
- name: ping-nodes
image: busybox
command:
- /bin/sh
- -c
- |
# 获取当前节点的主机名
CURRENT_NODE=$(cat /etc/hostname)
echo "Current node: $CURRENT_NODE"
# 设置API查询环境变量
APISERVER=https://kubernetes.default.svc
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
TOKEN=$(cat ${SERVICEACCOUNT}/token)
CACERT=${SERVICEACCOUNT}/ca.crt
# 查询所有节点信息并提取IP
NODE_DATA=$(wget --no-check-certificate --header="Authorization: Bearer ${TOKEN}" -qO- ${APISERVER}/api/v1/nodes)
# 使用简单的文本处理提取节点名称和内部IP
echo "$NODE_DATA" | tr ',' '\n' | grep '"name"\|"type":"InternalIP"\|"address"' > /tmp/node_info.txt
# 提取节点名称和IP
cat /tmp/node_info.txt | while read line; do
if echo "$line" | grep -q '"name"'; then
NODE_NAME=$(echo "$line" | sed 's/.*"name": *"\([^"]*\)".*/\1/')
echo "Found node: $NODE_NAME"
elif echo "$line" | grep -q '"type":"InternalIP"'; then
read ip_line
NODE_IP=$(echo "$ip_line" | sed 's/.*"address": *"\([^"]*\)".*/\1/')
echo "Node $NODE_NAME has IP: $NODE_IP"
# 只ping非当前节点
if [ "$NODE_NAME" != "$CURRENT_NODE" ]; then
echo "Pinging node $NODE_NAME ($NODE_IP)"
ping -c 3 $NODE_IP
echo "-----------------------------------"
fi
fi
done
# 也可以通过节点名称ping (如果配置了正确的DNS解析)
echo "Pinging nodes by name:"
for NODE_NAME in $(grep '"name"' /tmp/node_info.txt | sed 's/.*"name": *"\([^"]*\)".*/\1/'); do
if [ "$NODE_NAME" != "$CURRENT_NODE" ]; then
echo "Pinging node by name: $NODE_NAME"
ping -c 3 $NODE_NAME
echo "-----------------------------------"
fi
done
restartPolicy: OnFailure
# 挂载服务帐户令牌以便访问API服务器
volumes:
- name: token-volume
projected:
sources:
- serviceAccountToken:
path: token
expirationSeconds: 7200
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: ping-nodes-sa
namespace: cron
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ping-nodes-rb
subjects:
- kind: ServiceAccount
name: ping-nodes-sa
namespace: cron
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io