118 lines
3.6 KiB
Bash
Executable File
118 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 用途:查看所有服務的存取方式(網址、IP、Port)
|
||
|
||
set -euo pipefail
|
||
|
||
# 顏色定義
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
echo "=========================================="
|
||
echo " K3s 服務存取清單"
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
# 節點 IP
|
||
echo "🖥️ 節點 IP"
|
||
echo "------------------------------------------"
|
||
NODE_IPS=$(kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.addresses[?(@.type=="InternalIP")].address}{"\n"}{end}')
|
||
echo "$NODE_IPS"
|
||
echo ""
|
||
|
||
# Ingress (HTTP/HTTPS 服務)
|
||
echo "🌐 Web 服務 (Ingress)"
|
||
echo "------------------------------------------"
|
||
INGRESS_COUNT=$(kubectl get ingress --no-headers 2>/dev/null | wc -l)
|
||
|
||
if [ $INGRESS_COUNT -eq 0 ]; then
|
||
echo -e "${YELLOW}無 Ingress 服務${NC}"
|
||
else
|
||
kubectl get ingress --no-headers 2>/dev/null | while read -r name class hosts address ports age; do
|
||
# 取得第一個 host
|
||
FIRST_HOST=$(kubectl get ingress "$name" -o jsonpath='{.spec.rules[0].host}' 2>/dev/null)
|
||
|
||
# 檢查是否有 TLS
|
||
TLS=$(kubectl get ingress "$name" -o jsonpath='{.spec.tls}' 2>/dev/null)
|
||
if [[ -n "$TLS" && "$TLS" != "[]" ]]; then
|
||
PROTO="https"
|
||
else
|
||
PROTO="http"
|
||
fi
|
||
|
||
echo -e "${GREEN}→ $name${NC}"
|
||
echo " $PROTO://$FIRST_HOST"
|
||
|
||
# 顯示所有 hosts
|
||
ALL_HOSTS=$(kubectl get ingress "$name" -o jsonpath='{range .spec.rules[*]}{.host}{"\n"}{end}' 2>/dev/null)
|
||
HOST_COUNT=$(echo "$ALL_HOSTS" | wc -l)
|
||
if [ $HOST_COUNT -gt 1 ]; then
|
||
echo " 其他域名: $(echo "$ALL_HOSTS" | tail -n +2 | tr '\n' ',' | sed 's/,$//')"
|
||
fi
|
||
echo ""
|
||
done
|
||
fi
|
||
|
||
# Services
|
||
echo "🔧 內部服務 (ClusterIP)"
|
||
echo "------------------------------------------"
|
||
kubectl get svc --no-headers 2>/dev/null | grep "ClusterIP" | while read -r name type clusterip externalip ports age; do
|
||
if [[ ! "$name" =~ "kube-" ]] && [[ ! "$name" =~ "svc-" ]]; then
|
||
echo -e "$name ${CYAN}→${NC} $clusterip $ports"
|
||
fi
|
||
done
|
||
echo ""
|
||
|
||
# NodePort (如果有)
|
||
echo "🔌 NodePort 服務"
|
||
echo "------------------------------------------"
|
||
NODEPORT_COUNT=$(kubectl get svc --no-headers 2>/dev/null | grep -c "NodePort" || true)
|
||
|
||
if [ $NODEPORT_COUNT -eq 0 ]; then
|
||
echo -e "${YELLOW}無 NodePort 服務${NC}"
|
||
else
|
||
kubectl get svc --no-headers 2>/dev/null | grep "NodePort" | while read -r name type clusterip externalip ports age; do
|
||
echo -e "${GREEN}→ $name${NC}"
|
||
echo " Ports: $ports"
|
||
echo "$NODE_IPS" | while read -r node ip; do
|
||
echo " $ip:$ports"
|
||
done
|
||
echo ""
|
||
done
|
||
fi
|
||
|
||
# LoadBalancer (如果有)
|
||
echo "⚖️ LoadBalancer 服務"
|
||
echo "------------------------------------------"
|
||
LB_COUNT=$(kubectl get svc --no-headers 2>/dev/null | grep -c "LoadBalancer" || true)
|
||
|
||
if [ $LB_COUNT -eq 0 ]; then
|
||
echo -e "${YELLOW}無 LoadBalancer 服務${NC}"
|
||
else
|
||
kubectl get svc --no-headers 2>/dev/null | grep "LoadBalancer" | while read -r name type clusterip externalip ports age; do
|
||
echo -e "${GREEN}→ $name${NC}"
|
||
echo " External: $externalip"
|
||
echo " Ports: $ports"
|
||
echo ""
|
||
done
|
||
fi
|
||
|
||
# Pod 概況
|
||
echo "📦 Pod 概況"
|
||
echo "------------------------------------------"
|
||
POD_TOTAL=$(kubectl get pods -A --no-headers 2>/dev/null | wc -l)
|
||
POD_RUNNING=$(kubectl get pods -A --no-headers 2>/dev/null | grep -c "Running" || true)
|
||
POD_ISSUE=$((POD_TOTAL - POD_RUNNING))
|
||
|
||
echo "總計: $POD_TOTAL 個 Pods"
|
||
echo -e " ${GREEN}Running: $POD_RUNNING${NC}"
|
||
if [ $POD_ISSUE -gt 0 ]; then
|
||
echo -e " ${YELLOW}非 Running: $POD_ISSUE${NC}"
|
||
fi
|
||
echo ""
|
||
|
||
echo "=========================================="
|