一、部署流程

流程图

二、环境搭建

Gitlab

官方文档
依照网络上的安装教程即可

Jenkins

官方文档
依照网络上的安装教程即可

KubeSphere

官方文档

KubeSphere 名词解释

KubeSphere Kubernetes 对照释义
项目 Namespace, 为 Kubernetes 集群提供虚拟的隔离作用,详见 Namespace
容器组 Pod,是 Kubernetes 进行资源调度的最小单位,每个 Pod 中运行着一个或多个密切相关的业务容器
部署 Deployments,表示用户对 Kubernetes 集群的一次更新操作,详见 Deployment
有状态副本集 StatefulSets,用来管理有状态应用,可以保证部署和 scale 的顺序,详见 StatefulSet
守护进程集 DaemonSet,保证在每个 Node 上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用,详见 Daemonset
任务 Jobs,在 Kubernetes 中用来控制批处理型任务的资源对象,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。任务管理的 Pod 根据用户的设置将任务成功完成就自动退出了。比如在创建工作负载前,执行任务,将镜像上传至镜像仓库。详见 Job
定时任务 CronJob,是基于时间的 Job,就类似于 Linux 系统的 crontab,在指定的时间周期运行指定的 Job,在给定时间点只运行一次或周期性地运行。详见 CronJob
服务 Service, 一个 Kubernete 服务是一个最小的对象,类似 Pod,和其它的终端对象一样,详见 Service
应用路由 Ingress,是授权入站连接到达集群服务的规则集合。可通过 Ingress 配置提供外部可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等,详见 Ingress
镜像仓库 Image Registries,镜像仓库用于存放 Docker 镜像,包括公共镜像仓库(如 DockerHub)和私有镜像仓库(如 Harbor)
存储卷 PersistentVolumeClaim(PVC),满足用户对于持久化存储的需求,用户将 Pod 内需要持久化的数据挂载至存储卷,删除 Pod 后,数据仍保留在存储卷内。KubeSphere 推荐使用动态分配存储,当集群管理员配置存储类型后,集群用户可一键式分配和回收存储卷,无需关心存储底层细节。详见 Volume
存储类型 StorageClass,为管理员提供了描述存储 “Class(类)” 的方法,包含 Provisioner、 ReclaimPolicy 和 Parameters 。详见 StorageClass
流水线 Pipeline,简单来说就是一套运行在 Jenkins 上的 CI/CD 工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
企业空间 Workspace,是 KubeSphere 实现多租户模式的基础,是您管理项目、 DevOps 工程和企业成员的基本单位。
主机 Node,Kubernetes 集群中的计算能力由 Node 提供,Kubernetes 集群中的 Node 是所有 Pod 运行所在的工作主机,可以是物理机也可以是虚拟机。详见 Nodes
S2i Source to Image,通过代码构建新的容器镜像,表示从已有的代码仓库中获取代码,并通过 Source to Image 的方式构建镜像的方式来完成部署,每次构建镜像的过程将以任务 (Job) 的方式去完成。
B2i Binary to Image,通过上传制品的方式,自动构建镜像和完成部署,并将镜像推送至目标仓库,仅需要通过简单的设置即可将制品快速构建成服务。
蓝绿部署 提供了一种零宕机的部署方式,在保留旧版本的同时部署新版本,将两个版本同时在线,如果有问题可以快速处理
金丝雀发布 将一部分真实流量引入一个新版本进行测试,测试新版本的性能和表现,在保证系统整体稳定运行的前提下,尽早发现新版本在实际环境上的问题。
流量镜像 流量镜像功能通常用于在生产环境进行测试,是将生产流量镜像拷贝到测试集群或者新的版本中,在引导用户的真实流量之前对新版本进行测试,旨在有效地降低新版本上线的风险。

三、部署配置

Jenkins

1、在系统配置中配置Gitlab的地址

Jenkins1

2、配置流水线

Jenkins2

Gitlab webhook url需要配置到Gitlab项目中的webhooks中

点击高级会出现配置secret token

Jenkins3

选择流水线脚本

配置项目地址

Jenkins4

配置分支和脚本路径

Jenkins5

脚本示例

pipeline{
    agent any
    stages {
        stage('Compile'){
            steps{
                sh """
                    初始化项目.......
                """
            }
        }
        stage('Build'){
            steps{
                sh """
                    docker build -t 镜像地址 .
                """
            }
        }
        stage('Push'){
            steps{
                sh """
                    docker login ccr.ccs.tencentyun.com --username=******* --password=******
                    docker push 镜像地址
                """
            }
        }
        stage('Deploy'){
            steps{
                sh """
                    ssh -p root@内网/外网ip "kubectl rollout restart deploy 服务名称 -n=命名空间"
                """
            }
        }
    }
}

Gitlab

配置项目AccessToken

需要勾选api

Gitlab

Jenkins中配置凭证

image-20210327115245350

填写APIToken即可

image-20210327115353700

配置webhooks

填写流水线中复制的url和secret token,勾选push event即可

image-20210327115650742

KubeSphere

deployment文档

部署yaml文件

# 配置容器等信息
apiVersion: apps/v1
kind: Deployment
metadata:
  name: [项目名称]
  namespace: [命名空间]
spec:
	# 期望 pod 数量
  replicas: 1
  # 新创建的 pod 在运行指定秒数后才视为运行可用,配合就绪探针可以在滚动升级失败的时候阻止升级,避免部署出错的应用
  minReadySeconds: 10
  strategy:
    rollingUpdate:
    	# 滚动升级过程中最多允许超出期望副本数的数量,比如期望3,maxSurge 配置为1,则最多存在4个pod,也可以配置百分比
      maxSurge: 1
      # 滚动升级过程中最多允许存在不可用的 pod 数量,配置为0表示升级过程中所有的 pod 都必须可用,即 pod 挨个替换,也可以配置百分比
      maxUnavailable: 0
  # 匹配器,匹配 pod 的方式
  selector:
    matchLabels:
      app: [项目名称]
  template:
    metadata:
      name: [项目名称]
      labels:
        app: [项目名称]
    spec:
      imagePullSecrets:
        - name: [秘钥名称]
      containers:
        - name: [镜像名称]
          image: [镜像地址]:[镜像版本]
          # 就绪探针
          readinessProbe:
          # 执行周期,单位:秒
            periodSeconds: 1
            httpGet:
              path: /
              port: 80
---

# 配置网络信息
apiVersion: v1
kind: Service
metadata:
  name: [项目名称]
  namespace: [命名空间]
spec:
  # 类型,默认为 ClusterIP,还有 NodePort 和 LoadBalancer,生产环境建议使用 Loadbalancer
  type: LoadBalancer
  # 匹配器,用于匹配 pod
  selector:
    app: [项目名称]
  ports:
    - port: 80
      targetPort: 80
# 创建项目
kubectl run [项目名称] --image=[腾讯云镜像地址]:[镜像tag] --port=80 --generator=run/v1 --namespace=[命名空间]
# 配置私有镜像秘钥
kubectl create secret docker-registry [秘钥名称] --docker-server=[镜像服务商] --docker-username=[镜像账户] --docker-password=[镜像密码] -n=[命名空间]
# 创建资源
kubectl create -f yaml文件.yaml

注意项

1、如果Jenkins和k8s不是同一台服务器,需要配置ssh秘钥

2、web项目需要配置nginx进行内网转发,转发IP及端口可在服务页面获取

3、Jenkins默认端口不是80,可以配置为80(Jenkins在独立服务器)