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

部署


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM