#! /bin/bash
NAMESPACE=dev
function undeployAll()
{
undeploy svc $1
undeploy hpa $1
undeploy deploy $1
undeploy ingress $1
echo "卸载完成"
}
function undeploy()
{
echo "卸载$1..."
CNT=`kubectl get $1 -n ${NAMESPACE} |grep "^$2"|wc -l`
if [ $CNT -gt 0 ]; then
kubectl get $1 -n ${NAMESPACE} |grep "^$2"|cut -d ' ' -f 1|xargs kubectl delete $1 -n ${NAMESPACE}
fi
}
function readLog(){
SERVICENAME=$1
CNT=`kubectl get pod -n ${NAMESPACE} |grep "^$SERVICENAME"| grep 'Running'|wc -l`
if [ $CNT -gt 1 ]; then
echo "该服务名称前缀对应多个pod,无法定位"
return
fi
if [ $CNT -gt 0 ]; then
podName=$(kubectl get pod -n ${NAMESPACE} | grep "^$SERVICENAME"| grep 'Running' |cut -d ' ' -f 1)
echo "打印pod:"$podName
kubectl -n ${NAMESPACE} exec $podName -- sh -c 'cd /data/applog/slp/$CONTAINER_NAME && ls -lt| grep "\.log"| grep -v 'zipkin'| grep -v 'brave'| grep -v 'docker'| grep -v 'metrics'|grep -v 'WARN'| grep -v 'gz' | sed -n '1p' | sed "s/ */ /g" | cut -d " " -f 9 | xargs tail -200'
return
fi
}
#更新POD为host network
function updateToHostNetwork()
{
SERVICENAME=$1
CNT=`kubectl get deploy -n ${NAMESPACE} |grep "^$SERVICENAME"|wc -l`
if [ $CNT -gt 0 ]; then
deployments=$(kubectl get deploy -n ${NAMESPACE} | grep "^$SERVICENAME"|cut -d ' ' -f 1)
for element in ${deployments[@]}
#也可以写成for element in ${array[*]}
do
hostNetwork=$(kubectl -n ${NAMESPACE} get deploy $element -o yaml | grep 'hostNetwork: true')
if [ ! -n "$hostNetwork" ] ;then
echo "*******************开始更新$element的网络***********************"
kubectl -n ${NAMESPACE} patch deploy $element -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
else
echo "$element已是宿主机网络"
fi
done
fi
}
#环境瘦身
function Slimming()
{
deployments=$(kubectl get deploy -n ${NAMESPACE} | grep -v 'NAME' | cut -d ' ' -f 1)
for element in ${deployments[@]}
do
containerName=$(kubectl -n ${NAMESPACE} get deploy $element -owide | grep -v 'NAME' | awk '{print $7}')
#${containerName}在json中是字符串类型,json串中必须使用双引号应用
#不能直接包含在双引号中,否者shell不会替换为参数值
#通过前后字符串来拼接,注意不要前后字符串都别缺少双引号
kubectl -n ${NAMESPACE} patch deploy ${element} -p '{"spec":{"template":{"spec":{"containers":[{"name": "'${containerName}'","resources":{"limits":{"cpu":"1","memory":"1Gi"},"requests":{"cpu":"1","memory":"1Gi"}}}]}}}}'
kubectl -n ${NAMESPACE} patch hpa ${element} -p '{"spec":{"minReplicas":1,"maxReplicas":1}}'
done
}
# 转移POD到目标NODE
# 参数1:POD名前缀
# 参数2:目标NODE名
function movePod(){
SERVICENAME=$1
NODEHOSTNAME=$2
CNT=`kubectl get deploy -n ${NAMESPACE} |grep "^$SERVICENAME"|wc -l`
if [ $CNT -lt 0 ]; then echo "目标服务不存在";return 1;fi
DEPLOYNAME=$(kubectl get deploy -n ${NAMESPACE} | grep -v 'NAME'| grep $SERVICENAME | cut -d ' ' -f 1)
#给目标node打上标签
kubectl patch node $NODEHOSTNAME -p '{"metadata":{"labels":{"gw":"yes"}}}'
kubectl patch node $NODEHOSTNAME -p '{"metadata":{"labels":{"slpcore":"yes"}}}'
kubectl -n ${NAMESPACE} patch deploy $DEPLOYNAME -p '{"spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":"'${NODEHOSTNAME}'"}}}}}'
}
while :
do
clear
echo "========================================================================"
echo "This tool provides batch uninstallation of service deployment."
echo "========================================================================"
echo ""
echo "1. 批量卸载应用"
echo "2. 更新应用网络为主机网络"
echo "3. 查看日志"
echo "4. 扩容缩容:修改副本数"
echo "6. 容器环境瘦身"
echo "7. 转移POD"
echo "8. 禁用NODE:上面的POD自动迁移到其他NODE"
echo "9. 恢复NODE:可重新被使用"
echo "999. 退出"
echo ""
read -e -p "请选择: " OPTION
case $OPTION in
1) echo "进行批量卸载的应用需要输入服务前缀"
echo "例如:aim 或者 psc"
read -e -p "请输入服务前缀: " SERVICENAME
if [ -z "$SERVICENAME" ]; then
echo "服务名为空"
else
undeployAll $SERVICENAME
fi
;;
2) echo "更新应用网络为主机网络需要输入服务前缀"
echo "例如:aim"
read -e -p "请输入服务前缀: " SERVICENAME
updateToHostNetwork $SERVICENAME
;;
3) echo "查看服务日志需要输入服务前缀"
echo "例如:customer-gateway"
read -e -p "请输入服务前缀: " SERVICENAME
readLog $SERVICENAME
;;
4) read -e -p "请输入目标服务名称前缀: " SERVICENAME
read -e -p "请输入目标副本数: " REPLICAS
if [ -z $SERVICENAME ]; then echo '目标服务名称前缀为空' continue; fi
if [ -z $REPLICAS ]; then echo '目标副本数为空' continue ; fi
kubectl -n ${NAMESPACE} get hpa | grep $SERVICENAME| awk {'print $1'} | xargs kubectl -n ${NAMESPACE} patch hpa -p '{"spec": {"maxReplicas": '${REPLICAS}', "minReplicas": '${REPLICAS}'}}'
echo "如果看到horizontalpodautoscaler **** patched 则执行成功,请等待30s"
;;
6) echo "确定缩容么?"
Slimming
;;
7) read -e -p "请输入服务前缀: " SERVICENAME
read -e -p "请输入目标NODE的HostName,比如 k8snode11: " NODEHOSTNAME
movePod $SERVICENAME $NODEHOSTNAME
;;
8) read -e -p "请输入目标NODE的HostName,比如 k8snode11: " NODEHOSTNAME
nohup kubectl drain ${NODEHOSTNAME} --ignore-daemonsets=true --delete-local-data=true --force=true > std.log 2>&1 &
;;
9) read -e -p "请输入目标NODE的HostName,比如 k8snode11: " NODEHOSTNAME
nohup kubectl uncordon ${NODEHOSTNAME} > std.log 2>&1 &
;;
999) echo "Bye, see you next time"
exit 0
;;
*) echo "请输入正确选项!!"
;;
esac
echo ""
read -p "press any key to continue..." -n 1 anyKey
done
K8S 开发环境操作工具
最新推荐文章于 2024-06-11 11:30:38 发布