• jenkins + k8s + lnp


    前提条件:

    K8S 已部署好,traefik也部署完成

    K8S 集群上都挂载NFS盘,防止jenkins挂掉后配置消失

    基础镜像使用 lnp,PHP 5.6.31  nginx/1.8.1 

    基础镜像下载地址:docker pull liuyusheng/alpine-lnp:v1

    docker私有仓库

    [root@master jenkis]# cat jenkins-deployment.yaml 
    apiVersion: extensions/v1beta1  
    kind: Deployment  
    metadata:  
      name: jenkins  
    spec:  
      replicas: 1  
      strategy:  
        type: RollingUpdate  
        rollingUpdate:  
          maxSurge: 2  
          maxUnavailable: 0  
      template:  
        metadata:  
          labels: 
            app: jenkins-last  
        spec:  
          nodeSelector: 
            jenkins: jenkins
          containers:  
          - name: jenkins  
            image: jenkins:alpine
            imagePullPolicy: IfNotPresent  
            ports:  
            - containerPort: 8080  
              name: web  
              protocol: TCP  
            volumeMounts:
            - name: jenkinshome
              mountPath: /var/jenkins_home
          volumes:
          - name: jenkinshome
            nfs:
              server: 192.168.0.161
              path: /data/jenkins
    
    ---
    kind: Service  
    apiVersion: v1  
    metadata:  
      name: jenkins  
    spec:  
      ports:  
      - port: 8080  
        targetPort: 8080  
        name: web  
      - port: 50000  
        targetPort: 50000  
        name: agent  
      selector:  
        app: jenkins-last  
    jenkins-ingress.yaml
    
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: traefik-ingress
      namespace: default
    spec:
      rules:
      - host: my.jenkins.com
        http:
          paths:
          - path: /
            backend:
              serviceName: jenkins
              servicePort: 8080

    启动安装jenkins

    kubectl create -f .

    traefik 上可以查看

    配置好SSH KEY  连接,这里不做配置SSH-KEY 操作

    jenkins
    
    SERVER="192.168.0.153"
    USER="root"
    PORT="22"
    GROUP_NAME="lin_lang"
    JOB_NAME="fabaoguo"
    DST_PATH="/data/tmp/"
    HOME_DIR="/var/jenkins_home"
    FILE_NAME=${JOB_NAME}.tar.gz
    
    DOCKER_REG="192.168.0.153:5000"
    NGINX_CONF="www.${JOB_NAME}.com.conf"
    BASE_IMG="alpine:v5"
    #BUILD_NUM="v1"
    
    WWW_NAME="www.fabaoguo.com"
    
    BUILD_NUM=`date +%F-%H-%M-%S`
    
    #init
    /usr/bin/test -d ${HOME_DIR}/releaseDir || /bin/mkdir  -p ${HOME_DIR}/releaseDir
    
    /bin/tar -zcf ${HOME_DIR}/releaseDir/${FILE_NAME} --exclude=.svn --exclude releaseDir  *
    
    cp ${HOME_DIR}/scripts/www.example.com.conf ${HOME_DIR}/scripts/${NGINX_CONF}
    sh ${HOME_DIR}/scripts/replace.sh ${HOME_DIR}/scripts/${NGINX_CONF} ${JOB_NAME}
    
    #deploy
    /usr/bin/scp  ${HOME_DIR}/releaseDir/${FILE_NAME} ${USER}@${SERVER}:${DST_PATH};
    /usr/bin/scp  ${HOME_DIR}/scripts/www.${JOB_NAME}.com.conf ${USER}@${SERVER}:${DST_PATH}
    
    /usr/bin/ssh -p ${PORT} ${USER}@${SERVER} "sh /data/scripts/build_lnp.sh ${FILE_NAME} ${NGINX_CONF} ${BASE_IMG} ${DOCKER_REG}/${JOB_NAME} ${BUILD_NUM}";
    
    /usr/bin/ssh -p ${PORT} ${USER}@${SERVER} "sh /data/scripts/start_app.sh ${WWW_NAME} ${JOB_NAME} ${JOB_NAME} ${BUILD_NUM} ${JOB_NAME}.yaml"
    
    rm  -f  ${HOME_DIR}/releaseDir/${FILE_NAME}
    rm -f ${HOME_DIR}/scripts/www.${JOB_NAME}.com.conf
    192.168.0.153服务器上
    [root@master scripts]# cat build_lnp.sh 
    #!/bin/bash
    APP_NAME=$1
    NGINX_CONF=$2
    BASE_IMG=$3
    FINISH_IMG=$4
    BUILD_NUM=$5
    
    test -d /data/tmp || mkdir /data/tmp -p
            
    
    if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ] || [ ! -n "$4" ] || [ ! -n "$5" ] ;then
        echo "build error,please input  vars"
        exit 1
    else
        ADD_FILE="ADD ${APP_NAME} /opt/www/"
        ADD_TWO="ADD ${NGINX_CONF} /etc/nginx/conf.d/"
        cp /data/build/Dockerfile_template /data/tmp/Dockerfile 
        sed -i "s#BASE_IMG#$BASE_IMG#" /data/tmp/Dockerfile
        sed -i "s#ADD_FILE#$ADD_FILE#" /data/tmp/Dockerfile
        sed -i "s#ADD_TWO#$ADD_TWO#" /data/tmp/Dockerfile
        docker build --no-cache=true -t  ${FINISH_IMG}:${BUILD_NUM} /data/tmp/
        docker push  ${FINISH_IMG}:${BUILD_NUM}
        echo  "build img is ${FINISH_IMG}:${BUILD_NUM}"
    
    fi
    rm -rf /data/tmp/*

    DOCKERFILE 模板

    [root@master build]# cat Dockerfile_template 
    FROM BASE_IMG
    MAINTAINER netop 
    ENV REFRESHED_AT 2017-11-09
    ADD_FILE
    ADD_TWO

     创建K8S pod

    [root@master scripts]# cat start_app.sh 
    #!/bin/sh
    
    WWW_NAME=$1
    APP_NAME=$2
    FINISH_IMG=$3
    BUILD_NUM=$4
    
    
    APP_DIR="/data/scripts"
    APP_YAML="$5"
    
    if [ ! -n "$1" ] || [ ! -n "$2" ] || [ ! -n "$3" ] || [ ! -n "$4" ] || [ ! -n "$5" ];then
        echo "build error,please input  vars"
    else
        cp $APP_DIR/deploy/example-app.yaml $APP_DIR/app/$APP_YAML
        sed -i s"/example/${APP_NAME}/g" ${APP_DIR}/app/${APP_YAML}
        sed -i s"/myimages/"${FINISH_IMG}"/g" ${APP_DIR}/app/${APP_YAML}
        sed -i s"/build_num/${BUILD_NUM}/g" ${APP_DIR}/app/${APP_YAML}
        sed -i s"/www.host.com/${WWW_NAME}/g" ${APP_DIR}/app/${APP_YAML}
    
    fi
    
    kubectl apply -f $APP_DIR/app/$APP_YAML --record

    k8s APP yaml模板

    [root@master scripts]# cat deploy/example-app.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      name: alpine-example
    spec:
      ports:
        - port: 80
          targetPort: 80
      selector:
        app: alpine-example
    ---
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: alpine-example
    spec:
      replicas: 1
      minReadySeconds: 60
      strategy:
        rollingUpdate:
          maxSurge: 50%
      template:
        metadata:
          labels:
            app: alpine-example
        spec:
          containers:
          - name: alpine-example
            image: 192.168.0.153:5000/myimages:build_num
            #imagePullPolicy: IfNotPresent
    imagePullPolicy: Always ports: - containerPort: 80 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: alpine-example spec: rules: - host: www.host.com http: paths: - path: / backend: serviceName: alpine-example servicePort: 80
    [root@master two]# kubectl get po -o wide
    NAME                                   READY     STATUS    RESTARTS   AGE       IP               NODE
    alpine-fabaoguo-3144943877-l9l8j       1/1       Running   0          22m       10.254.97.131    master

    Traefik 上查看

  • 相关阅读:
    hpuoj--校赛--2015年的第一场雪(暴力)
    hpuoj--校赛--考试来了(水题)
    hpuoj--校赛--特殊的比赛日期(素数判断+模拟)
    bean copy
    spring boot+jaspersoft实现复杂报表
    spring boot 启动时运行代码(2)ApplicationListener
    Alibaba Java Coding Guidelines 安装(eclipse)并简单使用
    spring boot 系统启动时运行代码(1)-@PostConstruct
    java泛型&bean copy list
    jgroups-raft
  • 原文地址:https://www.cnblogs.com/Tempted/p/7810043.html
Copyright © 2020-2023  润新知