Kubesphere流水线实现蓝绿发布

news2024/11/17 15:39:17

Kubesphere流水线实现蓝绿发布

1. Gitlab仓库准备

1.1 创建仓库

新建空白项目,名字随便取

greenweb

请添加图片描述

复制克隆地址

http://192.168.31.199/deploy/greenweb.git

请添加图片描述

1.2 初始化并上传代码

克隆并初始化代码仓库

mkdir git
cd git
git clone http://192.168.31.199/deploy/greenweb.git
cd greenweb/
git branch -M main

代码部分

  1. 2个主页,分别代表蓝色环境和绿色环境
root@ks-master:~/git/greenweb# cat blue/index.html
web-app1-blue  version 2.0.0
root@ks-master:~/git/greenweb# cat green/index.html
web-app1-green  version 1.0.0
  1. 打包脚本maketar.sh,用来将项目打包成tar
#!/bin/bash
cd $1
tar czf html.tar.gz *
mv html.tar.gz ../
cd ../
  1. Dockerfile用来制作镜像
FROM nginx
ADD html.tar.gz  /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT nginx -g "daemon off;"

这个项目下面一共就这5个文件

root@ks-master:~/git/greenweb# ls -l
total 16
-rw-r--r-- 1 root root  95 Apr 28 12:59 Dockerfile
-rw-r--r-- 1 root root  28 Apr 28 12:56 README.md
drwxr-xr-x 2 root root  24 Apr 28 12:56 blue
-rw-r--r-- 1 root root 866 Apr 28 12:56 deploy.yaml
drwxr-xr-x 2 root root  24 Apr 28 12:56 green
-rwxr-xr-x 1 root root  66 Apr 28 12:56 maketar.sh
  1. deploy.yaml 定义deployment和service资源
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: $PROJECT-$PROJECT_NAME-deployment
  namespace: sangomall
  labels:
    app: $PROJECT_NAME
    project: $PROJECT
spec:
  replicas: 1
  selector:
    matchLabels:
      app: $PROJECT_NAME
      project: $PROJECT
  template:
    metadata:
      labels:
        app: $PROJECT_NAME
        project: $PROJECT
    spec:
      containers:
      - name: $PROJECT_NAME
        image: $REGISTRY/$PROJECT/$PROJECT-$PROJECT_NAME:$PROJECT_VERSION
        ports:
        - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
  name: $PROJECT-$PROJECT_NAME-server
  namespace: sangomall
  labels:
    app: $PROJECT_NAME
    ver: $PROJECT_VERSION
spec:
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: $PROJECT_NAME
    project: $PROJECT
  1. Jenkinsfile 用来定义pipeline
pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('Git pull code') {
      agent none
      steps {
        git(url: 'http://192.168.31.199/deploy/bluegreen-web.git', branch: 'main', changelog: true, poll: false)
      }
    }

    stage('Image build and push') {
      agent none
      steps {
        container('maven') {
          withCredentials([usernamePassword(credentialsId : 'harbor' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
            sh 'bash maketar.sh $PROJECT_NAME'
            sh 'echo $HARBOR_PASSWORD |docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'
            sh 'docker build -t $REGISTRY/$PROJECT/$PROJECT-$PROJECT_NAME:$PROJECT_VERSION .'
            sh 'docker push $REGISTRY/$PROJECT/$PROJECT-$PROJECT_NAME:$PROJECT_VERSION'
          }

        }

      }
    }

    stage('Deploy Project') {
      agent none
      steps {
        container('maven') {
          withCredentials([kubeconfigContent(credentialsId : 'sangomall-kubeconfig' ,variable : 'KUBECONFIG_CONTENT' ,)]) {
            sh 'mkdir ~/.kube && echo "$KUBECONFIG_CONTENT" > ~/.kube/config && envsubst < deploy.yaml | kubectl apply -f -'
          }

        }

      }
    }

  }
  environment {
    REGISTRY = 'harbor.intra.com'
    PROJECT = 'greenweb'
  }
  parameters {
    string(name: 'PROJECT_NAME', defaultValue: 'green', description: '')
    string(name: 'PROJECT_VERSION', defaultValue: 'V1.0', description: '')
  }
}

1.3 代码上传至Git仓库

执行以下命令将代码传至仓库

git add .
git commit -m "v1.0"
## 192.168.31.199/deploy/greenweb.git是仓库地址 root是用户名,root12345是密码,密码尽量少用符号,否则要转义
git push http://root:root12345@192.168.31.199/deploy/greenweb.git

命令执行过程如下:

root@ks-master:~/git/greenweb# git add .
root@ks-master:~/git/greenweb# git commit -m "v1.0"
[main ad10264] v1.0
 Committer: root <root@ks-master.cluster.local>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following command and follow the instructions in your editor to edit
your configuration file:

    git config --global --edit

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 6 files changed, 58 insertions(+), 92 deletions(-)
 create mode 100644 Dockerfile
 rewrite README.md (99%)
 create mode 100644 blue/index.html
 create mode 100644 deploy.yaml
 create mode 100644 green/index.html
 create mode 100755 maketar.sh
root@ks-master:~/git/greenweb# git push http://root:root12345@192.168.31.199/deploy/greenweb.git
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (10/10), 1.07 KiB | 546.00 KiB/s, done.
Total 10 (delta 0), reused 0 (delta 0)
To http://192.168.31.199/deploy/greenweb.git
   0dadc53..ad10264  main -> main

2. 流水线发布

2.1 创建凭证

这里需要创建3个凭证,分别是:

  1. gitlab 用来连接gitlab代码仓库
  2. harbor 用来连接harbor镜像仓库
  3. kubeconfig 用来连接k8s-apiserver

Gitlab

请添加图片描述

Harbor

请添加图片描述

Kubeconfig

请添加图片描述

2.2 创建流水线

[流水线] [创建]

greenweb

请添加图片描述

依次点击后选择,[Git] 输入以下地址(即1.1生成),凭证选择gitlab

http://192.168.31.199/deploy/greenweb.git

请添加图片描述

[下一步]

请添加图片描述

[创建]

请添加图片描述

2.3 发布绿版

创建后等待流水线由灰色变黑,点击进入流水线

请添加图片描述

如果没有初始化流水线,就点击[初始化],由于截图时间比较长,它自动初始化完毕了.

[运行]

Jenkinsfile里默认写了green,就先发一版绿色的.
直接点击[确定],如果后续发版修改版本号和蓝色或绿色环境

请添加图片描述

此时可以看到sangomall空间下创建了deployment和svc

root@ks-master:~/git/greenweb# kubectl get  -n sangomall ep|grep green
greenweb-green-server   10.233.106.146:80                                                      52s
root@ks-master:~/git/greenweb# kubectl get  -n sangomall pod|grep green
greenweb-green-deployment-6964b576dc-6lk42   1/1     Running   0          60s
root@ks-master:~/git/greenweb# kubectl get  -n sangomall svc|grep green
greenweb-green-server   ClusterIP   10.233.48.252   <none>        80/TCP                                                                         63s

可以看到绿版已经发布成功,通过绿版的service可以访问到页面

# curl 10.233.48.252
web-app1-green  version 1.0.0

2.4 发布蓝版

这里将PROJECT_NAME 改为blue即可

请添加图片描述

点击[确定]

稍等片刻,篮版也发布成功

root@ks-master:~/git/greenweb# kubectl get  -n sangomall ep|grep green
greenweb-blue-server    10.233.106.148:80                                                      8s
greenweb-green-server   10.233.106.146:80                                                      4m24s
root@ks-master:~/git/greenweb# kubectl get  -n sangomall pod|grep green
greenweb-blue-deployment-6cf7cd896-6rf9h     1/1     Running   0          11s
greenweb-green-deployment-6964b576dc-6lk42   1/1     Running   0          4m27s
root@ks-master:~/git/greenweb# kubectl get  -n sangomall svc|grep green
greenweb-blue-server    ClusterIP   10.233.63.13    <none>        80/TCP                                                                         13s
greenweb-green-server   ClusterIP   10.233.48.252   <none>        80/TCP                                                                         4m29s

访问蓝版的service,也能返回蓝版的内容

# curl 10.233.63.13
web-app1-blue  version 2.0.0

2.5 容器内测试

创建一个busybox的容器,通过它去访问下看看

kubectl run busybox --image=harbor.intra.com/baseimages/centos-base:7.9.2009 --command -- sleep 3600

进入容器

kubectl exec -it busybox bash

尝试访问蓝色和绿色两个版本的service

[root@busybox /]# curl greenweb-blue-server.sangomall.svc.cluster.local
web-app1-blue  version 2.0.0
[root@busybox /]# curl greenweb-green-server.sangomall.svc.cluster.local
web-app1-green  version 1.0.0

现在的状态是蓝色和绿色两个版本同时存在,各自有各自的svc提供访问

3. 蓝绿选择

3.1 创建Svc

创建一个服务,用来选择蓝绿版本

[应用负载] [服务] [创建] [指定工作负载]

请添加图片描述

greenweb-service

[下一步]

请添加图片描述

这里的键就是deployment和pods里面定义的2个Label.

project是一样的都是greenweb
app:蓝色就是blue,绿色版本就是green

app=blue
project=greenweb

请添加图片描述

[下一步] [创建]

3.2 创建应用路由

使用apisix将应用暴露给k8s以外的环境访问,当然k8s也可以使用这个或者使用之前创建的svc进行访问

greenweb-route

请添加图片描述

[下一步] [添加路由规则]

请添加图片描述

请添加图片描述

kubernetes.io/ingress.class			apisix

请添加图片描述

3.3 配置域名解析

追加 greenweb A 192.168.31.211到dns解析中

[root@centos7-1 ~]# cat /var/named/intra.zone
$TTL 1d
@       IN      SOA     intra.com. admin.intra.com. (
                        0;
                        1H;
                        5M;
                        1W;
                        1D);
@ NS ns.intra.com.
ns A 192.168.31.17
harbor A 192.168.31.104
gitlab A 192.168.31.199
kibana A 192.168.31.212
rabbitmq A 192.168.31.211
web1 A 192.168.31.211
nacos-server A 192.168.31.211
zipkin-server A 192.168.31.211
sentinel A 192.168.31.211
skywalking-ui A 192.168.31.211
rocketmq-dashboard A 192.168.31.211
mall-gateway A 192.168.31.213
mall A 192.168.31.211
item A 192.168.31.211
seckill A 192.168.31.211
search A 192.168.31.211
auth A 192.168.31.211
cart A 192.168.31.211
order A 192.168.31.211
admin A 192.168.31.214
nginx A 192.168.31.211
greenweb A 192.168.31.211

重启named

systemctl restart named

确保greenweb.intra.com能解析

ping greenweb.intra.com -c 1

测试访问

# curl greenweb.intra.com
web-app1-blue  version 2.0.0

切换到绿色版本

请添加图片描述

将这里的blue换成green

请添加图片描述

此时再次访问,已经将流量切换到了绿色版本

# curl greenweb.intra.com
web-app1-green  version 1.0.0

当把版本再切回蓝色时,流量又回去了

请添加图片描述

容器内部访问时也是没问题的

请添加图片描述

至此蓝绿发布完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIMD 为什么收敛(tcp reno/cubic 为什么好)

TCP 拥塞控制目标是缓解并解除网络拥塞&#xff0c;让所有流量公平共享带宽&#xff0c;合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子&#xff0c;包括 RoCE&#xff0c;BBRv2) 为什么收敛&#xff1f;我一般会给出下面的老图&#xff1a;…

1区(TOP)极速送审,5月SCI/SSCI/EI刊源表已更新,

2023年5月SCI/SSCI/EI期刊目录更新 5月我处新增多本1-2区高分区新刊&#xff0c;包括计算机、医学、环境、化学、材料、生物、工程、社科领域&#xff0c;新刊版面极速送审~ 以下是本月重点期刊推荐&#xff0c;可作参考&#xff1a; 计算机类新刊&#xff1a; 1区计算机科…

钓鱼邮件演练项目实战

1、 使用 setoolkit 克隆站点 Setoolkit 是一个万能的社工工具(社会工程学工具集合) ┌──(root Cwillchris)-[~] └─# setoolkit 翻译成中文: 从菜单中选择: 1)社会工程攻击 2)渗透测试(快速通道) 3)第三方模块 4)更新社会工程师工具包 5)更新 SET 配置…

使用 spring 的 IoC 的实现账户的CRUD(2)双层实现+注解开发

在http://t.csdn.cn/yucl4的基础上进行注解开发 【分析】 xml文件其中spring容器中的bean,因此通过注解把这些放到容器中即可 component:相当xml中的bean的id: 如果不指定 value 属性&#xff0c;默认 bean 的 id 是当前类的类名, 首字母小写。 Controller Service Reposito…

计算机毕业论文选题推荐|软件工程|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)门窗账务管理系…

C++——类和对象(6)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月10日 内容&#xff1a;C类和对象内容讲解 目录 前言&#xff1a; 1.取地址操作符重载&#xff1a; 2.构造函数&#xff08;进阶&#xff09;&#xff1a; 1.初始化列表&#xff1a; 2.static成员&#xff1a; 结尾…

数据可视化工具 - ECharts饼形图的编写

1 饼形图 1年龄分布模块制作 1.1 官网找到类似实例&#xff0c; 适当分析&#xff0c;并且引入到HTML页面中 <!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件…

Android WebRTC+SRS/ZLM视频通话(4):Android使用WebRTC推流SRS/ZLMediaKit

Android WebRTCSRS/ZLM视频通话&#xff08;4&#xff09;&#xff1a;Android使用WebRTC推流SRS/ZLMediaKit 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来记录Android是如何使用WebRTC往SRS或ZLMediaKit进行推流。想要在Android设备上实现高质量的实时流媒体推送…

VirtualBox+Vagrant

1.下载VirtualBox 1.下载 VirtualBox官网下载 下载过程无特别注意事项&#xff0c;注意调整到非 C 盘位置即可&#xff0c;其他部分皆为默认设置 2.修改虚拟电脑存储位置 1.将C:\Users\用户名下的VirtualBox VMs文件夹复制到自定义目标文件夹中 2.打开VirtualBox,在全局设置…

嵌入式TCP/IP协议栈-LwIP

文章目录 LWIP是什么基础知识OSI七层模型TCP/IP五层模型LwIP的模型常见协议ARP协议ICMP协议DHCP协议DNS协议 LwIP APISocket大端模式与小端模式地址字节序IP地址转换 网络并发 LWIP是什么 LWIP是一个轻量级的TCP/IP协议栈&#xff0c;其全称为Lightweight IP&#xff0c;它专门…

UNIX网络编程卷一 学习笔记 第十二章 IPv4与IPv6的互操作性

未来数年内&#xff0c;因特网也许会逐渐从IPv4过渡到IPv6&#xff0c;在过渡阶段&#xff0c;基于IPv4的现有应用能与基于IPv6的全新应用协同工作非常重要。例如&#xff0c;厂商不应只提供仅能与IPv6 telnet服务器程序协同工作的telnet客户程序&#xff0c;而应该提供既能与I…

环境搭建:Visual Studio的安装和创建C++项目

Visual Studio的安装和创建C项目 引言前言下载Visual Studio安装包安装Visual Studio创建项目小结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&#xff0c;让世界没有难学的技术。 &#x1f449; &#x1f396;️ C…

第五十章 Unity Input Manager 输入系统(上)

Unity的输入系统支持多种输入设备&#xff0c;比如键盘和鼠标&#xff0c;游戏手柄&#xff0c;触摸屏&#xff0c;VR和AR控制器等等。Unity 通过两个独立的系统提供输入支持&#xff1a;第一&#xff0c;输入管理器 (Input Manager) 是 Unity 核心平台的一部分&#xff0c;默认…

数据可视化一、ECharts

零、文章目录 数据可视化一、ECharts 1、数据可视化 &#xff08;1&#xff09;数据可视化 数据可视化主要目的&#xff1a;借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。数据可视化可以把数据从冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。…

TGANet:用于改进息肉分割的文本引导注意力

文章目录 TGANet: Text-Guided Attention for Improved Polyp Segmentation摘要本文方法编码器模块Feature Enhancement ModuleLabel AttentiondecoderMulti-scale Feature Aggregation损失函数 实验结果 TGANet: Text-Guided Attention for Improved Polyp Segmentation 摘要…

2023年湖北建设厅特种工报名需要什么条件?报名流程是什么?

2023年湖北建设厅特种工报名需要什么条件&#xff1f;报名流程是什么&#xff1f; 建设厅特种工现在已经开始报名考试安排计划了&#xff0c;想要报考建设厅特种工的现在可以了解一下具体的流程以及相关信息哟。为自己报名考试做准备&#xff0c;下面启程别就来给您介绍一下建设…

从入门到精通:接口自动化测试中加密、解密和Sign签名的完整指南

【专业解读】接口自动化测试安全机制剖析&#xff1a;加密、解密和sign签名技术原理与应用&#xff01; 目录 摘要&#xff1a; 1. 加密 2. 解密 3. Sign签名 4. 示例 摘要&#xff1a; 在进行接口自动化测试时&#xff0c;加密、解密和sign签名是非常重要的步骤。这些过…

基于单片机的数字频率计设计

数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号&#xff0c;方波信号及其他各种单位时间内变化的物理量。在进行模拟、数字电路的设计、安装、调试…

基于AT89C52单片机的温度检测设计与仿真

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87770153 源码获取 主要内容: 本设计是基于52系列的单片机进行的设计,可以完成温度的测控,可以实现实际温度与设定温度区域的比较,并在LED上相应的显示结果。设计过程在硬…

算法 DAY57 动态规划13 647. 回文子串 516.最长回文子序列

647. 回文子串 暴力解法&#xff1a;两层for循环&#xff0c;再加一个判断是否是回文子串&#xff0c;时间复杂度O(n3) 五部曲 1、 判断一个子字符串&#xff08;字符串的下表范围[i,j]&#xff09;是否回文&#xff0c;依赖于&#xff0c;子字符串&#xff08;下表范围[i 1,…