背景:

后端程序团队准备一波流springcloud架构,配置中心用了阿里开源的nacos。不出意外的要高一个sentinel做测试了…..。做一个demo开始搞一下吧。
kubernetes上面搭建sentinel的案例较少。看下眼还是springcloud全家桶的多点。阿里开源的这一套还是少点。百度或者Google搜索 sentinel基本出来的都是redis哨兵模式…有点忧伤。
注:搭建方式可以参照:https://blog.csdn.net/fenglailea/article/details/92436337?utm_term=k8s%E9%83%A8%E7%BD%B2Sentinel&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-0-92436337&spm=3001.4430

一. 搭建sentinel-dashboard:

1.自定义创建sentinel-dashboard image镜像

嗯 很理所当然了不喜欢用docker镜像这名词了。还是用image吧。上面引用的博客中1.6.1的版本吧 ?搭建跑了下犯了强迫症,最新的版本是1.8.1根据foxiswho大佬的配置文件进行修改下镜像。
vim Dockerfile

  1. FROM openjdk:11.0.3-jdk-stretch
  2. MAINTAINER foxiswho@gmail.com
  3. ARG version
  4. ARG port
  5. # sentinel version
  6. ENV SENTINEL_VERSION ${version:-1.8.1}
  7. #PORT
  8. ENV PORT ${port:-8858}
  9. ENV JAVA_OPT=""
  10. #
  11. ENV PROJECT_NAME sentinel-dashboard
  12. ENV SERVER_HOST localhost
  13. ENV SERVER_PORT 8858
  14. ENV USERNAME sentinel
  15. ENV PASSWORD sentinel
  16. # sentinel home
  17. ENV SENTINEL_HOME /opt/
  18. ENV SENTINEL_LOGS /opt/logs
  19. #tme zone
  20. RUN rm -rf /etc/localtime \
  21. && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  22. # create logs
  23. RUN mkdir -p ${SENTINEL_LOGS}
  24. # get the version
  25. #RUN cd / \
  26. # && wget https://github.com/alibaba/Sentinel/releases/download/${SENTINEL_VERSION}/sentinel-dashboard-${SENTINEL_VERSION}.jar -O sentinel-dashboard.jar \
  27. # && mv sentinel-dashboard.jar ${SENTINEL_HOME} \
  28. # && chmod -R +x ${SENTINEL_HOME}/*jar
  29. # test file
  30. COPY sentinel-dashboard.jar ${SENTINEL_HOME}
  31. # add scripts
  32. COPY scripts/* /usr/local/bin/
  33. RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
  34. && ln -s /usr/local/bin/docker-entrypoint.sh /opt/docker-entrypoint.sh
  35. #
  36. RUN chmod -R +x ${SENTINEL_HOME}/*jar
  37. VOLUME ${SENTINEL_LOGS}
  38. WORKDIR ${SENTINEL_HOME}
  39. EXPOSE ${PORT} 8719
  40. CMD java ${JAVA_OPT} -jar sentinel-dashboard.jar
  41. ENTRYPOINT ["docker-entrypoint.sh"]

注: 大佬的Dockerfile中 暴露的端口是8200,由于看sentinel对外暴露端口都是8518我就把dockerfile修改了。然后把https://github.com/alibaba/Sentinel/releases下载了1.8.1版本的jar包改名为sentinel-dashboard.jar 放在当前目录
image.png
image.png
dc目录可以忽略,原项目copy自https://github.com/foxiswho/docker-sentinel
cat scripts/docker-entrypoint.sh

  1. #!/bin/bash
  2. # Licensed to the Apache Software Foundation (ASF) under one or more
  3. # contributor license agreements. See the NOTICE file distributed with
  4. # this work for additional information regarding copyright ownership.
  5. # The ASF licenses this file to You under the Apache License, Version 2.0
  6. # (the "License"); you may not use this file except in compliance with
  7. # the License. You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. #===========================================================================================
  17. # Java Environment Setting
  18. #===========================================================================================
  19. error_exit ()
  20. {
  21. echo "ERROR: $1 !!"
  22. exit 1
  23. }
  24. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
  25. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
  26. [ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
  27. export JAVA_HOME
  28. export JAVA="$JAVA_HOME/bin/java"
  29. export BASE_DIR=$(dirname $0)/..
  30. export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
  31. #===========================================================================================
  32. # JVM Configuration
  33. #===========================================================================================
  34. # Get the max heap used by a jvm, which used all the ram available to the container.
  35. if [ -z "$MAX_POSSIBLE_HEAP" ]
  36. then
  37. MAX_POSSIBLE_RAM_STR=$(java -XX:+UnlockExperimentalVMOptions -XX:MaxRAMFraction=1 -XshowSettings:vm -version 2>&1 | awk '/Max\. Heap Size \(Estimated\): [0-9KMG]+/{ print $5}')
  38. MAX_POSSIBLE_RAM=$MAX_POSSIBLE_RAM_STR
  39. CAL_UNIT=${MAX_POSSIBLE_RAM_STR: -1}
  40. if [ "$CAL_UNIT" == "G" -o "$CAL_UNIT" == "g" ]; then
  41. MAX_POSSIBLE_RAM=$(echo ${MAX_POSSIBLE_RAM_STR:0:${#MAX_POSSIBLE_RAM_STR}-1} `expr 1 \* 1024 \* 1024 \* 1024` | awk '{printf "%d",$1*$2}')
  42. elif [ "$CAL_UNIT" == "M" -o "$CAL_UNIT" == "m" ]; then
  43. MAX_POSSIBLE_RAM=$(echo ${MAX_POSSIBLE_RAM_STR:0:${#MAX_POSSIBLE_RAM_STR}-1} `expr 1 \* 1024 \* 1024` | awk '{printf "%d",$1*$2}')
  44. elif [ "$CAL_UNIT" == "K" -o "$CAL_UNIT" == "k" ]; then
  45. MAX_POSSIBLE_RAM=$(echo ${MAX_POSSIBLE_RAM_STR:0:${#MAX_POSSIBLE_RAM_STR}-1} `expr 1 \* 1024` | awk '{printf "%d",$1*$2}')
  46. fi
  47. MAX_POSSIBLE_HEAP=$[MAX_POSSIBLE_RAM/4]
  48. fi
  49. # Dynamically calculate parameters, for reference.
  50. Xms=$MAX_POSSIBLE_HEAP
  51. Xmx=$MAX_POSSIBLE_HEAP
  52. Xmn=$[MAX_POSSIBLE_HEAP/2]
  53. # Set for `JAVA_OPT`.
  54. JAVA_OPT="${JAVA_OPT} -server "
  55. if [ x"${MAX_POSSIBLE_HEAP_AUTO}" = x"auto" ];then
  56. JAVA_OPT="${JAVA_OPT} -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
  57. fi
  58. #-XX:+UseCMSCompactAtFullCollection
  59. #JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 "
  60. #JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
  61. #JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
  62. #JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
  63. #JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
  64. #JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
  65. JAVA_OPT="${JAVA_OPT} -Dserver.port=${PORT} "
  66. JAVA_OPT="${JAVA_OPT} -Dcsp.sentinel.log.dir=${SENTINEL_LOGS} "
  67. JAVA_OPT="${JAVA_OPT} -Djava.security.egd=file:/dev/./urandom"
  68. JAVA_OPT="${JAVA_OPT} -Dproject.name=${PROJECT_NAME} "
  69. JAVA_OPT="${JAVA_OPT} -Dcsp.sentinel.app.type=1 "
  70. JAVA_OPT="${JAVA_OPT} -Dsentinel.dashboard.auth.username=${USERNAME} "
  71. JAVA_OPT="${JAVA_OPT} -Dsentinel.dashboard.auth.password=${PASSWORD} "
  72. JAVA_OPT="${JAVA_OPT} -Dcsp.sentinel.dashboard.server=${SERVER_HOST:-localhost}:${SERVER_PORT:-8558} "
  73. JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
  74. JAVA_OPT="${JAVA_OPT} -jar sentinel-dashboard.jar "
  75. JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
  76. echo "JAVA_OPT============"
  77. echo "JAVA_OPT============"
  78. echo "JAVA_OPT============"
  79. echo $JAVA_OPT
  80. $JAVA ${JAVA_OPT} $@

依然抄的大佬的启动文件。但是注意…大佬这里也写死了端口8200….记得修改

嗯 开始build镜像

  1. docker build -t ccr.ccs.tencentyun.com/xxxx/sentinel:1.8.1 .
  2. docker push ccr.ccs.tencentyun.com/xxxx/sentinel:1.8.1

image.png
对了 我是不是可以用crictl命令操作一下?crictl ctr 不支持build……..后续是不是可以考虑用
buildkit 构建镜像?

2. 在kubernetes集群中部署sentinel

Kubernetes 1.20.5搭建nacos中建立了nacos namespace. sentinel也部署在sentinel命名空间了没有做太多的复杂配置。这边都是简单跑起来的demo,先跑通流程

1. 部署configmap

cat config.yaml

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: sentinel-cm
  5. data:
  6. sentinel.server.host: "sentinel"
  7. sentinel.server.port: "8858"
  8. sentinel.dashboard.auth.username: "sentinel111111"
  9. sentinel.dashboard.auth.password: "W3$ti$aifffdfGEqjf.xOkZ"

注:这里的sentinel.server.host 我这里直接写的是服务名,还没有出现什么异常启动了。正常是不是该输入一个fqdn? sentinel.nacos.svc.cluster.local 这样的呢?(当然了 我的domain不是cluster.local).

  1. kubectl apply -f config.yaml -n nacos

2 部署 sentinel statefulset

cat pod.yaml

  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4. name: sentinel
  5. labels:
  6. app: sentinel
  7. spec:
  8. serviceName: sentinel
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: sentinel
  13. template:
  14. metadata:
  15. labels:
  16. app: sentinel
  17. spec:
  18. containers:
  19. - name: sentinel
  20. image: ccr.ccs.tencentyun.com/XXXX/sentinel:1.8.1
  21. imagePullPolicy: IfNotPresent
  22. resources:
  23. limits:
  24. cpu: 450m
  25. memory: 1024Mi
  26. requests:
  27. cpu: 400m
  28. memory: 1024Mi
  29. env:
  30. - name: TZ
  31. value: Asia/Shanghai
  32. - name: JAVA_OPT_EXT
  33. value: "-Dserver.servlet.session.timeout=7200 "
  34. - name: SERVER_HOST
  35. valueFrom:
  36. configMapKeyRef:
  37. name: sentinel-cm
  38. key: sentinel.server.host
  39. - name: SERVER_PORT
  40. valueFrom:
  41. configMapKeyRef:
  42. name: sentinel-cm
  43. key: sentinel.server.port
  44. - name: USERNAME
  45. valueFrom:
  46. configMapKeyRef:
  47. name: sentinel-cm
  48. key: sentinel.dashboard.auth.username
  49. - name: PASSWORD
  50. valueFrom:
  51. configMapKeyRef:
  52. name: sentinel-cm
  53. key: sentinel.dashboard.auth.password
  54. ports:
  55. - containerPort: 8858
  56. - containerPort: 8719
  57. volumeMounts:
  58. - name: vol-log
  59. mountPath: /opt/logs
  60. volumes:
  61. - name: vol-log
  62. hostPath:
  63. path: /www/k8s/foxdev/sentinel/logs
  64. type: Directory
  1. kubectl apply -f pod.yaml -n nacos

注意:偷懒了 volumes挂载不想搞了本来就是测试的 在三个work节点都搞了/www/k8s/foxdev/sentinel/logs目录.直接复制foxiswho的配置了基本。

3. 部署service服务

cat svc.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: sentinel
  5. labels:
  6. app: sentinel
  7. spec:
  8. type: ClusterIP
  9. ports:
  10. - port: 8858
  11. targetPort: 8858
  12. name: web
  13. - port: 8719
  14. targetPort: 8719
  15. name: api
  16. selector:
  17. app: sentinel
  1. kubectl apply -f svc -n nacos

4. 验证服务是否正常

  1. kubectl get pod,svc -n nacos
  2. kubectl logs -f sentinel-0 -n nacos

image.png

5. ingress 对外暴露sentinel dashboard

cat ingress.yaml

  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4. name: sentinel-http
  5. namespace: nacos
  6. annotations:
  7. kubernetes.io/ingress.class: traefik
  8. traefik.ingress.kubernetes.io/router.entrypoints: web
  9. spec:
  10. rules:
  11. - host: sentinel.saynaihe.com
  12. http:
  13. paths:
  14. - pathType: Prefix
  15. path: /
  16. backend:
  17. service:
  18. name: sentinel
  19. port:
  20. number: 8858

输入 configmap中设置的用户名密码
image.png
进入控制台:
image.png
实时监控,请求链路 流控规则和降级规则这几个名词个人就很喜欢的样子…..后面再去研究下使用。