上一篇:k8s(kubernetes)通过yaml从harbor拉取镜像(史诗级,保姆级)

1.现有环境先行交代

1.1 k8s集群已经ok:3主4从,现成的用就是了(本片不涉及怎么搭建集群,专注问题本身)

k8s怎么去harbor拉取镜像 k8s jenkins harbor_harbor

1.2 harbor镜像服务器已经搭建完成,用就行了

k8s怎么去harbor拉取镜像 k8s jenkins harbor_harbor_02

1.3 Jenkins部署完成用就可以了

k8s怎么去harbor拉取镜像 k8s jenkins harbor_服务器_03

1.4 总括就是这么个问题:

k8s怎么去harbor拉取镜像 k8s jenkins harbor_kubernetes_04

注意在此示例中habor镜像已经准备好了。只是从镜像中拉取即可。

1.5最终达到的效果如下,这次是jenkins发起的。(上一篇是手动执行yaml拉取起来的)

running起来才行哦!

k8s怎么去harbor拉取镜像 k8s jenkins harbor_harbor_05

2.三步完成

再说明一下,从jenkens发起,k8s从harbor取镜像有三种方式:
1. 自由风格
2. maven风格
3. 流水线风格
这里说的是: 自由风格

2.1 jenkins页面配置

  1. 新建一个item用户控制流程
  2. 具体如下:
    你可以把你想声明的变量都声明在这里:我这里声明了4个:
  3. 配置后面需要用到的参数
    nm

2.1 jenkins配置服务器脚本

  1. 在构建这里选择execute shell
  2. 写脚本如下:
#k8s部署服务,参数为项目名、镜像名及版本、item名


sh /data/k8s/deploy_k8s_enter.sh ${ProJ} ${IMAGE_AND_VERSION} ${REPLICAS} ${NAMESPACE}
 
#echo '----------------------------------'

k8s怎么去harbor拉取镜像 k8s jenkins harbor_kubernetes_06


k8s怎么去harbor拉取镜像 k8s jenkins harbor_服务器_07


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传参问题的解决