8-Kubernetes-sentinel-nfs单机版部署

215 阅读5分钟

Kubernetes-sentinel-nfs单机版部署

背景

简单的在kubernetes上部署单例的sentinel,并将nacos作为数据存储、配置,最终存入数据库

一、环境准备,安装kubernetes集群

​ 当前节点base、master、slave1、slave2

kubernetes安装不在此赘述,请参考参考资料进行安装

kubernetes安装nfs不在此赘述,请参考参考资料进行安装

​ 参考资料

1-Kubernetes基于Centos7构建基础环境(一)

2-Kubernetes基于Centos7构建基础环境(二)

3-Kubernetes基于Centos7构建基础环境(三)

4-Kubernetes-基于Centos7安装面板及监控(四)

1-kubernetes-nfs动态存储部署)

集群名称集群域名说明
basebase.xincan.cn部署harbor、nfs等服务
mastermaster.xincan.cnkubernetes主节点,做污点容忍,排除业务资源,nfs客户端等
slave1slave1.xincan.cnkubernetes从节点,nfs客户端等
slave2slave2.xincan.cnkubernetes从节点,nfs客户端等

二、总体流程:

  1. 当前sentinel版本为1.8.1
  2. 找一台虚拟机部署harbor、nfs服务,我这里不在赘述,请参照前面的文档;
  3. 创建一个合适的文件夹,当前我创建的是sentinel文件夹,下载sentinel-dashboard.jar;
  4. 镜像制作;
  5. 在kubernetes主节点上某个目录下创建sentinel-single文件夹,也可以自定义,主要保证内部kubernetes资源定义文件一样即可;
  6. 进入此文件夹之后,复制一下文档中列出的kubernetes资源并保存到此目录下,所有资源如下列表;
[root@master sentinel-single]# tree

├── 1-sentinel-namespace.yaml
├── 2-sentinel-pv.yaml
├── 3-sentinel-pvc.yaml
├── 4-sentinel-configmap.yaml
├── 5-sentinel-deployment.yaml
└── 6-sentinel-service.yaml

  1. 资源创建;
  2. 效果展示;

三、下载JAR包

  1. 选择自己想要的版本号进行下载
    • 在sentinel文件夹下,下载JAR包后保存名称为:sentinel-dashboard.jar
[root@master sentinel-single]# wget https://github.com/alibaba/Sentinel/releases/download/1.8.1/sentinel-dashboard-1.8.1.jar -O sentinel-dashboard.jar

Connecting to github-releases.githubusercontent.com (github-releases.githubusercontent.com)|185.199.111.154|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21242660 (20M) [application/octet-stream]
Saving to: ‘sentinel-dashboard.jar’


100%[===================================================================================================>] 21,242,660  8.74MB/s   in 2.3s

2021-07-02 10:03:29 (8.74 MB/s) - ‘sentinel-dashboard.jar’ saved [21242660/21242660]

[root@master sentinel]#

四、镜像制作

  1. 在sentinel下,创建Dockerfile
  2. 镜像来源是自己制作的,在此处不在讲怎么构建自己的基础镜像
[root@base sentinel]# cat Dockerfile
FROM base.hatech.com.cn/library/openjdk:11.0.11-jdk-slim
MAINTAINER alittlexincan@sina.com

ARG version
ARG port

# sentinel基础变量设置
ENV SENTINEL_VERSION ${version:-1.8.1}
ENV PORT ${port:-8858}
ENV JAVA_OPT=""
ENV PROJECT_NAME sentinel-dashboard
ENV SERVER_HOST localhost
ENV SERVER_PORT 8858
ENV USERNAME sentinel
ENV PASSWORD sentinel
ENV SENTINEL_HOME  /opt/
ENV SENTINEL_LOGS  /opt/logs

# 时区设置
RUN rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 创建日志文件存放位置
RUN mkdir -p ${SENTINEL_LOGS}

# 将jar包复制到/opt/目录下
COPY sentinel-dashboard.jar ${SENTINEL_HOME}

#复制增加的脚本
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh && ln -s /usr/local/bin/docker-entrypoint.sh /opt/docker-entrypoint.sh

#设置执行权限
RUN chmod -R +x ${SENTINEL_HOME}/*jar

VOLUME ${SENTINEL_LOGS}

WORKDIR  ${SENTINEL_HOME}

EXPOSE ${PORT} 8719

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

ENTRYPOINT ["docker-entrypoint.sh"]
[root@base sentinel]#
  1. 初始化脚本编写
#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}

#===========================================================================================
# JVM Configuration
#===========================================================================================
# Get the max heap used by a jvm, which used all the ram available to the container.
if [ -z "$MAX_POSSIBLE_HEAP" ]
then
	MAX_POSSIBLE_RAM_STR=$(java -XX:+UnlockExperimentalVMOptions -XX:MaxRAMFraction=1 -XshowSettings:vm -version 2>&1 | awk '/Max\. Heap Size \(Estimated\): [0-9KMG]+/{ print $5}')
	MAX_POSSIBLE_RAM=$MAX_POSSIBLE_RAM_STR
	CAL_UNIT=${MAX_POSSIBLE_RAM_STR: -1}
	if [ "$CAL_UNIT" == "G" -o "$CAL_UNIT" == "g" ]; then
		MAX_POSSIBLE_RAM=$(echo ${MAX_POSSIBLE_RAM_STR:0:${#MAX_POSSIBLE_RAM_STR}-1} `expr 1 \* 1024 \* 1024 \* 1024` | awk '{printf "%d",$1*$2}')
	elif [ "$CAL_UNIT" == "M" -o "$CAL_UNIT" == "m" ]; then
		MAX_POSSIBLE_RAM=$(echo ${MAX_POSSIBLE_RAM_STR:0:${#MAX_POSSIBLE_RAM_STR}-1} `expr 1 \* 1024 \* 1024` | awk '{printf "%d",$1*$2}')
	elif [ "$CAL_UNIT" == "K" -o "$CAL_UNIT" == "k" ]; then
		MAX_POSSIBLE_RAM=$(echo ${MAX_POSSIBLE_RAM_STR:0:${#MAX_POSSIBLE_RAM_STR}-1} `expr 1 \* 1024` | awk '{printf "%d",$1*$2}')
	fi
	MAX_POSSIBLE_HEAP=$[MAX_POSSIBLE_RAM/4]
fi

# Dynamically calculate parameters, for reference.
Xms=$MAX_POSSIBLE_HEAP
Xmx=$MAX_POSSIBLE_HEAP
Xmn=$[MAX_POSSIBLE_HEAP/2]
# Set for `JAVA_OPT`.
JAVA_OPT="${JAVA_OPT} -server "
if [ x"${MAX_POSSIBLE_HEAP_AUTO}" = x"auto" ];then
    JAVA_OPT="${JAVA_OPT} -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
fi
#-XX:+UseCMSCompactAtFullCollection
#JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 "
#JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
#JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
#JAVA_OPT="${JAVA_OPT}  -XX:-UseLargePages"
#JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} -Dserver.port=${PORT} "
JAVA_OPT="${JAVA_OPT} -Dcsp.sentinel.log.dir=${SENTINEL_LOGS} "
JAVA_OPT="${JAVA_OPT} -Djava.security.egd=file:/dev/./urandom"
JAVA_OPT="${JAVA_OPT} -Dproject.name=${PROJECT_NAME} "
JAVA_OPT="${JAVA_OPT} -Dcsp.sentinel.app.type=1 "
JAVA_OPT="${JAVA_OPT} -Dsentinel.dashboard.auth.username=${USERNAME} "
JAVA_OPT="${JAVA_OPT} -Dsentinel.dashboard.auth.password=${PASSWORD} "
JAVA_OPT="${JAVA_OPT} -Dcsp.sentinel.dashboard.server=${SERVER_HOST:-localhost}:${SERVER_PORT:-8858} "
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -jar sentinel-dashboard.jar "
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
echo "JAVA_OPT============"
echo "JAVA_OPT============"
echo "JAVA_OPT============"
echo $JAVA_OPT

$JAVA ${JAVA_OPT} $@
  1. 查看当前目录
[root@base sentinel]# ll
total 20760
-rw-r--r-- 1 root root     4293 Jun 30 19:05 docker-entrypoint.sh
-rw-r--r-- 1 root root     1072 Jun 30 19:04 Dockerfile
-rw-r--r-- 1 root root 21242660 Feb  4 16:04 sentinel-dashboard.jar
[root@base sentinel]#
  1. 镜像打包
[root@base sentinel]# docker build -t base.hatech.com.cn/library/sentinel-dashboard:v1.8.1 .
  1. 镜像发布
[root@base sentinel]# docker push base.hatech.com.cn/library/sentinel-dashboard:v1.8.1
  1. 查看镜像

image-20210702101531769

  1. 至此镜像成功发布到Harbor上

五、资源创建

  1. 创建sentinel的命名空间Namespace,名称为:sentinel
    • 将所有的资源挂载到此命名空间下;
[root@master sentinel-single]# vim 1-sentinel-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: sentinel
  labels:
    app: sentinel
  1. 创建sentinel的存储资源PersistentVolume,名称为:sentinel-pv
[root@master sentinel-single]# vim 2-sentinel-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: sentinel-pv
  namespace: sentinel
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: sentinel-pvc
    namespace: sentinel
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /hatech/nfs/data/xincan/sentinel-single
    server: 192.168.1.80
  volumeMode: Filesystem
  1. 创建sentinel的存储匹配资源PersistentVolumeClaim,名称为:sentinel-pvc
[root@master sentinel-single]# vim 3-sentinel-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sentinel-pvc
  namespace: sentinel
  labels:
    app: sentinel
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  1. 创建sentinel的配置资源ConfigMap,名称为:sentinel-config
[root@master sentinel-single]# vim 4-sentinel-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: sentinel-config
  namespace: sentinel
data:
  sentinel.server.host: "sentinel-service.sentinel"
  sentinel.server.port: "8858"
  sentinel.dashboard.auth.username: "sentinel"
  sentinel.dashboard.auth.password: "sentinel"
  1. 创建sentinel实例资源Deployment,名称为:sentinel
[root@master sentinel-single]# vim 5-sentinel-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sentinel
  namespace: sentinel
  labels:
    app: sentinel
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sentinel
  template:
    metadata:
      labels:
        app: sentinel
    spec:
      containers:
        - name: sentinel
          image: base.hatech.com.cn/library/sentinel-dashboard:v1.8.1
          imagePullPolicy: Always
          ports:
          - name: client
            containerPort: 8858
          - name: api
            containerPort: 8719
          resources:
            limits:
              cpu: 450m
              memory: 1Gi
            requests:
              cpu: 400m
              memory: 1Gi
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: JAVA_OPT_EXT
              value: "-Dserver.servlet.session.timeout=7200 "
            - name: SERVER_HOST
              valueFrom:
                configMapKeyRef:
                  name: sentinel-config
                  key: sentinel.server.host
            - name: SERVER_PORT
              valueFrom:
                configMapKeyRef:
                  name: sentinel-config
                  key: sentinel.server.port
            - name: USERNAME
              valueFrom:
                  configMapKeyRef:
                    name: sentinel-config
                    key: sentinel.dashboard.auth.username
            - name: PASSWORD
              valueFrom:
                  configMapKeyRef:
                    name: sentinel-config
                    key: sentinel.dashboard.auth.password
          volumeMounts:
            - name: sentinel-storage
              mountPath: /opt/logs
      volumes:
        - name: sentinel-storage
          persistentVolumeClaim:
            claimName: sentinel-pvc
  1. 创建sentinel对外暴露资源,名称为:sentinel-service
[root@master sentinel-single]# vim 6-sentinel-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: sentinel-service
  namespace: sentinel
  labels:
    app: sentinel
spec:
  type: NodePort
  selector:
    app: sentinel
  ports:
  - name: client
    port: 8858
    nodePort: 31160
    protocol: TCP
  - name: api
    port: 8719
    nodePort: 31170
    protocol: TCP
  1. 创建资源
    • 进入sentinel-single执行命令:kubectl apply -f ../sentinel-single/
    • 删除所有资源命令:kubectl delete -f ../sentinel-single/
[root@master sentinel-single]# kubectl apply -f ../sentinel-single/
namespace/sentinel created
persistentvolume/sentinel-pv created
persistentvolumeclaim/sentinel-pvc created
configmap/sentinel-config created
deployment.apps/sentinel created
service/sentinel-service created
[root@master sentinel-single]#


[root@master sentinel-single]# kubectl delete -f ../sentinel-single/
namespace "sentinel" deleted
persistentvolume "sentinel-pv" deleted
persistentvolumeclaim "sentinel-pvc" deleted
configmap "sentinel-config" deleted
deployment.apps "sentinel" deleted
service "sentinel-service" deleted

六、效果展示

  1. 通过kubectl -n sentinel get pv,pvc,cm,pod,svc,查询sentinel命名空间下对应资源,pv(persistentvolume)数据挂载资源,pvc等等资源
[root@master sentinel-single]# kubectl -n sentinel get pv,pvc,cm,pod,svc
NAME                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS    REASON   AGE
persistentvolume/sentinel-pv  2Gi        RWO            Retain           Bound    sentinel/sentinel-pvc  nfs                      3m1s

NAME                                 STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/sentinel-pvc   Bound    sentinel-pv   2Gi        RWO                           3m

NAME                         DATA   AGE
configmap/kube-root-ca.crt   1      3m1s
configmap/sentinel-config    4      3m

NAME                            READY   STATUS    RESTARTS   AGE
pod/sentinel-668c744dfb-7cf5r   1/1     Running   0          3m

NAME                       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
service/sentinel-service   NodePort   10.97.141.223   <none>        8858:31160/TCP,8719:31170/TCP   3m
[root@master sentinel-single]#

七、测试连接、外部地址访问

  1. 通过地址端口号访问
    • 获取NodePort端口
    • 登录名称:sentinel
    • 登录密码:sentinel
[root@master sentinel-single]# kubectl -n sentinel get svc
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
sentinel-service   NodePort   10.97.141.223   <none>        8858:31160/TCP,8719:31170/TCP   7m58s
[root@master sentinel-single]#
  1. 访问地址:http://192.168.1.81:31160

image-20210702103700743

八:结束语

至此单机版Kubernetes部署sentinel单机版完成