1. 前言

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel 的使用分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对Dubbo /Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard):主要负责管理推送规则、监控、管理机器信息等

本篇文章不涉及客户端使用方面的讲解,只讲解dashboard在k8s环境中的部署。

Dashboard官方文档:https://sentinelguard.io/zh-cn/docs/dashboard.html

客户端的使用详见:https://sentinelguard.io/zh-cn/docs/quick-start.html

2. 部署流程

步骤可分为以下2部分

  • 编写Dockerfile,官网下载jar包,编译镜像
  • 编写K8S文件及部署

下载jar包官网:Releases · alibaba/Sentinel · GitHub

3. 编译镜像

sentinel没有官方编译的镜像,一般做法是手动从官方下载源码编译成jar包或直接下载jar包,通过dockerfile打包成镜像,推送到私有镜像仓库进行使用。

因此,需要什么版本,可自行控制

3.1 Dockerfile文件

FROM openjdk:8-jdk
# 环境变量
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.utf8
ENV LANGUAGE=zh_CN.utf8

WORKDIR /app
# HTTP端口
EXPOSE 8080
# 客户端通信端口
EXPOSE 8719

#下载jar
ADD https://github.com/alibaba/Sentinel/releases/download/1.8.5/sentinel-dashboard-1.8.5.jar ./sentinel-dashboard.jar

# 时间同步设置
# 设置权限 chown 用户:所在组 文件目录 0表示root用户所在的组标识;1001是指定了一个用户标识
# chmod 读取权限 r = 4,写入权限 w = 2,执行权限 x = 1
# 3个数字分别代表 拥有者,组用户,其他用户的权限
# 775中的第一个7表示4+2+1 表示拥有者拥有读写执行权限
# 第二个7当前用户所在组中的用户拥有者拥有读写执行权限
# 第三个5表示其他用户有读和执行的权限 没有写的权限
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \ 
 && chown 1001:0 -R /app \
 && chmod 775 -R /app
# java启动jar包
ENTRYPOINT ["java","-Dfile.encoding=UTF8","-Dsun.jnu.encoding=UTF8","-jar","sentinel-dashboard.jar"]

3.2 编译镜像

docker build -t harbor.test.cn/sentinel-dashboard:latest

docker push harbor.test.cn/sentinel-dashboard:latest

4. 部署

k8s deployment.yaml文件如下,注意替换image为自己打包的镜像地址

apiVersion: v1
kind: Service
metadata:
  name: sentinel
  labels:
    app: sentinel
spec:
  ports:
    - port: 8080
      name: http
      targetPort: 8080
    - port: 8719
      name: api-port
      targetPort: 8719 
  selector:
    app: sentinel
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sentinel
spec:
  serviceName: sentinel
  replicas: 1
  template:
    metadata:
      labels:
        app: sentinel
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
    spec:
      containers:
        - name: sentinel
          imagePullPolicy: Always
          image: harbor.test.cn/sentinel-dashboard:latest
          resources:
            limits:
              memory: 1024Mi
              cpu: 1000m
            requests:
              cpu: 200m
              memory: 1024Mi
          ports:
            - containerPort: 8080
              name: http
            - containerPort: 8719
              name: api-port
          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

部署命令

kubectl apply -f deployment.yaml 
#查看部署状态 
kubectl get sts

注意,sentinel控制台目前只能单机部署,控制台提供通用的鉴权接口 AuthService,所以只引入基本的登录功能,无用户管理功能,需要自行二次开发,默认帐号密码可在java启动参数时配置,在deployment.yaml环境变量JAVA_OPTS中进行修改,默认帐号密码设为sentinel,注意发布到生产时记得改一下密码再发布

"-Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel -Dserver.servlet.session.timeout=7200"

5. 配置ingress,实现web访问

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sentinel
spec:
  ingressClassName: nginx
  rules:
  - host: sentinel.test.cn
    http:
      paths:
      - backend:
          service:
            name: sentinel
            port:
              number: 8080
        path: /
        pathType: Prefix

部署

kubectl apply -f ingress.yaml

然后就可以通过域名:http://sentinel.test.cn

然后就可以通过接入客户端进行规则 配置管理了,配置客户端时,在K8S集群内部的应用可以通过地址:sentinel.<namespace>.svc: 8719进行接入(namespace以实际 部署在的命名空间为准),外部接入的话,需要新建一个service,并通过nodeport的方式将8719这个接口映射到外部进行访问。

觉得有用点个收藏 吧~

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐