jenkins上配置打包结束后调用Shell脚本
传递参数给k8s
这里也可以使用修改yaml文件的方式实现滚动升级和部署
这里仅说明调用脚本执行方式
#定义镜像名(使用私有镜像库)
IMAGE_NAME=www.xxxxx.com:24188/saas/rest-service
#使用的k8s命名空间
docker_namespace=test
#容器名称
docker_name=rest-service
#容器labels
docker_labels=rest-service
#容器份数
docker_replicas=1
#容器内部端口
docker_port=8081
#进入Jenkins项目路径
cd ${WORKSPACE}
#修改docker时区(JAVA添加Dockerfile:"-Duser.timezone=GMT+08",)(NGINX:直接改容器时间)
#cp /etc/localtime .
#sed -i '4i ADD localtime /etc/localtime' Dockerfile
#添加并使用Dockerfile打包(Beta)
sudo tee Dockerfile <<- 'EOF'
FROM java
ADD target/rest-service*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Xmx300m","-Dserver.port=8081","-Duser.timezone=GMT+08","-jar","app.jar"]
EOF
cat Dockerfile
sudo docker build -t ${IMAGE_NAME}:${BUILD_NUMBER} .
docker images|grep ${IMAGE_NAME}
#上传至Harbor镜像仓库
docker login wh.xxxxx.com:24188 -u coho -p Password!zxc
docker push ${IMAGE_NAME}:${BUILD_NUMBER}
#升级镜像(滚动升级)(IP为kubernetes主机IP)
ssh admin1@192.168.2.241 "source /etc/profile ; pwd ; bash /home/admin1/jenkins/global/deploy.sh ${IMAGE_NAME}:${BUILD_NUMBER} ${docker_namespace} ${docker_name} ${docker_labels} ${docker_replicas} ${docker_port} ; exit"
#增加一位随机延时防止同时执行冲突报错(Beta)
radom=$(tr -cd '0-9' < /dev/urandom | head -c 1)
sleep ${radom}
#清理镜像(如果项目较多推荐改成删除生成的镜像)
docker system prune -a -f > /dev/null 2>&1
调用的kubernetes主机上/home/admin1/jenkins/global/deploy.sh
首次部署和滚动升级均可使用该脚本
该服务的网络配置会创建svc为Nodeport模式并使用k8s默认随机分配的30000-32500端口,如需修改可自行修改service部分
#/bin/sh
#自定义变量(默认缺省参数)
#镜像名称
docker_images=www.xxxxx.com:24188/saas/rest-service:test1
#命名空间
docker_namespace=test
#容器名称
docker_name=rest-service
#容器labels
docker_labels=rest-service
#容器份数
docker_replicas=1
#容器内部端口
docker_port=8081
if [ -n "$1" ] ;then
echo "使用参数构建模式"
echo "已检测到参数1"
docker_images=$1
echo "$docker_images"
sleep 2
fi
if [ -n "$2" ] ;then
echo "已检测到参数2"
docker_namespace=$2
echo "$docker_namespace"
sleep 2
fi
if [ -n "$3" ] ;then
echo "已检测到参数3"
docker_name=$3
echo "$docker_name"
sleep 2
fi
if [ -n "$4" ] ;then
echo "已检测到参数4"
docker_labels=$4
echo "$docker_labels"
sleep 2
fi
if [ -n "$5" ] ;then
echo "已检测到参数5"
docker_replicas=$5
echo "$docker_replicas"
sleep 2
fi
if [ -n "$6" ] ;then
echo "已检测到参数6"
docker_port=$6
echo "$docker_port"
sleep 2
fi
#命名空间创建
kubectl create namespace $docker_namespace
#镜像库拉取镜像并查看
docker pull $docker_images
docker images|grep $docker_images
#删除部署的容器
kubectl delete deployment/$docker_name --namespace=$docker_namespace
#删除服务(会导致端口重新分配)
#kubectl delete service/$docker_name --namespace=$docker_namespace
sleep 10
#运行www.xxxxx.com:24188/saas/nginx:1服务端口80 命名空间test 一份
kubectl run $docker_name --replicas=$docker_replicas --labels="app=$docker_labels" --image=$docker_images --port=$docker_port --namespace=$docker_namespace
kubectl get deployment --namespace=$docker_namespace
kubectl get pods --namespace=$docker_namespace
#以NodePort模式映射端口出来
kubectl expose deployment/$docker_name --type="NodePort" --port $docker_port --namespace=$docker_namespace
#返回值取到外部端口
kubectl get service --namespace=$docker_namespace
#PORT取值
port=`kubectl get service --namespace=$docker_namespace|grep TCP|grep $docker_name|awk '{print $5}'|awk -F ':' '{print $2}'|awk -F '/' '{print $1}'`
#PORT显示
echo "分配的外部端口为:"
echo $port
echo ""
echo "可通过命令'kubectl edit svc $docker_name --namespace=$docker_namespace'修改nodePort替换随机分配的端口"
echo "多端口配置请手动查看该脚本注释"
echo ""
: '
多端口配置方法例子:
kubectl edit svc --namespace=coho-test
修改port部分如下:
ports:
- name: 10000tcp01
nodePort: 10000
port: 10000
protocol: TCP
targetPort: 10000
- name: 10040tcp01
nodePort: 10040
port: 10040
protocol: TCP
targetPort: 10040
之后查看rancher界面即可
10000端口和10040端口作为nodePort模式暴露成功
'
sleep 15
#测试nodePort模式下访问
#echo "测试nodePort模式下HTTP访问:"
#curl 127.0.0.1:$port