上一篇:k8s(kubernetes)通过yaml从harbor拉取镜像(史诗级,保姆级)
1.现有环境先行交代
1.1 k8s集群已经ok:3主4从,现成的用就是了(本片不涉及怎么搭建集群,专注问题本身)
1.2 harbor镜像服务器已经搭建完成,用就行了
1.3 Jenkins部署完成用就可以了
1.4 总括就是这么个问题:
注意在此示例中habor镜像已经准备好了。只是从镜像中拉取即可。
1.5最终达到的效果如下,这次是jenkins发起的。(上一篇是手动执行yaml拉取起来的)
running起来才行哦!
2.三步完成
再说明一下,从jenkens发起,k8s从harbor取镜像有三种方式:
1. 自由风格
2. maven风格
3. 流水线风格
这里说的是: 自由风格
2.1 jenkins页面配置
- 新建一个item用户控制流程
- 具体如下:
你可以把你想声明的变量都声明在这里:我这里声明了4个: - 配置后面需要用到的参数
nm
2.1 jenkins配置服务器脚本
- 在构建这里选择execute shell
- 写脚本如下:
#k8s部署服务,参数为项目名、镜像名及版本、item名
sh /data/k8s/deploy_k8s_enter.sh ${ProJ} ${IMAGE_AND_VERSION} ${REPLICAS} ${NAMESPACE}
#echo '----------------------------------'
3. jenkens服务器上的脚本
路径:/data/k8s/
#!/bin/bash
####################################
#
# k8s部署入口 by yuhongliang
#
####################################
MASTER="10.1.33.61" #k8s master ip
CONF_DIR="/data/kube-conf" # k8s 服务器上用于存放配置的目录
K8S_USERNAME='root' # 登录k8s username
LOCAL_CON_DIR="/data/k8s" # jenkins服务器用于存放和k8s相关文件的目录
SH_NAME='deploy_k8s.sh'
ProJ=$1-prod #wy-h5 添加一个-prod表示生产环境 wy-h5-prod
IMAGE_AND_VERSION=$2 # like wy/h5:2
REPLICAS=$3 # like 3
NAMESPACE=$4 #like wy
YAML_NAME=${ProJ}_deploy_k8s.yaml # file name of yaml
SH_NAME='deploy_k8s.sh'
# transfer yaml & sh to k8s
scp ${LOCAL_CON_DIR}/${YAML_NAME} ${MASTER}:${CONF_DIR} #远程传送yaml
scp ${LOCAL_CON_DIR}/${SH_NAME} ${MASTER}:${CONF_DIR} #远程传送sh
# run k8s script
echo "+x----->"
ssh -p '22' ${K8S_USERNAME}@${MASTER} chmod +x ${CONF_DIR}/${SH_NAME}
echo "sh----->"
ssh -p '22' ${K8S_USERNAME}@${MASTER} sh ${CONF_DIR}/${SH_NAME} ${ProJ} ${IMAGE_AND_VERSION} ${REPLICAS} ${NAMESPACE} ${YAML_NAME}
echo "finished!"
注意里面使用了传过来的参数,他的目标就是把同目录下的deploy_k8s.sh和deploy_k8s.yaml传到k8s服务器的/data/kube-conf目录下,然后ssh登录上k8s服务器执行deploy_k8s.sh,再执行的过程中
如果ssh不过去,请添加权限,这里不再赘述!
4. deploy_k8s.sh脚本如下:
#!/bin/bash
CONF_DIR="/data/kube-conf" # k8s 服务器上用于存放配置的目录
IMAGE_AND_VERSION=$2 # like wy/h5:2
ProJ=$1 #添加一个-prod表示生产环境 wy-h5-prod
IMAGE_AND_VERSION=$2 # like wy/h5:2
REPLICAS=$3 # like 3
NAMESPACE=$4 #like wy
YAML_NAME=$5 # file name of yaml like wy-h5-prod_deploy_k8s.yaml
# Pod running process
RUN=$(kubectl get po -n wy | grep -w ${ProJ}|wc -l)
echo ${RUN}
if [ $RUN -eq 0 ];then
echo " deploy------>"
# apply pod service
export ProJ=${ProJ}
export IMAGE_AND_VERSION=${IMAGE_AND_VERSION}
export REPLICAS=${REPLICAS}
export NAMESPACE=${NAMESPACE}
envsubst < ${CONF_DIR}/${YAML_NAME}| kubectl apply -f -
else
# Delete pod service
echo " delete first----->"
#传参数进yaml文件
export ProJ=${ProJ}
export IMAGE_AND_VERSION=${IMAGE_AND_VERSION}
export REPLICAS=${REPLICAS}
export NAMESPACE=${NAMESPACE}
envsubst < ${CONF_DIR}/${YAML_NAME}| kubectl delete -f -
echo " sleep 20s to waitting delete old pods service----->"
sleep 20 # sleep 5 s to wait
echo " deply second----->"
# apply pod service
export ProJ=${ProJ}
export IMAGE_AND_VERSION=${IMAGE_AND_VERSION}
export REPLICAS=${REPLICAS}
export NAMESPACE=${NAMESPACE}
envsubst < ${CONF_DIR}/${YAML_NAME}| kubectl apply -f -
fi
exit
5.deploy_k8s.yaml
kind: Deployment # 一次部署
apiVersion: apps/v1 # 版本号
metadata:
name: ${ProJ} # 微服务服务的名字
namespace: ${NAMESPACE} # k8s中项目的名字
labels:
app: ${ProJ} # id一样,唯一标识
spec: # 规格详情
minReadySeconds: 20
replicas: ${REPLICAS}
selector:
matchLabels:
app: ${ProJ} #匹配的就是lab中定义的
template:
metadata:
labels:
app: ${ProJ}
spec:
containers:
- name: ${ProJ} #容器的名字 docker run --name 后面的名字
#仓库地址
#registryUrl='10.1.8.151:8082'
#项目名:
#projectName=wy
#服务名
#serviceName=wy-user
#服务名-TAG
# serviceTag=${BUILD_NUMBER}
#端口地址
#servicePort=$servicePort # 映射出去后需要编排好
image: 10.1.8.151:8082/${IMAGE_AND_VERSION} # harbor中获取,可能是环境变量的值
ports:
- containerPort: 8080 # 每一个容器都是默认$servicePort启动,因为在容器内不没有问题的。
protocol: TCP
imagePullPolicy: IfNotPresent #Always 总是拉取,IfNotPresent如果不存在才拉取
imagePullSecrets: # 使用密码登录
- name: harbor-login-registry
restartPolicy: Always # 如果镜像出问题,就自己重新启动
terminationGracePeriodSeconds: 10 #优雅停机的秒数
strategy:
type: RollingUpdate #k8s滚动跟新,1.0,2.0, 保证高可用
rollingUpdate:
maxUnavailable: 25% # 最大不可用4 台每次关一个。
maxSurge: 25%
---
kind: Service
apiVersion: v1
metadata:
name: ${ProJ}
namespace: ${NAMESPACE}
labels:
app: ${ProJ}
spec:
ports:
- name: http
protocol: TCP
port: 8080 # 暴露出来的端口,可以让客户端访问的端口
targetPort: 8080 # 容器内部的端口,可以均设置为$servicePort
nodePort: 30001 #ingress 代理的端口。 要规划好,10000 10001 10002
selector:
app: ${ProJ}
type: NodePort
sessionAffinity: None # 无须 会话亲和
2.3 jenkins页面发起部署到k8s
jenkins页面发起,点击按钮开始构建,稍等片刻即可成功!
3.总结
重点在理解,此示例中habor镜像已经准备好了。只是从镜像中拉取即可。
用的是上述三种方法中的第一种自由风格。
特别注意部署文件yaml传参的问题。
下一篇:k8s部署pod和service时yaml传参问题的解决