Kubesphere流水线实现蓝绿发布

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

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

请添加图片描述

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

请添加图片描述

至此蓝绿发布完成

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式烧录刷写文件】-2.3-删除/修改Intel Hex文件中指定地址范围内的数据

案例背景&#xff08;共6页精讲&#xff09;&#xff1a; 有如下一段HEX文件&#xff0c;如何“自动”地完成地址范围0x9110-0x9113数据的删除或修改。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775F :2091200078797A7B7C7D7E7F808182838485…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT&#xff1f; 与其他语言生成模型相比&#xff0c;Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大&#xff0c;它可以应用于各种文本生成场景&#xff0c;包括但不限于以下几个方面 Auto GPT的历史 马斯克说&#xff1a;“ChatGPT 好得吓…

记csdn打不开或打开缓慢后的修复--如何查找dns并修改hosts文件

记csdn打开缓慢后的修复–如何查找dns并修改hosts文件 问题&#xff1a; CSDN文章打开的十分缓慢&#xff0c;经常出现无法打开页面的错误提示 &#xff08;以前用的好好的&#xff0c;现在不知道公司局域网改了什么东西&#xff0c;导致我的电脑打开CSDN经常缓慢好久&#x…

Lesson14 高级IO

前言 IO 等待 数据拷贝,比如read/recv,write/send只要在单位事件里,让等的比重减低,IO的效率就越高 五种IO模型 钓鱼小案例 阻塞式 阻塞式: 张三拿着一根鱼竿,一直在岸边钓鱼,期间一直盯着鱼竿,等待鱼上钩 非阻塞式轮询式 非阻塞式轮询式: 李四拿着一根鱼竿,在岸边钓鱼,期…

Linux共享库、动态库详解

目录 一.静态库 二.动态库 三.静态库的制作与使用 四.动态库的制作与使用 在日常编程中我们不想让别人看到我们写的源码&#xff0c;但还需要发给对方使用&#xff0c;在这种情况下我们引入了静态库动态库&#xff0c;让对方用调库的方式也可以实现我们写的代码的功能&…

Android电源管理介绍

一、电源管理基础知识 1.1电源管理的几种状态 Android kernel源码中&#xff0c;定义了三种电源状态&#xff0c;在kernel/power/suspend.c中&#xff1a; 对应的宏定义/include/linux/suspend.h 1.2 电源管理状态的介绍&#xff1a; PM_SUSPEND_ON 设备处于正常工作状态 …

vue2 框架运行原理剖析系列(一)之 new Vue()实例化过程到底做了什么!!!

一、vue 基础用法 1.1 引入vue 1.2 使用vue语法编写ui 1.3 实现数据绑定 示例代码如下 <div id"app">{{ message }} </div> <script> var app new Vue({el: #app,data: {message: Hello Vue!} }) </script>1.4 代码效果&#xff1a;使用浏…

Nessus 10.5 Auto Install for macOS Ventura(自动化安装 Nessus 试用版)

发布 Nessus 试用版自动化安装程序&#xff0c;支持 macOS Ventura、RHEL 9 和 Ubuntu 22.04 请访问原文链接&#xff1a;https://sysin.org/blog/nessus-auto-install-for-macos/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.o…

js实现产品页点击小图在大图区显示

企业网站产品图片可能会比较多&#xff0c;需要在产品页面多放几张展示图片&#xff0c;我们可以使用一张大图几张小图的形式排列&#xff0c;并使用js代码实现点击小图显示大图。效果如下所示 html代码部分&#xff1a; <div class"img_bd"> <img src"…

linux0.12-8-7-signal.c

[334页] (-:这一小节很难理解。但我基本都理解了&#xff0c;哈哈。 1、为什么signal不可靠&#xff0c;而sigaction可靠&#xff1b; 2、 为什么系统调用会被打断&#xff1f; 3、 sys_signal&#xff0c;sys_sigaction&#xff0c;函数作用&#xff1f; 4、 do_signal&#x…

IDEA中java文件出现黄色的J文件同时maven项目导入了依赖但是idea依赖加不进去的问题记录

IDEA导入项目后依赖jar包没有显示 报错提示尝试的解决方法检查对应的sdkmodule等配置信息开始尝试是不是版本问题&#xff0c;因为对上述maven报错进行查询&#xff0c;好像是因为版本太高导致的&#xff0c;开始下一个低版本进行尝试切换版本即可解决 总结后续出现的BUG 此次环…

【C++的类与对象(下)】

目录 一、细说构造函数1.1初始化列表的引入1.2初始化列表1.2关键字explicit 二、static成员2.1static成员的特性2.2题目&#xff1a;实现一个类&#xff0c;计算程序中创建出了多少个类对象2.3题目&#xff1a;设计一个类 只能再栈上或者堆上创建 一、细说构造函数 1.1初始化列…

buuctf8

目录 crypto 摩丝 password 变异凯撒 Quoted-printable Rabbit web [护网杯 2018]easy_tornado [HCTF 2018]admin misc 被劫持的神秘礼物​编辑 crypto 摩丝 下载文件&#xff0c;得到一串摩斯密码 在线解码 password 下载文件 张三英文zs&#xff0c;加上生日&a…

【语义分割】标注工具ISAT with segment anything介绍

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 极速分割标注工具 1. 正文 1.1 安装 创建虚拟环境 conda create -n ISAT_with_segment_anything python3.8 conda activate ISAT_with_segment_anyt…

前端011_标签模块_列表功能

标签模块_列表功能 1、需求分析2、Mock添加数据列表模拟接口3、Api调用接口4、列表模版5、分页查询实现1、需求分析 标签模块主要文章标签进行管理,类别和标签的关系是一对多,一个类别下面存在多个标签。 首先开发模块中的列表功能,包含数据列表、分页。 2、Mock添加数据…

记录--前端实现点击选词功能

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 今天有一个需求&#xff0c;点击选中某个英文单词&#xff0c;然后对这个单词做一些处理&#xff0c;例如高亮背景、查看一些详细信息等等&#xff0c;今天简单实现了一下&#xff0c;效果如下&#x…

性能测试的核心原理

性能测试的核心原理 1 基于协议&#xff0c;前后端交互机制&#xff0c;性能核心。基于界面决定和前端用户交互&#xff0c;基于代码决定了后端。 1 网络分布式架构。 2 单机应用&#xff0c;比如安安兔&#xff0c;鲁大师。主要判断io读写&#xff0c;以及对资源的消耗。 2 多…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法&#xff1a;使用chroot定制系统&#xff0c;但有时候我们想自定义的安装包不在上游的仓库源中&#xff0c;在我们本地应该怎么办呢&#xff1f;如果我们将deb包拷贝到iso目录再安装有点过于麻烦了&#xff0c;而且还可能需要手动处理…

GPT-4的免费使用方法分享

目录 方法1&#xff1a;使用Ora.sh的LLM应用 方法2&#xff1a;使用https://steamship.com 方法3&#xff1a;使用https://nat.dev 方法4&#xff1a;http://tdchat.vip 方法5&#xff1a;使用Poe网站或App 方法6&#xff1a;使用 Opencat App 方法7:使用https://Huggin…

基于git的开发规范总结

文章目录 各分支命名规范gitee基本开发流程及定义gitflow工作流gitflow工作流常用分支主要工作流程命名规则gitflow工作流程图 Git分支开发管理策略主分支Master开发分支DevelopGit创建Develop分支的命令&#xff1a;将Develop分支发布到Master分支的命令&#xff1a; 临时性分…