【K8S】【Jenkins】【CI/CD】【一】交付CI/CD工具至k8s 【待写】

2023-05-16

1 安装Harbor镜像仓库(之前已部署 ,略)

可参考之前的《Kubernetes业务迁移.pdf》

网站-账号密码

http://gitlab.oldxu.net:30080/users/sign_in    ( root/ admin12345 )
http://sonar.oldxu.net:30080/                  (admin / admin12345)  #初始 admin / admin
http://jenkins.oldxu.net:30080/                (admin / admin12345)

2 交付GitLab至K8S (sts、svc、ingress)

Gitlab以容器方式运行,需要持久化如下几个目录中的数据
在这里插入图片描述

#拉取 推送
docker pull gitlab/gitlab-ce:14.6.0-ce.0
docker tag gitlab/gitlab-ce:14.6.0-ce.0 harbor.oldxu.net/ops/gitlab-ce:14.6.0
docker push harbor.oldxu.net/ops/gitlab-ce:14.6.0
#创建 ns 、和docker-registry
kubectl create ns ops

kubectl create secret docker-registry harbor-admin \
 --docker-username=admin \
 --docker-password=Harbor12345 \
 --docker-server=harbor.oldxu.net \
 -n ops

1、 gitlab-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gitlib
  namespace: ops
spec:
  serviceName: "gitlab-svc"
  selector:
    matchLabels:
      app: gitlab
  template:
    metadata:
      labels:
        app: gitlab
    spec:
      imagePullSecrets: 
      - name: harbor-admin
      
      containers:
      - name: gitlab-ce
        image: harbor.oldxu.net/ops/gitlab-ce:14.6.0
        imagePullPolicy: IfNotPresent
        env:
        - name: GITLAB_ROOT_PASSWORD
          value: "admin123"
        - name: GITLAB_OMNIBUS_CONFIG
          value: |
            external_url "http://gitlab.oldxu.net"
            gitlab_rails['time_zone'] = 'Asia/Shanghai'
            node_exporter['enable'] = false
            redis_exporter['enable'] = false
            postgres_exporter['enable'] = false
            gitlab_exporter['enable'] = false
            grafana['enable'] = false
            grafana['reporting_enabled'] = false
            prometheus['enable'] = false
            prometheus['monitor_kubernetes'] = false
        
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        volumeMounts:
        - name: data
          mountPath: /etc/gitlab
          subPath: config
          
        - name: data
          mountPath: /var/opt/gitlab
          subPath: data
               
        - name: data
          mountPath: /var/log/gitlab
          subPath: logs
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 25Gi 

2、 gitlab-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: gitlab-svc
  namespace: ops
spec:
  clusterIP: None
  selector:
    app: gitlab
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 443  

3、 gitlab-ingress.yaml

#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gitlab-ingress
  namespace: ops
spec:
  ingressClassName: "nginx"
  rules:
  - host: "gitlab.oldxu.net"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: gitlab-svc
          servicePotr: 80
          #service:
          #  name: gitlab-svc
          #  port: 
          #    name: http
    

设置gitlab的界面语言为中文
在这里插入图片描述

3 交付PostgreSQL至K8S (sts 、 svc)

部署说明:
在这里插入图片描述

Sonarqube扫描流程:
1、使用SonarScanner客户端工具将代码源文件以http/https方式推送给Sonarqube服务端;
2、Sonarqube服务端基于ElasticSerach对代码进行分析,而后将分析结果存储至Database;
3、Sonarqube服务端读取Database数据,然后将扫描结果进行前端展示;
所以,安装Sonarqube之前需要先安装依赖的数据库,后期进行漏洞扫描时还需要借助SonarScanner客户端;
#Sonarqube需要PostgreSQL
#下载postgresql镜像
docker pull postgres:13.8
docker tag  621268accecf harbor.oldxu.net/ops/postgres:13.8
docker push harbor.oldxu.net/ops/postgres:13.8

1、 pgsql-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql
  namespace: ops
spec:
  serviceName: "pgsql-svc"
  selector:
    matchLabels:
      app: pgsql
  template:
    metadata:
      labels:
        app: pgsql
    spec:
      imagePullSecrets:
      - name: harbor-admin
      
      containers:
      - name: postgresql
        image: harbor.oldxu.net/ops/postgres:13.8
        imagePullPolicy: IfNotPresent
        env:
        - name: POSTGRES_DB
          value: sonardb
        - name: POSTGRES_USER
          value: sonar
        - name: POSTGRES_PASSWORD
          value: "123456"
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: db
          mountPath: /var/lib/postgresql/data
          
  volumeClaimTemplates:
  - metadata:
      name: db
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 20Gi

2、 pgsql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: pgsql-svc
  namespace: ops
spec:
  clusterIP: None
  selector:
    app: pgsql
  ports:
  - port: 5432

3、检查postgresql

kubectl exec -it -n ops postgresql-0 -- bash
root@postgresql-0:/# psql -Usonar -d sonardb

sonardb=# \l+

在这里插入图片描述

4 交付Sonarqube至K8S (sts、svc、ingress)

#下载sonarqube镜像
docker pull sonarqube:9.7-community
docker tag sonarqube:9.7-community harbor.oldxu.net/ops/sonarqube:9.7
docker push harbor.oldxu.net/ops/sonarqube:9.7

1、 sonarqube-sts.yaml

#需要借助busybox调整内核参数

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sonarqube
  namespace: ops
spec:
  serviceName: "sonarqube-svc"
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      imagePullSecrets:
      - name: harbor-admin
      
      initContainers:
      - name: set-kernel
        image: busybox
        command: ["sh","-c","sysctl -w vm.max_map_count=524288 ; sysctl -w fs.file-max=131072 ; ulimit -n 131072 ; ulimit -u 8192"] 
        securityContext:
          privileged: true
      containers:
      - name: sonarqube
        image: harbor.oldxu.net/ops/sonarqube:9.7
        imagePullPolicy: IfNotPresent
        
        env:
        - name: JAVA_OPTS
          value: -Duser.timezone=Asia/Shanghai
        - name: SONARQUBE_JDBC_USERNAME
          value: sonar
        - name: SONARQUBE_JDBC_PASSWORD
          value: "123456"
        - name: SONARQUBE_JDBC_URL
          value: jdbc:postgresql://pgsql-svc:5432/sonardb
        
        resources:
          limits:
            cpu: 1500m
            memory: 2048Mi
        ports:
        - name: web
          containerPort: 9000
        volumeMounts:
        - name: data
          mountPath: /opt/sonarqube/data
          subPath: data
        - name: data
          mountPath: /opt/sonarqube/logs
          subPath: logs
        - name: data
          mountPath:  /opt/sonarqubee/extensions
          subPath: extensions

  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 20Gi

2、 sonarqube-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: sonarqube-svc
  namespace: ops
spec:
  clusterIP: None
  selector:
    app: sonarqube
  ports:
  - name: web
    port: 9000

3、 sonarqube-ingress.yaml

#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sonarqube-ingress
  namespace: ops
spec:
  ingressClassName: "nginx"
  rules:
  - host: "sonar.oldxu.net"
    http:
      paths: 
      - path: /
        pathType: Prefix
        backend:
          serviceName: sonarqube-svc
          servicePort: 9000
        #service:
        #  name: sonarqube-svc
        #  port: 
        #    name: web

4、 访问sonarqube

安装中文插件,随后出现install pending, 随后点击 “restart server”
在这里插入图片描述

5 交付Jenkins至K8S (rbac 、 sts 、svc 、 ingress)

#下载 ,打tab ,推送
docker pull jenkins/jenkins:2.346.3-2-lts
docker tag jenkins/jenkins:2.346.3-2-lts harbor.oldxu.net/ops/jenkins:2.346
docker push harbor.oldxu.net/ops/jenkins:2.346

创建RBAC (Jenkins) 01-jenkins-rbac.yaml

# serviceaccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: ops

---
# clusterRole
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jenkins
rules:
  - apiGroups: ["extensions", "apps"]
    resources: ["deployments", "ingresses"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
  - apiGroups: [""]
    resources: ["pods/exec"]
    verbs: ["create", "delete", "get", "list", "patch", "update", "watch"]
  - apiGroups: [""]
    resources: ["pods/log", "events"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get"]

---
# clusterrolebinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins
  namespace: ops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins
    namespace: ops

02-jenkins-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: jenkins
  namespace: ops
spec:
  serviceName: "jenkins-svc"
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      serviceAccount: jenkins
      imagePullSecrets:
      - name: harbor-admin

      containers:
        - name: jenkins
          image: harbor.oldxu.net/ops/jenkins:2.346
          imagePullPolicy: IfNotPresent
          securityContext:
            privileged: true
            runAsUser: 0  #root身份运行
          env:
          - name: JAVA_OPTS
            value: -Duser.timezone=Asia/Shanghai

          ports:
            - name: http
              containerPort: 8080
            - name: agent
              containerPort: 50000
          resources:
            limits:
              cpu: 1500m
              memory: 2048Mi
          readinessProbe:
            httpGet:
              path: /login
              port: 8080
            initialDelaySeconds: 60
            timeoutSeconds: 5
            failureThreshold: 12
          volumeMounts:
            - name: data
              mountPath: /var/jenkins_home
  volumeClaimTemplates:
  - metadata: 
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 25Gi     

03-jenkins-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkins-svc
  namespace: ops
spec:
  clusterIP: None
  selector:
    app: jenkins
  ports:
    - name: http
      port: 8080
      targetPort: 8080
    - name: agent
      port: 50000
      targetPort: 50000

04-jenkins-ingress.yaml

#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: ops
spec:
  ingressClassName: "nginx"
  rules:
  - host: jenkins.oldxu.net
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: jenkins-svc 
          servicePort: 8080
          #service:
          #  name: jenkins-svc 
          #  port:
          #    name: http


访问Jenkins 。修改密码。安装插件。

[root@master01 04-jenkins]# kubectl exec -it -n ops jenkins-0 -- bash
root@jenkins-0:/# cat /var/jenkins_home/secrets/initialAdminPassword
9c6f0d23cc194970a3e8326708dbabbf

http://jenkins.oldxu.net:30080/pluginManager/available

安装Jenkins插件
中文插件: Localization: Chinese
Git插件: git、gitlab
Sonar插件: SonarQube Scanner
Pipeline插件: pipeline、Stage View、Blue Ocean
Kubernetes插件: Kubernetes

在这里插入图片描述

6 制作Jenkins pod template

6.1、maven

 wget https://linux.oldxu.net/settings_docker.xml

[root@node4 maven]# cat Dockerfile 
FROM  maven:3.8.6-openjdk-8

ADD ./settings_docker.xml /usr/share/maven/conf/settings.xml
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime



[root@node4 maven]# ls
Dockerfile  settings_docker.xml

#构建推送
docker build -t harbor.oldxu.net/ops/maven:3.8.6 .
docker push harbor.oldxu.net/ops/maven:3.8.6

6.2、sonar

docker pull emeraldsquad/sonar-scanner:2.3.0
docker tag emeraldsquad/sonar-scanner:2.3.0 harbor.oldxu.net/ops/sonar-scanner:2.3.0
docker push harbor.oldxu.net/ops/sonar-scanner:2.3.0

6.3、NodeJs

cat Dockerfile

FROM centos:7
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN curl --silent --location https://rpm.nodesource.com/setup_14.x |bash -
RUN yum install nodejs gcc-c++ make vim -y && \
    yum clean all
[root@node4 nodejs]# ls
Dockerfile

docker build -t harbor.oldxu.net/ops/nodejs:14.20 .
docker push harbor.oldxu.net/ops/nodejs:14.20

6.4、Docker

docker pull docker:20.10
docker tag docker:20.10 harbor.oldxu.net/ops/docker:20.10
docker push harbor.oldxu.net/ops/docker:20.10

6.5、kubelet

[root@node4 kubelet]# cat kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
FROM centos:7
# 1、调整时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo 'Asia/Shanghai' >/etc/timezone

# 2、添加yum源
ADD ./kubernetes.repo /etc/yum.repos.d/kubernetes.repo

# 3、安装Kubectl
RUN yum makecache && yum install kubectl-1.22.3 -y && \
    yum clean all
[root@node4 kubelet]# ls
Dockerfile  kubernetes.repo

docker build -t harbor.oldxu.net/ops/kubectl:1.22.3 .
docker push harbor.oldxu.net/ops/kubectl:1.22.3

#最好使用宿主机的k8s集群的 kubectl版本

7 、 Jenkins pipeline

7.1 pipeline示例demo

新建流水线-demo

pipeline {
  agent any
  stages {
    stage('下载代码') {
        steps {
            echo "get gitlab 的 代码"
        }
    }

    stage('检测代码'){
       steps{
         echo "sonarqube Unit TEST。。。"
       }
    }

    stage('编译代码'){
        steps{
            echo "maven  build code"
    }
    }

    stage('制作镜像'){
       steps{
           echo "build docker"
       }
    
    }

    stage('部署应用'){
       steps{
         echo "Deplot code....."
       }
    }

  }//stages end

}//pipeline end

blue ocean界面:
在这里插入图片描述
在这里插入图片描述

一些概念:

7.2 Jenkins Slave架构

JenkinsMaster/Slave 架构,及在Master上进行任务分配。然后由Slave来完成,不过Slave运行方式有两种:
静态SLave:需要固定的节点,配置其对应环境,手动注册到Master,然后执行任务,任务完成节点处于空闲等待状态;

动态Slave:由Master动态创建Slave的Pod,自动注册到Master,然后执行任务,任务结束Pod自动销毁;
动态Jenkins Slave:

在这里插入图片描述

8.Jenkins动态Slave配置

8.1 配置Kubernetes段

http://jenkins.oldxu.net:30080/configureClouds/

系统管理 -> 节点管理 -> configure Clouds ->Add a New Cloud -> kubernetes

Kubernetes地址: https://kubernetes.default.svc.cluster.local
Kubernetes命名空间: ops

在这里插入图片描述

#配置Jenkins段
Jenkins地址: http://jenkins-svc.ops.svc.cluster.local:8080
Jenkins通道: jenkins-svc.ops.svc.cluster.local:50000

点击“连接测试”,查看是否能连到k8s

在这里插入图片描述

8.2 运行流水线测试


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【K8S】【Jenkins】【CI/CD】【一】交付CI/CD工具至k8s 【待写】 的相关文章

  • 飞控固件烧录方法

    目录 写在前面 方法一 方法二 写在前面 整理两个烧录飞控固件的方法 方法一 1 xff09 waf targets bin ardusub upload 这时两个过程 xff0c 第一个过程target 会产生一个 px4 文件 xff0
  • Ubuntu 20.04 LTS 安装qt4 library

    How to Install Qt4 Libraries in Ubuntu 20 04 LTS July 9 2020 3 Comments The Qt4 framework has been removed from Ubuntu 2
  • STM32接入ONENET-实现数据上传和命令下发

    前言 xff1a 使用ONENET平台进行远程传输数据和远程控制开发板是相对简单的事 xff0c 但由于ONENET官方给的代码只对他家的开发板比较友好 xff0c 对于初学者来说修改这些代码相对麻烦 xff0c 所以我就分享一份STM32
  • 从x86到ARM,代码移植指北

    最近ARM架构的处理器从云到端全面开花 xff0c 比如苹果MAC上的ARM架构处理器M1 MAX就堪称王炸 xff0c 华为的鲲鹏系列ARM处理器也已经稳定服务了很长时间 xff0c 目前业内有口皆碑 xff0c 因此基于x86环境编写的
  • AGV车载控制系统搭建(初学者入门)

    本文转载 xff1a 博主 robinvista的http blog csdn net robinvista article details 78349627 目的 本文介绍 AGV 车载控制系统的实现过程 xff0c 可以分为硬件搭建和软
  • 激光无轨导航AGV,未来智能工厂的必需品

    这篇文章结合一家激光无轨导航AGV公司 xff0c 开启了进入AGV领域的学习与总结 随着国家政策大力支持 xff0c 智能制造 工业4 0 人工智能等等成为了风口 xff0c 热门话题 智能制造中重要的一环 xff0c 物流搬运 分拣和智
  • 【FreeRTOS源码阅读】<2> task.c (1) 任务创建以及TCB、List的结构

    上篇讲述了list c关于链表操作的源码阅读 xff0c 此片文章将开始阅读task c task h相关结构体 由eTaskGetState返回的任务状态 typedef enum eRunning 61 0 一个任务查询自己的状态 xf
  • github仓库添加指定commit版本的子模块

    添加子模块 git submodule add repository url local path 进入子模块目录 xff0c 将子模块回滚到指定commit版本 git reset hard commit number
  • 使用阿里云的k8s部署访问环境

    阿里云推出的kubernetes版本是1 97的 xff0c docker的版本是17 06 2 ce 3 xff0c 用的都是比较新的 xff0c 相比自己搭建集群 xff0c 使用阿里这个还是比较省事的 xff0c 不需要自己研究怎么写
  • 阿里云Ubuntu服务器图形界面配置(详细步骤,萌新看过来)

    刚买完阿里云Ubuntu服务器后 xff0c 发现并没有图形界面 xff0c 就想办法在网上搜集了一些资料配置 xff0c 结果发现一些资料配置过程并不适用于萌新 所以写这篇博客 xff0c 一为记录 xff0c 二为让萌新更快更方便的配置
  • STL简单了解

    STL xff08 Standard Template Library xff0c 标准模板库 xff09 xff1a 是一种类型参数 xff08 type parameterized xff09 的程序设计方法 xff0c 基于模板的标准
  • ROS编译D435i过程中的问题及解决

    请确保已经正确安装了ROS OPENCV realsense viewer 编译出现第一个问题 96 traversing 5 packages in topological order realsense2 camera msgs pla
  • 本科毕业设计 基于ORB SLAM3的多从机SLAM导航系统

    耗时 xff1a 两个月 需求 xff1a 多从机协作 多地图系统 稠密建图 定位 导航 硬件 xff1a 二个D435 一台X86主机 xff08 CPU 13600kf 内存 32G xff09 X86主机环境 xff1a ubuntu
  • 平衡小车之家高配版全向轮小车部分源码分析(蓝牙控制端和运动控制端)

    提前说说 intel杯初选赛过了 xff0c 接下来就是区域决赛 准备时间有两个月 xff0c 时间还是比较紧张 xff0c 必须在这两个月内把所有的知识都消化掉 接下来的打算是想面试几家公司 xff0c 试试自己的水准 xff0c 打好比
  • 当我们在谈SWIFT时,到底在谈什么?

    胜利往往伴随着放弃不切实际的幻想 当地时间2月26日 xff0c 美国 英国 欧盟与加拿大发表共同声明 xff0c 宣布将俄罗斯主要银行从SWIFT体系中剔除 SWIFT凭借着其强大的制裁效果 xff0c 在民间一直有着金融核武器之称 xf
  • 使用Aruco二维码实现定位

    首先使用cv aruco estimatePoseSingleMarkers 函数后得到两个很重要的数据revc和tevc xff0c 分别是旋转向量和平移向量 通过这两个数据就可以得到相机在世界坐标系下的坐标 此处需要了解solvePnP
  • QGC关于SetMode运行流程解析

    QGC与飞控连接后初始化 xff0c 初始飞行模式为手动模式 模式切换在Vehicle中使用 base mode和 custom mode存储模式 xff0c 初始值均为0 当QGC与飞控连接后 xff0c 飞控通过心跳包 xff08 he
  • QGC UDP 建立通讯连接

    QGC关于通信连接建立部分的程序比较复杂 xff0c 但感觉写的很厉害 xff0c 通过读代码把自己的一点理解记录下来 收集接收 空地通信管理 空地通信的管理在 应用程序设置 gt 通讯连接 中进行通信连接创建 xff0c 连接和断开 通讯
  • Win10 Vscode 远程连接Linux 错误解决办法

    错误 xff1a 在网上查找一阵后发现都不能解决我的问题 xff0c 后来发现Vscode的设置里有个 Remote ssh里的Remote SSH Config file路径是空的 尝试把自己的config文件路径放进去 xff0c 发现
  • Ubuntu设置静态IP

    安装Ubuntu后有时候IP会变化导致远程连接不上 xff0c 网上很多都是命令行操作的或者改相应的文件 xff0c 如果能在界面上操作更简单了 右上角 Setting gt Network

随机推荐