Jenkins Pipeline 和 k8s——Devops(五)

环境

k8s-master 1.18 + Jenkins 2.245
k8s-slave 1.18
docker-register
gitlab

由于学习整理间隔时间较长,所以截图中ip有所变化,主要还是理解整个过程理解打通整个通路的原理

1 安装插件

Pipeline
Pipeline: Stage View
Blue Ocean

2 在gitlab生成access token

在User Settings->Access tokens->输入token的名字,勾选权限,点击Create personal access token,生成token后将token 保存下来,为下面jenkins配置做准备

3 gitlab配置webhook

创建流水线项目——点击高级按钮——生成token

Jenkins Pipeline 和 k8s——Devops(五)_第1张图片
Jenkins Pipeline 和 k8s——Devops(五)_第2张图片
设置GitLab并取消SSL

Jenkins Pipeline 和 k8s——Devops(五)_第3张图片
Jenkins Pipeline 和 k8s——Devops(五)_第4张图片
点击流水线语法——生成 Git 脚本

Jenkins Pipeline 和 k8s——Devops(五)_第5张图片
以此类推,Shell 也可以使用这个模板实现

以下,附上本章节需要的一些操作

4 部署 Docker 私有仓库

Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露 5000 端口,就可以使用了。

docker pull registry:2

Registry 服务默认会将上传的镜像保存在容器的/var/lib/registry,此处将主机的/home/registry 映射到容器中,便可实现将镜像保存到主机

docker run -d -v /home/registry:/var/lib/registry -p 5000:5000 --name avanty-registry registry:2

5 项目根目录中添加 Dockerfile 和 k8s 配置文件

Dockerfile

FROM openjdk:8-jre
MAINTAINER [email protected]
# 创建目录
RUN mkdir /workspace
# 对外映射挂载目录s
VOLUME /workspace
# 指定当前工作目录
WORKDIR /workspace
EXPOSE 9001
#以下三行标识把 jar 重命名为 app.jar 并且使用 touch 命令将文件的修改和创建时间改为当前时间
ARG JAR_FILE
ADD ${JAR_FILE} /app.jar
RUN bash -c 'touch /app.jar'
#可以用 copy 命令代替上面三行命令
#COPY ./target/your-project-name-1.0-SNAPSHOT.jar ./app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

k8s-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {APP_NAME}-deployment
spec:
  selector:
    matchLabels:
      app: {APP_NAME}
  replicas: 1
  template:
    metadata:
      labels:
        app: {APP_NAME}
    spec:
      containers:
        - name: {APP_NAME}
          image: {IMAGE_URL}:{PORT}/{IMAGE_NAME}:{IMAGE_TAG}
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9001 #容器内部 port
---
apiVersion: v1
kind: Service
metadata:
  name: {APP_NAME}-service
spec:
  type: NodePort
  selector:
    app: {APP_NAME}
  ports:
    - protocol: TCP
      port: 9001
      targetPort: 9001  #跟 Dockerfile 中 EXPOSE 的端口对应
      nodePort: 30010 # 外部访问端口

6 Pipeline

pipeline {
    agent any
    environment {
        WORKSPACE = "/root/.jenkins/workspace/PipelineTest/JenkinsTest"
        BACKPATH="/root/.jenkins/workspace/backup"
        GIT_TAG = sh(returnStdout: true,script: 'git describe --tags --always').trim()
    }
    parameters {
        string(name: 'Docker_Registry', defaultValue: '172.16.69.173', description: 'Docker 仓库地址')
        string(name: 'APP_NAME', defaultValue: 'kpp', description: '镜像名称')
        string(name: 'DOCKER_IMAGE', defaultValue: 'kpi', description: 'Docker 镜像名')
        string(name: 'K8S_NAMESPACE', defaultValue: 'demo', description: 'k8s namespace')
    }
    stages {
        stage('Git Pull') {
            steps {
                git credentialsId: '1863821f-861f-425c-91a9-3a1b3ee70b3c', url: 'http://172.16.69.171/ichampion/jenkinstest.git'
            }
        }
        stage('Maven Build') {
            steps {
                sh label: '',
                script: '''
                    cd ${WORKSPACE}
                    rm -rf target/*.jar
                    mvn clean package
                    '''
                }
        }
        stage('Docker Build') {
            steps {
                    sh label: '',
                    script: '''
                        cd ${WORKSPACE}
                        #将 jar 放到与 Dockerfile 同级目录
                        cp target/*.jar .
                        echo "build"
                        docker build --build-arg JAR_FILE=*.jar -t ${Docker_Registry}:5000/${DOCKER_IMAGE}:$GIT_TAG .
                        echo "push"
                        docker push ${Docker_Registry}:5000/${DOCKER_IMAGE}:$GIT_TAG
                        echo "rmi"
                        docker rmi ${Docker_Registry}:5000/${DOCKER_IMAGE}:$GIT_TAG
                    '''
                }
        }
        stage('Deploy Application') {
            steps {
                    sh label: '',
                    script: '''
                        cd ${WORKSPACE}
                        sed -i "s/{IMAGE_URL}/\"${Docker_Registry}\"/g;s/{PORT}/5000/g;s/{IMAGE_NAME}/\"${DOCKER_IMAGE}\"/g;s/{IMAGE_TAG}/\"${GIT_TAG}\"/g;s/{APP_NAME}/\"${APP_NAME}\"/g" k8s-deployment.yaml
                        kubectl apply -f k8s-deployment.yaml --namespace=${K8S_NAMESPACE}
                    '''
                }
        }
    }
}

7 本章节可能常用的命令

删除 deployment
kubectl get deployment -n [namespace]
kubectl delete deployment [deployment name] -n [namespace]

强制删除 pod
kubectl delete pod [pod name] --force --grace-period=0 -n [namespace]

删除 namespace
kubectl delete namespace [namespace] --force --grace-period=0

kubectl get pods -A  -o wide

Jenkins Pipeline 和 k8s——Devops(五)_第6张图片
Jenkins Pipeline 和 k8s——Devops(五)_第7张图片

你可能感兴趣的:(服务器,devops,kubernetes,docker,jenkins)