#!/bin/bash [ $# -lt 1 ] && echo "need ip" && exit 1 KERNEL=957 DOCKER="18.06.3.ce" SSH="ssh -o ConnectTimeout=1 -o StrictHostKeyChecking=no" function nodeStat() { kubectl get node $1 |tail -n1 |awk '{print $2}' } function _info() { echo -e "\033[32m[INFO] $1\033[0m" } function _warn() { echo -e "\033[31m[WARN] $1\033[0m" } function _puppet() { $SSH "$1" "puppet agent --config /etc/puppet/puppet.conf --onetime --verbose --no-daemonize" } kubectl drain $1 --ignore-daemonsets --delete-local-data [ $? -ne 0 ] && _warn "kubectl drain error. exit.." && exit 1 _puppet "$1" kernel=`$SSH "$1" "uname -r"` dockerversion=`$SSH "$1" "docker --version"` # 使用 3.10.0-957 内核 echo $kernel |grep "$KERNEL" && kernelcheck=0 || kernelcheck=1 echo $dockerversion |grep "$DOCKER" && dockercheck=0 || dockercheck=1 ready=`nodeStat $1` _info "Kernel: $kernel" _info "Docker Version: $dockerversion" _info "nodeStat: $ready" if [ $dockercheck -eq 1 -a "$ready"x == "Ready,SchedulingDisabled"x ];then $SSH "$1" "systemctl stop kubelet" # 需事先准备好此脚本,脚本内容类似 docker stop $(docker ps -aq) # 清理原来的容器,防止老容器和新建容器一起启动导致的问题 $SSH "$1" "/usr/local/bin/docker_all.sh stop" $SSH "$1" "/usr/local/bin/docker_all.sh rm" $SSH "$1" "systemctl stop docker" $SSH "$1" "yum remove -y docker-*" $SSH "$1" "rm -fr /puppet/docker" $SSH "$1" "yum update -y" $SSH "$1" "yum install -y docker-ce-$DOCKER" else _warn "docker version check pass. Or node Stat error. Will not update docker" fi if [ $kernelcheck -eq 0 ];then _puppet "$1" else ready=`nodeStat $1 |cut -f2 -d','` if [ "$ready"x == "SchedulingDisabled"x ];then _warn "node Will reboot" $SSH "$1" "reboot" sleep 2 else _warn "node Stat is $ready. Will not reboot" fi fi second=0 while true;do stat=`$SSH "$1" "route -n |grep tunl0 |wc -l"` [ "$stat"x == ""x ] && _warn "Wait node boot..." && sleep 5 && continue ready=`nodeStat $1` if [ $stat -gt 2 -a "$ready"x == "Ready,SchedulingDisabled"x ];then _info "Wait 30s to uncordon node" sleep 30 kubectl uncordon $1 break else _warn "$1 Not Ready. stat=$stat ready=$ready ... Wait ${second}s" sleep 5 ((second+=5)) fi done