走过路过不要错过,有钱捧个钱场,没钱捧个人场. 欢迎|

志旋

园龄:4年9个月粉丝:5关注:1

Docker/K8s 部署 sentinel-dashboard

Sentinel Logo

1、Sentinel: 分布式系统的流量防卫兵

2、Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
  • 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性:

Sentinel-features-overview

Sentinel 的开源生态:

Sentinel-opensource-eco

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

3、Docker部署 Sentinel

可以在GitHub官方网站 Sentinel 下载源码包

3.1 编写Dockerfile

FROM adoptopenjdk/openjdk11
MAINTAINER jackWu <627521884@qq.com>

mvn clean package
COPY ./target/sentinel-dashboard.jar sentinel-dashboard.jar

EXPOSE 8080

CMD java ${JAVA_OPTS} -jar sentinel-dashboard.jar

3.2 执行Dockerfile 构建docker镜像

docker build -t  wuzhixuan/sentinel-dashboard:latest .

3.3测试构建的docke镜像可行

docker run -d -p 8081:8080 --name sentinel-dashboard -e "JAVA_OPTS= -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -Dserver.servlet.session.timeout=7200" wuzhixuan/sentinel-dashboard 

其实查看源文件可以设置 登录的用户名和密码 默认的用户名和密码都是sentinel

源码配置文件

然后你就可以访问部署好的

项目

# 4. K8s部署 Sentinel

4.1流程

  • 我目前是直接使用的是jenkins pieline Jenkinsfile
  • 先将docker镜像push 阿里云 容器镜像服务 仓库
  • 然后k8s拉取容器镜像自动部署

Jenkinsfile

def label = "slave-${UUID.randomUUID().toString()}"

podTemplate(label: label, containers: [
  containerTemplate(name: 'jdk-maven', image: 'appinair/jdk11-maven:latest', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'docker', image: 'docker:latest', command: 'cat', ttyEnabled: true),
  containerTemplate(name: 'kubectl', image: 'cnych/kubectl', command: 'cat', ttyEnabled: true)
], serviceAccount: 'jenkins-admin', volumes: [
  hostPathVolume(mountPath: '/home/jenkins/.kube', hostPath: '/root/.kube'),
  hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
]) {
  node(label) {
    def repo = checkout scm
    def gitCommit = repo.GIT_COMMIT
    def gitBranch = repo.GIT_BRANCH
    
    // 获取 git commit id 作为镜像标签
    def imageTag = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim()
    // 仓库地址
    def registryUrl = "registry-vpc.cn-shenzhen.aliyuncs.com"
    def imageEndpoint = "wuzhixuan/sentinel-dashboard"
    // 镜像
    def image = "${registryUrl}/${imageEndpoint}:latest"
    
    stage('单元测试') {
      echo "测试阶段"
    }
    
    stage('代码编译打包') {
      container('jdk-maven') {
        echo "代码编译打包阶段"
        sh "mvn clean package -Dmaven.test.skip=true"
      }
    }
    
    stage('构建 Docker 镜像') {
      withCredentials([usernamePassword(credentialsId: 'dock-auth-ali', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USER')]) {
          container('docker') {
            echo "3. 构建 Docker 镜像阶段"
            sh """
              docker login ${registryUrl} -u ${DOCKER_USER} -p ${DOCKER_PASSWORD}
              docker build -t ${image} .
              docker push ${image}
              """
          }
      }
    }

        stage('部署到k8s') {
          container('kubectl') {
            echo "部署到k8s集群"
            sh """
              sed -i 's#\$image#${image}#' deployment.yaml
              """
            kubernetesDeploy(enableConfigSubstitution: false, kubeconfigId: 'kubeconfig1', configs: 'deployment.yaml')
          }
        }
  }
}

k8s-sentinel.yaml

# 外部访问服务
apiVersion: v1
kind: Service
metadata:
  namespace: kube-ops
  name: sentinel
  labels:
    app: sentinel
spec:
  ports:
    - protocol: TCP
      name: http
      port: 8080
      targetPort: 8080
      nodePort: 30007
  type: NodePort
  selector:
    app: sentinel
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sentinel
  namespace: kube-ops
spec:
  serviceName: sentinel
  replicas: 1
  template:
    metadata:
      labels:
        app: sentinel
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
    spec:
      containers:
        - name: sentinel
          imagePullPolicy: Always
          image: $image
          resources:
            limits:
              memory: "1Gi"
              cpu: "1"
          ports:
            - containerPort: 8080
              name: client
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: JAVA_OPTS
              value: "-Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -Dserver.servlet.session.timeout=7200"
  selector:
    matchLabels:
      app: sentinel

5.配置jenkins

配置jenkins

这样就可以直接自动部署服务到k8s

部署

本文作者:志旋

本文链接:https://www.cnblogs.com/wuzhixuan/p/15224141.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   志旋  阅读(1404)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起