文章目录
- 一、前言
- 1.1 准备工作
- 1.2 最终目标
- 二、安装步骤
- 2.1 购买云服务器和NAS存储
- 2.2 kubekey方式安装k8s集群
- 2.2.1 环境检查及安装基础包
- 2.2.2 kubekey安装k8s集群
- 2.2.3 压测机环境准备
- 2.2.4 中间件部署
- 2.2.4.1 部署NFS远程共享存储
- 2.2.4.2 部署MySQL
- 2.2.4.3 部署Redis
- 2.2.4.4 部署RabbitMQ
- 2.2.4.5 部署Sentinel
- 2.2.4.6 部署Nacos
- 2.2.4.7 部署ElasticSearch
- 2.2.4.8 部署Kafka
- 2.2.4.9 部署Logstash
- 2.2.4.10 部署Skywalking
- 2.2.5 mall-swarm商城应用部署
- 2.2.5.1 容器镜像打包
- 2.2.5.2 应用服务部署
- 2.2.6 监控系统部署(Prometheus&Influxdb&Grafana)
- 2.2.7 检查各个服务和工具的可用性
- 2.2.8 执行压测场景
- 三、最后
一、前言
1.1 准备工作
- 项目源码:https://github.com/macrozheng/mall-swarm
- 操作机&服务器:一台笔记本或台式机,6台服务器(1台压测机、5台k8s集群机器)
- 操作机终端工具:Idea、Navicat、shell远程工具、Chrome等
- 服务器组件:Java、Jmeter、Maven、Prometheus、K8s、Mysql等
- 安装介质和脚本:mall_swarm_depoly.tar.gz、script-original.tar.gz
1.2 最终目标
完成压测环境搭建,含K8s集群、中间件、应用服务、全局监控、定向监控等,实现Jmeter一键压测
全文分为8个部分,阅读预估 20min,为缩减篇幅,本文省略原理讲解,需要知道为何这样操作的同学请移步本公众号其他分章节详细内容,读者若想获取安装介质和脚本,可在公众号留言“性能测试环境”获取相应资料。
二、安装步骤
2.1 购买云服务器和NAS存储
在阿里云官网注册、充值、购买即可。
2.2 kubekey方式安装k8s集群
2.2.1 环境检查及安装基础包
shell远程工具使用公网IP登录各台云服务器
################################### 所有集群内机器执行 ##########
yum update
yum install -y curl
yum install -y socat
yum install -y vim
yum install -y conntrack
swapoff -a
#查看防火墙状态
firewall-cmd --state
#CentOS 7.0默认使用的是firewall作为防火墙
#停止firewall
systemctl stop firewalld.service
#禁止防火墙开启启动
systemctl disable firewalld.service
################################### 各机器分别执行 ##################################
hostnamectl set-hostname s5
hostnamectl set-hostname s6
hostnamectl set-hostname s7
hostnamectl set-hostname s8
hostnamectl set-hostname s9
hostnamectl set-hostname s10
2.2.2 kubekey安装k8s集群
shell远程工具使用公网IP登录master节点(S6)执行
################################## master节点执行 #################################
# 上传介质包mall_swarm_depoly.tar.gz到master机器的root家目录/root,并解压
tar -zxvf mall_swarm_depoly.tar.gz
rpm -ivh kubekey-v2.2.2-linux-64bit.rpm
export KKZONE=cn
kk create config --with-kubernetes v1.23.8 --with-kubesphere v3.2.1 -f k8s.yaml
#默认生成的目标文件,参数太多,推荐使用我们部署成功的,改一下内网IP、密码,机器角色、以及替换下刚刚生成的网络部分即可。
kk create cluster -f bihe-k8s-cluster-config.yaml
#################### docker模式 ########################
docker run -d --restart=unless-stopped --name=kuboard -p 80:80/tcp -p 10081:10081/tcp -e KUBOARD_ENDPOINT="http://172.16.178.56:80" -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" -v /root/kuboard-data:/data swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3
http://120.26.198.77:80
账号:admin
密码:Kuboard123
安装Kuboard向导,在kuboard中添加集群配置文件,master节点 cat ~/.kube/config
。将其中信息添加进去。
2.2.3 压测机环境准备
shell 远程工具使用公网IP登录压测机(S5)执行
################################## 压测机S5机器执行 #################################
hostnamectl set-hostname s5
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
swapoff -a
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install -y curl
yum install -y socat
yum install -y vim
yum install -y conntrack
yum update -y
yum install -y docker-ce
docker --version
systemctl start docker
systemctl status docker
docker run hello-world
# 添加镜像地址,cat显示结果为贴进S5机器/etc/docker/daemon.json中
vim /etc/docker/daemon.json
[root@s5 mall_swarm_depoly]# cat /etc/docker/daemon.json
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["172.31.184.225:5000"]
}
# 重启docker
systemctl stop docker
systemctl status docker
systemctl start docker
systemctl status docker
# 安装JAVA
tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz
mv java-se-8u41-ri/ jdk1.8
mkdir -p /usr/local/src/java
mv jdk1.8/ /usr/local/src/java/
# 安装Jmeter
tar -zxvf jmeter.tar.gz
# 安装maven
tar -zxvf apache-maven-3.8.6-bin.tar.gz
# 替换s5机器root用户下~/.bash_profile ,并执行source ~/.bash_profile
[root@s5 home]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
JMETER_HOME=/home/jmeter/apache-jmeter-5.4.3
PATH=$PATH:$HOME/bin:$JMETER_HOME/bin
export JAVA_HOME=/usr/local/src/java/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/opt/apache-maven-3.8.6
export PATH=$MAVEN_HOME/bin:$PATH
export PATH
[root@s5 home]source ~/.bash_profile
# 检查版本
[root@s5 mall-swarm]# java -version
openjdk version "1.8.0_332"
OpenJDK Runtime Environment (build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)
[root@s5 mall-swarm]# jmeter --version
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.4.3
Copyright (c) 1999-2021 The Apache Software Foundation
[root@s5 mall-swarm]# mvn --version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
Maven home: /opt/apache-maven-3.8.6
Java version: 1.8.0_332, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1127.19.1.el7.x86_64", arch: "amd64", family: "unix"
# 将代码mall-swarm.zip传至s5机器
[root@s5 ~]# yum install -y unzip
unzip mall-swarm.zip
# 替换成自己的username,注意先在阿里云镜像管理界面建立公开访问的命名空间original-mall
docker images
docker login --username=bihe666 registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/original-mall/mall-auth:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/original-mall/mall-auth:[镜像版本号]
docker pull registry.cn-hangzhou.aliyuncs.com/original-mall/mall-auth:1.0
docker images
2.2.4 中间件部署
2.2.4.1 部署NFS远程共享存储
shell远程工具使用公网IP登录master节点(S6)执行
########################## master节点执行 ########################
# 进入介质包的ali-nas_7d目录下
cd ~/mall_swarm_depoly/mall_swarm_7dgroup/ali-nas_7d/
kubectl create -f deploy/
# 替换sc.yaml中的nas服务器地址,然后创建StorageClass无须命名空间
kubectl create -f sc.yaml
操作示例:
2.2.4.2 部署MySQL
实测下来,还是应该先 helm 安装 MySQL ,其中也会一同创建需要的 pvc 等,但是 mysql 自己因为缺引导文件,我们可以通过另起一个 nginx 镜像,使用和 mysql 共享的pvc,这样在 nginx 创建好 binlog 目录下 mysql-bin.index 后,重启 mysql 服务就可正常启动。
#################### helm安装mysql ###########################
cd /root/mall_swarm_7dgroup/mysql
helm install mysql -n original-mall .
依赖文件:
mall_swarm_7dgroup/mysql/*
mall_swarm_7dgroup/nginx-dp-for-mysql.yaml
需要修改的地方:使用我们的配置无需修改。
安装命令
注:若直接helm安装mysql服务,会因文件不存在报错,无法启动,故我们先启动个original-mall命名空间下的pod,在共享目录里创建相应目录
cd /root/mall_swarm_7dgroup/
kubectl create -f nginx-dp-for-mysql.yaml -n original-mall
# 通过kuboard进入nginx容器内创建binlog目录和binlog目录下的mysql-bin.index
cd data
mkdir binlog
touch mysql-bin.index
cd /data
chmod -R 777 binlog
chmod -R 777 data
[root@s6 mysql]# kubectl get all -A | grep mysql
original-mall service/mysql-min-headless ClusterIP None <none> 3306/TCP 15m
original-mall service/mysql-min-metrics ClusterIP 10.233.38.216 <none> 9104/TCP 15m
[root@s6 mysql]# kubectl get all -A | grep mysql
original-mall service/mysql-min-headless ClusterIP None <none> 3306/TCP 15m
original-mall service/mysql-min-metrics ClusterIP 10.233.38.216 <none> 9104/TCP 15m
[root@s6 mysql]# helm install mysql -n original-mall .
Error: cannot re-use a name that is still in use
[root@s6 mysql]# ll
total 144
-rw-r--r-- 1 root root 219 Nov 11 22:59 Chart.lock
drwxr-xr-x 3 root root 4096 Nov 11 22:59 charts
-rw-r--r-- 1 root root 766 Nov 11 22:59 Chart.yaml
-rw-r--r-- 1 root root 65916 Nov 11 22:59 README.md
drwxr-xr-x 4 root root 4096 Nov 11 22:59 templates
-rw-r--r-- 1 root root 5495 Nov 11 22:59 values.schema.json
-rw-r--r-- 1 root root 51994 Nov 11 22:59 values.yaml
需要整理的资源mysql Node节点公网 ip:Nodeport, root密码通过kuboard中secret查看
检查服务及数据库登录验证。
数据同步。
2.2.4.3 部署Redis
服务器上对应.
#####################kubectl create 部署redis ##################
kubectl create -f redis-config.yaml -n original-mall
kubectl create -f redis-storage.yaml -n original-mall
kubectl create -f promethues-redis-deploy.yaml -n original-mall
2.2.4.4 部署RabbitMQ
服务器上我们用helm install方式来部署,NodePort方式暴露控制台。
#####################helm 安装rabbitmq ##################
helm install rabbitmq -n original-mall .
访问信息:
- http://121.40.242.93:30584/
- 用户名:mall 密码:mall
2.2.4.5 部署Sentinel
服务器上执行。
#####################kubectl 安装sentinel ##################
kubectl create -f sentinel-deploy.yaml -n original-mall
访问地址:http://121.40.242.93:32291
2.2.4.6 部署Nacos
服务器上我们用helm install方式来部署,NodePort方式暴露控制台
#################### helm安装nacos ###########################
helm install nacos -n original-mall .
kubectl get svc -A | grep nacos
访问信息:
- http://121.40.242.93:30460/nacos
- 用户名:nacos,密码:nacos
2.2.4.7 部署ElasticSearch
#################### helm安装ES和Kibanna ###########################
cat run.sh
kubectl create secret generic elastic-certificates --from-file=elastic-certificates.p12 -n original-mall
kubectl create secret generic elastic-certificate-pem --from-file=elastic-certificate.pem -n original-mall
kubectl create secret generic elastic-credentials --from-literal=username=elastic --from-literal=password=7dgroup -n original-mall
helm repo add elastic https://helm.elastic.co
helm repo update
helm install elasticsearch-master -f es-master-values.yaml --version 7.7.1 elastic/elasticsearch -n original-mall
helm install elasticsearch-data -f es-data-values.yaml --version 7.7.1 elastic/elasticsearch -n original-mall
helm install elasticsearch-client -f es-client-values.yaml --version 7.7.1 elastic/elasticsearch -n original-mall
helm install kibana -f es-kibana-values.yaml --version 7.7.1 elastic/kibana -n original-mall
kubectl get svc -A | grep kibana
kubectl edit svc kibana-kibana -n original-mall
kubectl get svc -A | grep kibana
访问地址:http://121.40.242.93:30389/
2.2.4.8 部署Kafka
#################### helm安装kafka ###########################
helm install kafka -n original-mall .
2.2.4.9 部署Logstash
#################### kubectl安装logstash ###########################
cd logstash-kafka-to-es/
kubectl create -f logstash-cm.yaml -n original-mall
kubectl create -f logstash-conf-cm.yaml -n original-mall
kubectl create -f logstash-deploy.yaml -n original-mall
2.2.4.10 部署Skywalking
[root@s6 skywalking]# ll
total 96
-rw-r--r-- 1 root root 221 Nov 11 22:59 Chart.lock
drwxr-xr-x 2 root root 4096 Nov 11 22:59 charts
-rw-r--r-- 1 root root 1382 Nov 11 22:59 Chart.yaml
drwxr-xr-x 3 root root 4096 Nov 11 22:59 files
-rw-r--r-- 1 root root 877 Nov 11 22:59 OWNERS
-rw-r--r-- 1 root root 45984 Nov 11 22:59 README.md
drwxr-xr-x 3 root root 4096 Nov 11 22:59 templates
-rw-r--r-- 1 root root 1026 Nov 11 22:59 values-es6.yaml
-rw-r--r-- 1 root root 1026 Nov 11 22:59 values-es7.yaml
-rw-r--r-- 1 root root 1351 Nov 11 22:59 values-my-es.yaml
-rw-r--r-- 1 root root 10976 Nov 11 22:59 values.yaml
[root@s6 skywalking]# pwd
/root/mall_swarm_depoly/mall_swarm_7dgroup/skywalking/skywalking-kubernetes-master/chart/skywalking
[root@s6 skywalking]# helm install skywalking -n original-mall .
NAME: skywalking
LAST DEPLOYED: Sat Nov 12 23:25:45 2022
NAMESPACE: original-mall
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
************************************************************************
* *
* SkyWalking Helm Chart by SkyWalking Team *
* *
************************************************************************
Thank you for installing skywalking.
Your release is named skywalking.
Learn more, please visit https://skywalking.apache.org/
Get the UI URL by running these commands:
export NODE_PORT=$(kubectl get --namespace original-mall -o jsonpath="{.spec.ports[0].nodePort}" services skywalking-ui)
export NODE_IP=$(kubectl get nodes --namespace original-mall -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
[root@s6 skywalking]#
skywalking起来需要等待一会儿
2.2.5 mall-swarm商城应用部署
2.2.5.1 容器镜像打包
docker.host修改为镜像打包机器的内网IP地址(需运行docker服务端)
mvn clean package
2.2.5.2 应用服务部署
[root@s6 7d-mall-k8s]# kubectl create -f mall-auth-service.yaml -n original-mall
deployment.apps/svc-mall-auth created
service/svc-mall-auth created
[root@s6 7d-mall-k8s]# kubectl create -f mall-gateway-service.yaml -n original-mall
deployment.apps/gateway-mall-gateway created
service/gateway-mall-gateway created
[root@s6 7d-mall-k8s]# kubectl create -f mall-portal-service.yaml -n original-mall
deployment.apps/svc-mall-portal created
service/svc-mall-portal created
[root@s6 7d-mall-k8s]# kubectl create -f mall-search-service.yaml -n original-mall
deployment.apps/svc-mall-search created
service/svc-mall-search created
[root@s6 7d-mall-k8s]# kubectl create -f mall-admin-service.yaml -n original-mall
deployment.apps/svc-mall-admin created
service/svc-mall-admin created
mall-swarm商城应用部署
关键是serviceName、ClusterIP还是NodePort、Nacos配置、Command配置和数据库的数据。
2.2.6 监控系统部署(Prometheus&Influxdb&Grafana)
# 安装Prometheus、grafana等(influxdb单独部署--->视频测试influxdb已经一起安装)
cd kube-prometheus-release-0.10/manifests
kubectl create -f setup/
cd ..
kubectl create -f manifests/
kubectl create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml --dry-run -oyaml > additional-scrape-configs.yaml
kubectl create -f additional-scrape-configs.yaml -n monitoring
kubectl create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml --dry-run=client -oyaml > additional-scrape-configs.yaml
kubectl create -f additional-scrape-configs.yaml -n monitoring
kubectl get svc -n monitoring
从kuboard中进入influxdb容器,并创建jmeter数据库。
bash-4.4# show databases
bash: show: command not found
bash-4.4# influx
Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
> show databases
name: databases
name
----
_internal
> CREATE DATABASE jmeter
> show databases
name: databases
name
----
_internal
jmeter
将常用JSON模板配置导入到grafana中,也可以从原来grafana中导出。
在grafana中配置jmeter数据源。
访问地址:http://influxdb.monitoring.svc:8086
2.2.7 检查各个服务和工具的可用性
2.2.8 执行压测场景
############################ 压测机器 s5 执行 #############################
# 修改压测脚本的API网关地址和端口,已经backend listener中influxdb的端口
vim 1_home.jmx
jmeter -n -t 1_home.jmx
大功告成!!!
说明:具体操作与资料也可参考“《高楼的性能工程实战课》-我们这个课程的系统是怎么搭建起来的?
三、最后
本文详细介绍了基于微服务架构的电商系统的搭建过程,包括服务器规划、Kubernetes集群搭建和插件安装等技术细节。作者首先介绍了Kubernetes管理平台Kuboard的部署步骤,采用可视化UI管理Kubernetes集群,降低了使用门槛。接着介绍了依赖组件的安装部署,包括MySQL、Elasticsearch、JMeter等的部署方式。此外,还介绍了全局监控和微服务架构的项目介绍、源代码拉取、Nacos配置修改、镜像打包推送、数据库导入、依赖组件初始化等步骤。最后展示了运行效果,包括服务器、Kubernetes集群、微服务部署架构图和资源监控等内容。