部署
1
| kubectl apply -f nginx.yaml --record=true
|
滚动更新
滚动更新策略 spec.strategy
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: extensions/v1beta1 kind: Deployment metadata: name: Enter deployment name spec: strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate replicas: Enter the number of replicas template: metadata: labels: editor: vscode spec: containers: - name: name image: Enter containers image
|
更新策略有两种:
- RollingUpdate :默认的更新策略,表示滚动更新
- Recreate:重建,会终止所有正在运行的实例,然后用较新的版本来重新创建它们,即在创建新 Pods 之前,所有现有的 Pods 会被杀死,测试环境可以使用
Pod 有多个副本,滚动更新的过程就是轮流更新 pod,直至所有 pod 都更新成功,至于如何轮流更新,取决于 maxSurge 和 maxUnavailable 这两个参数,示例:
1 2 3
| maxSurge: 1 maxUnavailable: 0
|
升级命令 kubectl set
:
1 2 3 4 5 6 7
| kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N [options]
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1 kubectl set image deployments,rc nginx=nginx:1.9.1 --all kubectl set image daemonset abc *=nginx:1.9.1 kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml
|
除了使用 kubectl get
命令升级,还可以直接 kubectl apply -f
升级,但是需要先手动修改 yaml 文件,所以不推荐使用
回滚
回滚到上一个版本
1
| kubectl rollout undo deployment/nginx-deployment -n linux36
|
回滚到指定版本
1 2 3 4 5 6 7 8 9 10
| kubectl rollout history deployment/nginx-deployment -n linux36 deployment.extensions/nginx-deployment REVISION CHANGE-CAUSE 1 kubectl apply --filename=nginx.yaml --record=true 3 kubectl apply --filename=nginx.yaml --record=true 4 kubectl apply --filename=nginx.yaml --record=true
kubectl rollout undo deployment/nginx-deployment --to-revision=1 -n linux36
|
Jenkins 持续继承与部署
参考以下脚本:
1 2 3 4 5 6
| $cat build-command.sh
docker build -t harbor.magedu.local/pub-images/nginx-base-wordpress:v1.14.2 . sleep 1 docker push harbor.magedu.local/pub-images/nginx-base-wordpress:v1.14.2
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| $cat linux36-ningx-deploy.sh
starttime=$(date +'%Y-%m-%d %H:%M:%S')
SHELL_DIR="/root/scripts" SHELL_NAME="$0" K8S_CONTROLLER1="192.168.7.101" K8S_CONTROLLER2="192.168.7.102" DATE=$(date +%Y-%m-%d_%H_%M_%S) METHOD=$1 Branch=$2 if test -z $Branch; then Branch=develop fi function Code_Clone() { Git_URL="git@172.20.100.1:linux36/app1.git" DIR_NAME=$(echo ${Git_URL} | awk -F "/" '{print $2}' | awk -F "." '{print $1}') DATA_DIR="/data/gitdata/linux36" Git_Dir="${DATA_DIR}/${DIR_NAME}" cd ${DATA_DIR} && echo "即将清空上一版本代码并获取当前分支最新代码" && sleep 1 && rm -rf ${DIR_NAME} echo "即将开始从分支${Branch} 获取代码" && sleep 1 git clone -b ${Branch} ${Git_URL} echo "分支${Branch} 克隆完成,即将进行代码编译!" && sleep 1 sleep 1 cd ${Git_Dir} tar czf ${DIR_NAME}.tar.gz ./* }
function Copy_File() { echo "压缩文件打包完成,即将拷贝到k8s 控制端服务器${K8S_CONTROLLER1}" && sleep 1 scp ${Git_Dir}/${DIR_NAME}.tar.gz root@${K8S_CONTROLLER1}:/opt/k8s- data/dockerfile/linux36/nginx/ echo "压缩文件拷贝完成,服务器${K8S_CONTROLLER1}即将开始制作Docker 镜像!" && sleep 1 }
function Make_Image() { echo "开始制作Docker镜像并上传到Harbor服务器" && sleep 1 ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/dockerfile/linux36/nginx && bash build- command.sh ${DATE}" echo "Docker镜像制作完成并已经上传到harbor服务器" && sleep 1 }
function Update_k8s_yaml() { echo "即将更新k8s yaml文件中镜像版本" && sleep 1 ssh root@${K8S_CONTROLLER1} "cd /opt/k8s-data/yaml/linux36/nginx && sed -i 's/image: harbor.magedu.*/image: harbor.magedu.net\/linux36\/nginx-web1:${DATE}/g' nginx.yaml" echo "k8s yaml文件镜像版本更新完成,即将开始更新容器中镜像版本" && sleep 1 }
function Update_k8s_container() { ssh root@${K8S_CONTROLLER1} "kubectl set image deployment/linux36-nginx-deployment linux36-nginx-container=harbor.magedu.net/linux36/nginx-web1:${DATE} -n linux36" echo "k8s 镜像更新完成" && sleep 1 echo "当前业务镜像版本: harbor.magedu.net/linux36/nginx-web1:${DATE}" endtime=$(date +'%Y-%m-%d %H:%M:%S') start_seconds=$(date --date="$starttime" +%s) end_seconds=$(date --date="$endtime" +%s) echo "本次业务镜像更新总计耗时:"$((end_seconds - start_seconds))"s" }
function rollback_last_version() { echo "即将回滚之上一个版本" ssh root@${K8S_CONTROLLER1} "kubectl rollout undo deployment/linux36-nginx-deployment -n linux36" sleep 1 echo "已执行回滚至上一个版本" }
usage() { echo "部署使用方法为 ${SHELL_DIR}/${SHELL_NAME} deploy " echo "回滚到上一版本使用方法为 ${SHELL_DIR}/${SHELL_NAME} rollback_last_version" }
main() { case ${METHOD} in deploy) Code_Clone Copy_File Make_Image Update_k8s_yaml Update_k8s_container ;; rollback_last_version) rollback_last_version ;; *) usage ;; esac }
main $1 $2 $3
|
代码升级和回滚
代码升级:Jenkins 负责 pull 最新代码,编译成 war 包(如果需要),然后将编译后的包发送到 k8s 或者专门负责制作镜像的服务器,使用 dockerfile 制作完新镜像后,就上传到 harbor,最后再由 kubectl 执行更新镜像的操作
代码回滚:直接回滚镜像即可