Primeros pasos con KubeSphere para Crash-v02

KubeSphere es una plataforma de contenedores distribuida de nivel empresarial centrada en aplicaciones construida sobre Kubernetes , que proporciona una interfaz de operación simple y fácil de usar y métodos de operación basados ​​en asistentes, lo que no solo reduce los costos de aprendizaje de los usuarios para usar la plataforma de programación de contenedores, sino que también reduce los costos de aprendizaje de los usuarios para usar la plataforma de programación de contenedores. pero también facilita enormemente el desarrollo. La complejidad del trabajo diario de prueba, operación y mantenimiento está diseñada para resolver los puntos débiles del almacenamiento, la red, la seguridad y la facilidad de uso del propio Kubernetes. Además, la plataforma ha integrado y optimizado múltiples módulos funcionales adecuados para escenarios de contenedores, proporcionando soluciones completas para ayudar a las empresas a afrontar fácilmente el desarrollo ágil y la operación y mantenimiento automatizados, DevOps, gobernanza de microservicios, lanzamiento en escala de grises y gestión de múltiples inquilinos, carga de trabajo. y gestión de clústeres, monitoreo y alarmas, consulta y recopilación de registros, servicios y redes, tienda de aplicaciones, construcción de imágenes y gestión de almacenes de imágenes y gestión de almacenamiento y otros escenarios comerciales. Las versiones posteriores también proporcionarán y admitirán escenarios empresariales más complejos, como gestión de múltiples clústeres, big data e inteligencia artificial .

KubeSphere ha adoptado un enfoque de código abierto desde la etapa inicial del proyecto para llevar a cabo un desarrollo saludable del proyecto. El código fuente y los documentos relevantes del proyecto son visibles en GitHub . KubeSphere admite la implementación y operación en cualquier infraestructura, incluida la nube pública, la nube privada, VM, BM y Kubernetes , y admite la instalación en línea y fuera de línea . Actualmente está disponible en Alibaba Cloud, Tencent Cloud, Huawei Cloud, Qingyun, AWS y Kubernetes. Las pruebas de implementación se ha realizado el .
imagen.png

1. Diagrama de usuario del sistema

imagen.png

2. Implementación de middleware

Información que necesita atención en la implementación de aplicaciones [Tres elementos de la implementación de aplicaciones]
1. Método de implementación de aplicaciones
2. Montaje de datos de aplicaciones (datos, archivos de configuración)
3. Accesibilidad de las aplicaciones
imagen.png

1. Implementar MySQL

1. Inicie el contenedor mysql

docker run -p 3306:3306 --name mysql-01 \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=ecJVNdEjcFuZY48E \
--restart=always \
-d mysql:5.7 

2. ejemplo de configuración de mysql

[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
 
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
lower_case_table_names=1
skip-name-resolve

Tercero, análisis de implementación de MySQL

imagen.png

4. Método de implementación original

4.0 Crear archivo de configuración mysql
imagen.png
imagen.png

4.1 Servicio-Creación-Servidor con estado

imagen.png

4.2 Crear un servidor con estado llamado his-mysql-01

imagen.png

4.3 Agregar espejo

imagen.png

4.4 Agregue el espejo mysql:5.7 y use el puerto predeterminado.

imagen.png

4.5. Agregue variables de entorno, sincronice la zona horaria del host, seleccione la casilla de verificación y el siguiente paso

imagen.png

4.6 Agregar plantilla de declaración de volumen persistente

imagen.png

4.7 Agregar diccionario de configuración

imagen.png

4.8. Se agregan almacenamiento y configuración: haga clic en Siguiente

imagen.png

4.9 Haga clic en el botón Crear

imagen.png

5.0 Crear acceso externo NodePort

imagen.png

crear nombre
imagen.png

Especificar carga de trabajo
imagen.png

Agregar puerto
imagen.png

Seleccionar puerto de nodo
imagen.png

6.0. Probar conexión a mysql

Ver el DNS del servicio his-mysql-01
imagen.png
imagen.png

1. Dentro del clúster, acceda directamente a
mysql -uroot -hhis-mysql-01.his -p a través del [nombre del servicio. nombre del proyecto] de la aplicación.

[root@k8s-master01 nfs_dir]# kubectl -n his exec -it his-mysql-01-v1-0 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@his-mysql-v1-0:/# mysql -uroot -hhis-mysql-01.his -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

2. Fuera del grupo,
imagen.png

6.1. Error al iniciar sesión en MySQL


[root@k8s-master01 ~]# kubectl -n his get po
NAME                READY   STATUS    RESTARTS        AGE
his-mysql-01-v1-0   1/1     Running   1 (8m58s ago)   9m29s
[root@k8s-master01 ~]# 
#登入pod
[root@k8s-master01 ~]# kubectl -n his exec -it his-mysql-01-v1-0 bash

root@his-mysql-01-v1-0:/# mysql -u root -p

mysql> use mysql;

--修改root秘密
mysql> update user set authentication_string=passworD("ecJVNdEjcFuZY48E") where user='root';


--查看用户登入权限
mysql> SELECT HOST,USER from user;

--修改登入授权
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'ecJVNdEjcFuZY48E' WITH GRANT OPTION;

mysql> FLUSH PRIVILEGES;

mysql> exit

root@his-mysql-01-v1-0:/# exit


#登入pod
[root@k8s-master01 ~]# kubectl -n his exec -it his-mysql-01-v1-0 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@his-mysql-01-v1-0:/# 

#内部pod登入测试
root@his-mysql-01-v1-0:/# mysql -uroot -hhis-mysql-01.his -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


2. Implementar Redis

1. Inicie el contenedor redis

#创建配置文件
## 1、准备redis配置文件内容
mkdir -p /mydata/redis/conf && vim /mydata/redis/conf/redis.conf


##配置示例
appendonly yes
port 6379
bind 0.0.0.0


#docker启动redis
docker run -d -p 6379:6379 --restart=always \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-v  /mydata/redis-01/data:/data \
 --name redis-01 redis:6.2.5 \
 redis-server /etc/redis/redis.conf

Segundo, análisis de implementación de Redis.

imagen.png

Agregar comando de inicio de creación a la interfaz
imagen.png

imagen.png

3. Implementar ElasticSearch

1. Inicie el contenedor es

# 创建数据目录
mkdir -p /mydata/es-01 && chmod 777 -R /mydata/es-01

# 容器启动
docker run --restart=always -d -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v es-config:/usr/share/elasticsearch/config \
-v /mydata/es-01/data:/usr/share/elasticsearch/data \
--name es-01 \
elasticsearch:7.13.4

2. análisis de implementación de es

imagen.png

Nota: Después del montaje de la subruta y la modificación de la configuración, k8s no actualizará en caliente los archivos de configuración relevantes en su Pod y deberá reiniciar el Pod usted mismo.

[root@075a91de5863 config]# cat elasticsearch.yml

cluster.name: "docker-cluster"
network.host: 0.0.0.0

[root@075a91de5863 config]# cat jvm.opciones

################################################################
##
## JVM configuration
##
################################################################
##
## WARNING: DO NOT EDIT THIS FILE. If you want to override the
## JVM options in this file, or set any additional options, you
## should create one or more files in the jvm.options.d
## directory containing your adjustments.
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html
## for more information.
##
################################################################



################################################################
## IMPORTANT: JVM heap size
################################################################
##
## The heap size is automatically configured by Elasticsearch
## based on the available memory in your system and the roles
## each node is configured to fulfill. If specifying heap is
## required, it should be done through a file in jvm.options.d,
## and the min and max should be set to the same value. For
## example, to set the heap to 4 GB, create a new file in the
## jvm.options.d directory containing these lines:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################


################################################################
## Expert settings
################################################################
##
## All settings below here are considered expert settings. Do
## not adjust them unless you understand what you are doing. Do
## not edit them in this file; instead, create a new file in the
## jvm.options.d directory containing your adjustments.
##
################################################################

## GC configuration
8-13:-XX:+UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly

## G1GC Configuration
# NOTE: G1 GC is only supported on JDK version 10 or later
# to use G1GC, uncomment the next two lines and update the version on the
# following three lines to your version of the JDK
# 10-13:-XX:-UseConcMarkSweepGC
# 10-13:-XX:-UseCMSInitiatingOccupancyOnly
14-:-XX:+UseG1GC

## JVM temporary directory
-Djava.io.tmpdir=${ES_TMPDIR}

## heap dumps

# generate a heap dump when an allocation from the Java heap fails; heap dumps
# are created in the working directory of the JVM unless an alternative path is
# specified
-XX:+HeapDumpOnOutOfMemoryError

# specify an alternative path for heap dumps; ensure the directory exists and
# has sufficient space
-XX:HeapDumpPath=data

# specify an alternative path for JVM fatal error logs
-XX:ErrorFile=logs/hs_err_pid%p.log

## JDK 8 GC logging
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m

# JDK 9+ GC logging
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m

3. Agregar variables de entorno

imagen.png

4. Agregue subarchivos individuales de la subruta (jvm.options y elasticsearch.yml)

/usr/share/elasticsearch/config/elasticsearch.yml
imagen.png

imagen.png

/usr/share/elasticsearch/config/jvm.options
imagen.png

imagen.png

4. Tienda de aplicaciones

Puedes usar dev-zhao para iniciar sesión e implementar desde la tienda de aplicaciones.

5. Almacén de aplicaciones

Utilice el administrador de espacio empresarial (wuhan-boss) para iniciar sesión y configurar el almacén de aplicaciones,
simplemente aprenda Helm y agregue una dirección de almacén en el mercado de aplicaciones de Helm, como: bitnami

charts.bitnami.com/bitnami

imagen.png

imagen.png

3. Introducción a DevOps

1.Configuración de Maven para Alibaba Cloud

imagen.png
Diccionario de configuración-ks-devops-agent-edit configuración-MavenSetting (agregado recientemente a continuación)

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

2. Crea un proyecto DevOps

2.1 Gestión de plataforma-Control de acceso-Espacio empresarial-shenzhen-Proyecto DevOps-Creación

imagen.png

2.2 Crear canalización-Siguiente paso-Crear

imagen.png

2.3 Editar canalización-seleccionar plantilla (elijo CI/CD)-siguiente paso-crear-confirmar

imagen.png

2.4 Construcción preliminar del oleoducto

imagen.png

4. Canal de edición de DevOps

Cree una tubería usando el panel de edición de gráficos

1.Introducción a podTemplate

KubeSphere tiene 4 tipos de podTemplate integrados: base, nodejs, maven y go, y proporciona un entorno Docker aislado en el Pod.

base

nombre Tipo/versión
Agente Jenkins Tags base
Nombre del contenedor base
Sistema operativo centos-7
Estibador 18.06.0
Timón 2.11.0
Kubectl versión estable
Herramientas integradas descomprimir, que, hacer, wget, zip, bzip2, git

nodejs

nombre Tipo/versión
Agente Jenkins Tags nodejs
Nombre del contenedor nodejs
Sistema operativo centos-7
Nodo 9.11.2
Hilo 1.3.2
Estibador 18.06.0
Timón 2.11.0
Kubectl versión estable
Herramientas integradas descomprimir, que, hacer, wget, zip, bzip2, git

experto

nombre Tipo/versión
Agente Jenkins Tags experto
Nombre del contenedor experto
Sistema operativo centos-7
jdk openjdk-1.8.0
experto 3.5.3
Estibador 18.06.0
Timón 2.11.0
Kubectl versión estable
Herramientas integradas descomprimir, que, hacer, wget, zip, bzip2, git

ir

nombre Tipo/versión
Agente Jenkins Tags ir
Nombre del contenedor ir
Sistema operativo centos-7
Ir 1.11
GOPATH /home/jenkins/ir
GORO /usr/local/ir
Estibador 18.06.0
Timón 2.11.0
Kubectl versión estable
Herramientas integradas descomprimir, que, hacer, wget, zip, bzip2, git

2. Extrae el código

Editar canalización-agregar paso-especificar contenedor-maven
agregar paso anidado-git-crear credenciales
agregar paso anidado-shell-ls-confirmar-ejecutar prueba
imagen.png

3. Compilación del proyecto

添加步骤-指定容器-maven
添加嵌套步骤-shell
mvn clean package -Dmaven.test.skip=true

4.项目打包


#docker build -t 镜像名称 -f   指定的Dockerfile文件    工作目录
docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage

5.推送镜像

编辑流水线-添加嵌套步骤-添加凭证-创建凭证
imagen.png

创建变量
imagen.png

Jenkinsfile

pipeline {
    
    
  agent {
    
    
    node {
    
    
      label 'maven'
    }

  }
  stages {
    
    
    stage('拉取镜像') {
    
    
      agent none
      steps {
    
    
        container('maven') {
    
    
          git(credentialsId: 'gitee-id', url: 'https://gitee.com/rw001/yygh-parent.git', branch: 'master', changelog: true, poll: false)
        }

      }
    }

    stage('项目编译') {
    
    
      agent none
      steps {
    
    
        container('maven') {
    
    
          sh 'mvn clean package -Dmaven.test.skip=true'
          sh 'ls'
        }

      }
    }

    stage('default-2') {
    
    
      parallel {
    
    
        stage('构建hospital-manage镜像,构建server-gateway镜像') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              sh 'docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage'
              sh 'docker build -t server-gateway:latest -f server-gateway/Dockerfile ./server-gateway'
            }

          }
        }

        stage('构建service-cmn镜像,构建service-hosp镜像') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              sh 'docker build -t service-cmn:latest -f service/service-cmn/Dockerfile ./service/service-cmn'
              sh 'docker build -t service-hosp:latest -f service/service-hosp/Dockerfile ./service/service-hosp'
            }

          }
        }

        stage('构建service-order镜像和构建service-oss镜像') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              sh 'docker build -t service-order:latest -f service/service-order/Dockerfile ./service/service-order'
              sh 'docker build -t service-oss:latest -f service/service-oss/Dockerfile ./service/service-oss'
            }

          }
        }

        stage('构建service-sms镜像和构建service-task镜像') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              sh 'docker build -t service-sms:latest -f service/service-sms/Dockerfile ./service/service-sms'
              sh 'docker build -t service-task:latest -f service/service-task/Dockerfile ./service/service-task'
            }

          }
        }

        stage('构建service-statistics和构建service-user镜像') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              sh 'docker build -t service-statistics:latest -f service/service-statistics/Dockerfile ./service/service-statistics'
              sh 'docker build -t service-user:latest -f service/service-user/Dockerfile ./service/service-user'
            }

          }
        }

      }
    }

    stage('default-3') {
    
    
      parallel {
    
    
        stage('推送镜像01') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWD_VAR' ,usernameVariable : 'HARBOR_NAME_VAR' ,)]) {
    
    
                sh 'docker tag  hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  server-gateway:latest $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-cmn:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-hosp:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER '
                sh 'echo "$HARBOR_PASSWD_VAR" | docker login $REGISTRY -u "$HARBOR_NAME_VAR" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER '
              }

            }

          }
        }

        stage('推送镜像02') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWD_VAR' ,usernameVariable : 'HARBOR_NAME_VAR' ,)]) {
    
    
                sh 'docker tag  service-order:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-oss:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-sms:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER '
                sh 'echo "$HARBOR_PASSWD_VAR" | docker login $REGISTRY -u "$HARBOR_NAME_VAR" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER '
              }

            }

          }
        }

        stage('推送镜像03') {
    
    
          agent none
          steps {
    
    
            container('maven') {
    
    
              withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWD_VAR' ,usernameVariable : 'HARBOR_NAME_VAR' ,)]) {
    
    
                sh 'docker tag  service-statistics:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-task:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-user:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER '
                sh 'echo "$HARBOR_PASSWD_VAR" | docker login $REGISTRY -u "$HARBOR_NAME_VAR" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER '
              }

            }

          }
        }

      }
    }

    stage('测试安装k8s') {
    
    
      agent none
      steps {
    
    
        container('maven') {
    
    
          withCredentials([
                                                              kubeconfigFile(
                                                                    credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                                                                    variable: 'KUBECONFIG')
                                                                    ]) {
    
    
                sh 'envsubst < rw.yaml | kubectl apply -f -'
              }

            }

          }
        }

      }
      environment {
    
    
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = '192.168.1.220:30012'
        DOCKERHUB_NAMESPACE = 'yygh-parent'
        ALIYUNHUB_NAMESPACE = 'yygh-parent'
        GITHUB_ACCOUNT = 'kubesphere'
        APP_NAME = 'devops-java-sample'
      }
      parameters {
    
    
        string(name: 'TAG_NAME', defaultValue: '', description: '')
      }
    }

五、SonarQube 安装

1.执行以下命令安装 SonarQube 服务


#helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n kubesphere-devops-system  --create-namespace --set service.type=NodePort

helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n kubesphere-devops-system --create-namespace --set image.tag=7.9.2-community --set service.type=NodePort 




#卸载
helm uninstall  sonarqube sonarqube -n kubesphere-devops-system

2.检查SonarQube 服务

kubectl  -n kubesphere-devops-system get po |grep sonarqube

3.获取 SonarQube 控制台地址

  1. 执行以下命令以获取 SonarQube NodePort。
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services sonarqube-sonarqube)

export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")

echo http://$NODE_IP:$NODE_PORT

2.您可以获得如下输出(本示例中端口号为 31859,可能与您的端口号不同):

http://192.168.1.220:31741

  • 在浏览器中访问 SonarQube 控制台 http://:。
  • 点击右上角的 Log in,然后使用默认帐户 admin/admin 登录。

备注
取决于您的实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行该端口,以便访问 SonarQube

4.配置 SonarQube 服务器

步骤 1:创建 SonarQube 管理员令牌 (Token)

  1. 点击右上角字母 A,然后从菜单中选择 My Account 以转到 Profile 页面。

sonarqube-config-1.png

  1. 点击 Security 并输入令牌名称,例如 kubesphere。
    sonarqube-config-2.png

3.点击 Generate 并复制此令牌
5fafd3af59a2092e1b8ae780e0ee4b4c95206ab4

imagen.png

步骤 2:创建 Webhook 服务器

  1. 执行以下命令获取 SonarQube Webhook 的地址。
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)

export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")

echo http://$NODE_IP:$NODE_PORT/sonarqube-webhook/

  1. 预期输出结果:
http://192.168.1.220:30180/sonarqube-webhook/
  1. 依次点击 AdministrationConfigurationWebhooks 创建一个 Webhook。
    imagen.png

4.点击 Create
imagen.png

  1. 在弹出的对话框中输入 NameJenkins Console URL(即 SonarQube Webhook 地址)。点击 Create 完成操作。
    imagen.png

步骤 4:将 SonarQube 配置添加到 ks-installer

  1. 执行以下命令编辑 ks-installer。
kubectl edit cc -n kubesphere-system ks-installer
  • 搜寻至 devops。添加字段 sonarqube 并在其下方指定 externalSonarUrl 和 externalSonarToken。
devops:
  enabled: true
  jenkinsJavaOpts_MaxRAM: 2g
  jenkinsJavaOpts_Xms: 512m
  jenkinsJavaOpts_Xmx: 512m
  jenkinsMemoryLim: 2Gi
  jenkinsMemoryReq: 1500Mi
  jenkinsVolumeSize: 8Gi
  sonarqube: # Add this field manually.
    externalSonarUrl: http://192.168.1.220:31880 # The SonarQube IP address.
    externalSonarToken: c08f7235dc1413fc2e3d7922ce5031750843a403 # The SonarQube admin token created above.
  • 完成操作后保存此文件。

步骤 5:将 SonarQube 服务器添加至 Jenkins

  1. 执行以下命令获取 Jenkins 的地址。
export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
  1. 您可以获得以下输出,获取 Jenkins 的端口号。
http://192.168.1.220:30180
  1. 请使用地址 http://:30180 访问 Jenkins。安装 KubeSphere 时,默认情况下也会安装 Jenkins 仪表板。此外,Jenkins 还配置有 KubeSphere LDAP,这意味着您可以直接使用 KubeSphere 帐户(例如 admin/P@88w0rd)登录 Jenkins。有关配置 Jenkins 的更多信息,请参见 Jenkins 系统设置。备注取决于您的实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行端口 30180,以便访问 Jenkins。
  2. 点击左侧导航栏中的系统管理
  3. 向下翻页找到并点击系统配置
  4. 搜寻到 SonarQube servers,然后点击 Add SonarQube
  5. 输入 NameServer URL (http://:)。点击添加,选择 Jenkins,然后在弹出的对话框中用 SonarQube 管理员令牌创建凭证(如下方第二张截图所示)。创建凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。点击应用完成操作。

sonarqube-jenkins-settings.png

agregar-credenciales.png

步骤 6:将 sonarqubeURL 添加到 KubeSphere 控制台

您需要指定 sonarqubeURL,以便可以直接从 KubeSphere 控制台访问 SonarQube。

  1. 执行以下命令:
kubectl edit  cm -n kubesphere-system  ks-console-config
  1. 搜寻到 data.client.enableKubeConfig,在下方添加 devops 字段并指定 sonarqubeURL。
client:
  enableKubeConfig: true
  devops: # 手动添加该字段。
    sonarqubeURL: http://192.168.1.220:31880 # SonarQube IP 地址。
  1. 保存该文件。

步骤 7:重启服务

执行以下命令。

kubectl -n kubesphere-devops-system rollout restart deploy devops-apiserver
kubectl -n kubesphere-system rollout restart deploy ks-console

5.为新项目创建 SonarQube Token

您需要一个 SonarQube 令牌,以便您的流水线可以在运行时与 SonarQube 通信。

  1. 在 SonarQube 控制台上,点击 Add a project

imagen.png

单击Manually
imagen.png

2.输入项目密钥,例如 java-demo,然后点击 Set Up
jenkins-projet-key.png

3.输入项目名称,例如 java-sample,然后点击 Generate
generar-un-token.jpg

  1. 创建令牌后,点击 Continue
    token-creado.png

5.分别选择 JavaMaven。复制下图所示绿色框中的序列号,如果要在流水线中使用,则需要在凭证中添加此序列号。
sonarqube-ejemplo.png

mvn sonar:sonar \
  -Dsonar.projectKey=java-demo \
  -Dsonar.host.url=http://192.168.1.220:31741 \
  -Dsonar.login=72c013fa48a3c6237a5af67cedc5f7aa73a8f462

6.流水线添加sonar参考官网

https://www.kubesphere.io/zh/docs/v3.3/devops-user-guide/how-to-use/pipelines/create-a-pipeline-using-graphical-editing-panel/

7.设置电子邮件服务器

  1. 点击左上角的平台管理,然后选择集群管理
  2. 如果您已经启用多集群功能并已导入成员集群,那么您可以选择一个特定集群以查看其节点。如果尚未启用该功能,请直接参考下一步。
  3. 转到应用负载下的工作负载,然后从下拉列表中选择 kubesphere-devops-system 项目。点击 devops-jenkins 右侧的 imagen.png 并选择编辑 YAML 以编辑其 YAML 配置文件。
  4. 向下滚动到下图所示的需要指定的字段。完成修改后,点击确定以保存。
            - name: kubernetes.request.timeout
              value: '60000'
            - name: EMAIL_SMTP_HOST
              value: smtp.qq.com
            - name: EMAIL_SMTP_PORT
              value: '465'
            - name: EMAIL_USE_SSL
              value: 'true'
            - name: EMAIL_FROM_NAME
              value: KubeSphere
            - name: EMAIL_FROM_ADDR
              value: [email protected]
            - name: EMAIL_FROM_PASS
              value: xxxhvbtqgnhjbdfh
环境变量名称 描述信息
EMAIL_SMTP_HOST SMTP 服务器地址
EMAIL_SMTP_PORT SMTP 服务器端口(如:25)
EMAIL_FROM_ADDR 电子邮件发件人地址
EMAIL_FROM_NAME 电子邮件发件人姓名
EMAIL_FROM_PASS 电子邮件发件人密码
EMAIL_USE_SSL 是否启用 SSL 配置

8. Jenkinsfile

8.1 创建凭证

imagen.png

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('拉取镜像') {
      agent none
      steps {
        container('maven') {
          git(credentialsId: 'gitee-id', url: 'https://gitee.com/rw001/yygh-parent.git', branch: 'master', changelog: true, poll: false)
        }

      }
    }

    stage('项目编译') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean package -Dmaven.test.skip=true'
          sh 'ls'
        }

      }
    }

    stage('代码质量检测') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar-token' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh '''mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN
'''
            }

          }

        }

      }
    }

    stage('default-2') {
      parallel {
        stage('构建hospital-manage镜像,构建server-gateway镜像') {
          agent none
          steps {
            container('maven') {
              sh 'docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage'
              sh 'docker build -t server-gateway:latest -f server-gateway/Dockerfile ./server-gateway'
            }

          }
        }

        stage('构建service-cmn镜像,构建service-hosp镜像') {
          agent none
          steps {
            container('maven') {
              sh 'docker build -t service-cmn:latest -f service/service-cmn/Dockerfile ./service/service-cmn'
              sh 'docker build -t service-hosp:latest -f service/service-hosp/Dockerfile ./service/service-hosp'
            }

          }
        }

        stage('构建service-order镜像和构建service-oss镜像') {
          agent none
          steps {
            container('maven') {
              sh 'docker build -t service-order:latest -f service/service-order/Dockerfile ./service/service-order'
              sh 'docker build -t service-oss:latest -f service/service-oss/Dockerfile ./service/service-oss'
            }

          }
        }

        stage('构建service-sms镜像和构建service-task镜像') {
          agent none
          steps {
            container('maven') {
              sh 'docker build -t service-sms:latest -f service/service-sms/Dockerfile ./service/service-sms'
              sh 'docker build -t service-task:latest -f service/service-task/Dockerfile ./service/service-task'
            }

          }
        }

        stage('构建service-statistics和构建service-user镜像') {
          agent none
          steps {
            container('maven') {
              sh 'docker build -t service-statistics:latest -f service/service-statistics/Dockerfile ./service/service-statistics'
              sh 'docker build -t service-user:latest -f service/service-user/Dockerfile ./service/service-user'
            }

          }
        }

      }
    }

    stage('default-3') {
      parallel {
        stage('推送镜像01') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWD_VAR' ,usernameVariable : 'HARBOR_NAME_VAR' ,)]) {
                sh 'docker tag  hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  server-gateway:latest $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-cmn:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-hosp:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER '
                sh 'echo "$HARBOR_PASSWD_VAR" | docker login $REGISTRY -u "$HARBOR_NAME_VAR" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/server-gateway:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER '
              }

            }

          }
        }

        stage('推送镜像02') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWD_VAR' ,usernameVariable : 'HARBOR_NAME_VAR' ,)]) {
                sh 'docker tag  service-order:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-oss:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-sms:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER '
                sh 'echo "$HARBOR_PASSWD_VAR" | docker login $REGISTRY -u "$HARBOR_NAME_VAR" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER '
              }

            }

          }
        }

        stage('推送镜像03') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWD_VAR' ,usernameVariable : 'HARBOR_NAME_VAR' ,)]) {
                sh 'docker tag  service-statistics:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-task:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker tag  service-user:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER '
                sh 'echo "$HARBOR_PASSWD_VAR" | docker login $REGISTRY -u "$HARBOR_NAME_VAR" --password-stdin'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER '
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER '
              }

            }

          }
        }

      }
    }

    stage('k8s部署') {
      agent none
      steps {
        container('maven') {
          withCredentials([
                                                                                                                                                                                                                          kubeconfigFile(
                                                                                                                                                                                                                                                          credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                                                                                                                                                                                                                                                          variable: 'KUBECONFIG')
                                                                                                                                                                                                                                                          ]) {
                sh 'envsubst < rw.yaml | kubectl apply -f -'
                sh 'kubectl -n his rollout restart deployment nginx-deployment1'
                mail(to: '[email protected]', subject: '部署成功', body: '部署成功')
              }

            }

          }
        }

      }
      environment {
        DOCKER_CREDENTIAL_ID = 'dockerhub-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
        REGISTRY = '192.168.1.220:30012'
        DOCKERHUB_NAMESPACE = 'yygh-parent'
        ALIYUNHUB_NAMESPACE = 'yygh-parent'
        GITHUB_ACCOUNT = 'kubesphere'
        APP_NAME = 'devops-java-sample'
      }
      parameters {
        string(name: 'TAG_NAME', defaultValue: '', description: '')
      }
    }

六、灰度发布

1.创建自制应用

1.1应用负载-应用-自制应用-创建

imagen.png

1.2基本信息

名称his-nginx
应用治理-启用
imagen.png

1.3创建服务(选择无状态服务或者有状态服务)

1.4创建无状态服务器

名称- his-nginx-下一步

1.5容器组设置

NGINX镜像–使用默认端口-同步主机时区-(对钩)-下一步-下一步

镜像推荐自己制作,方便测试
192.168.1.220:30012/k8s/my_nginx:v1

imagen.png

1.6 高级设置选择nodePort-创建-下一步-创建

imagen.png

2.灰度发布-选择金丝雀发布-创建

imagen.png

2.1创建金丝雀发布任务

Nombrehis-nginx-v2
imagen.png

2.2 Configuración del servicio: seleccione su-nginx-siguiente paso

imagen.png

2.3 Configuración de la nueva versión

El nuevo número de versión v2
es para crear un espejo de nginx:v2 usted mismo
. Siguiente paso
imagen.png

Referencia espejo

#1、编写DockerFile
mkdir /opt/my_nginx_dockerfile
cd /opt/my_nginx_dockerfile

cat  >/opt/my_nginx_dockerfile/Dockerfile << 'EOF'
FROM nginx
RUN echo "nginx v2 version" >/usr/share/nginx/html/index.html
EOF



#2、编译镜像
docker build -t 192.168.1.220:30012/k8s/my_nginx:v2 .

#3、登陆镜像
docker login -u admin -p Harbor12345 192.168.1.220:30012

#4、推送至仓库
docker push 192.168.1.220:30012/k8s/my_nginx:v2

2.4 Configuración de política: el valor predeterminado es 50%

imagen.png

2.5 URL de prueba

[root@k8s-master01 ~]# for i in `seq 10`;do curl -s 192.168.1.220:31882;done
nginx v1 version
nginx v2 version
nginx v1 version
nginx v2 version
nginx v1 version
nginx v2 version
nginx v1 version
nginx v2 version
nginx v1 version
nginx v2 version

Sitio web de referencia:
[Primera lección del arquitecto Java nativo de la nube K8s+Docker+KubeSphere+DevOps] https://www.bilibili.com/video/BV13Q4y1C7hS?p=85&vd_source=2d34fd2352ae451c4f6d4cb20707e169

Supongo que te gusta

Origin blog.csdn.net/qq_35583325/article/details/132201641
Recomendado
Clasificación