102 lines
3.4 KiB
YAML
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
|