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动态存储部署)
| 集群名称 | 集群域名 | 说明 |
|---|---|---|
| base | base.xincan.cn | 部署harbor、nfs等服务 |
| master | master.xincan.cn | kubernetes主节点,做污点容忍,排除业务资源,nfs客户端等 |
| slave1 | slave1.xincan.cn | kubernetes从节点,nfs客户端等 |
| slave2 | slave2.xincan.cn | kubernetes从节点,nfs客户端等 |
二、总体流程:
- 当前sentinel版本为1.8.1
- 找一台虚拟机部署harbor、nfs服务,我这里不在赘述,请参照前面的文档;
- 创建一个合适的文件夹,当前我创建的是sentinel文件夹,下载sentinel-dashboard.jar;
- 镜像制作;
- 在kubernetes主节点上某个目录下创建sentinel-single文件夹,也可以自定义,主要保证内部kubernetes资源定义文件一样即可;
- 进入此文件夹之后,复制一下文档中列出的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
- 资源创建;
- 效果展示;
三、下载JAR包
- 选择自己想要的版本号进行下载
- 在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]#
四、镜像制作
- 在sentinel下,创建Dockerfile
- 镜像来源是自己制作的,在此处不在讲怎么构建自己的基础镜像
[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]#
- 初始化脚本编写
#!/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} $@
- 查看当前目录
[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]#
- 镜像打包
[root@base sentinel]# docker build -t base.hatech.com.cn/library/sentinel-dashboard:v1.8.1 .
- 镜像发布
[root@base sentinel]# docker push base.hatech.com.cn/library/sentinel-dashboard:v1.8.1
- 查看镜像
- 至此镜像成功发布到Harbor上
五、资源创建
- 创建sentinel的命名空间Namespace,名称为:sentinel
- 将所有的资源挂载到此命名空间下;
[root@master sentinel-single]# vim 1-sentinel-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: sentinel
labels:
app: sentinel
- 创建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
- 创建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
- 创建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"
- 创建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
- 创建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
- 创建资源
- 进入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
六、效果展示
- 通过
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]#
七、测试连接、外部地址访问
- 通过地址端口号访问
- 获取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]#
八:结束语
至此单机版Kubernetes部署sentinel单机版完成