K8S 开发环境操作工具

#! /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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值