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 的開源生態:
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
這樣就可以直接自動部署服務到k8s