采用rancher2+kubernetes+skywalking部署springcloud项目(一[k8s yaml版本])

目录

 

前言

部署环境

网络和软件准备

安装ifconfig

关闭防火墙

关闭selinux

开启支持ipvs

修改host

修改hostname

docker安装

rancher安装

添加k8s节点

安装kubectl

spring-boot-cloud项目部署

安装rabbitmq

spring-boot-cloud项目打包

maven打包

docker打包并推送到仓库

skywalking部署

skywalking-oap-server

skywalking-ui

skywalking-agent

通过yaml部署spring-boot-cloud项目

接口测试一下

zipkin与skywalking对比

zipkin拓扑图界面 

skywalking拓扑图界面


前言

最近在网上看到一个名为rancher的框架,据说可以快速搭建一个kubernetes的集群,便决定初步学习尝试部署一下。

为了学习与部署方便,便在网上找了一个名为spring-boot-cloud的开源项目,看了下spring-boot-cloud项目比较简单但该有的功能都有,便决定将此项目部署到k8s集群中。

同时看到spring-boot-cloud项目中用的是zipkin来做监控的,但网上都说监控项目现在流行Pinpointskywalking,skywalking是用java来写的,同时性能也算是很强的,为了后面的理解方便,决定将skywalking加入到spring-boot-cloud项目中一起部署一下同时也能与zipkin作一个对比。


部署环境

vm,机器上装3台minimal版的centos7

网络和软件准备

三台centos同时操作,共同搭建好网络环境

安装ifconfig

这个步骤可以跳过,因习惯性的用ifconfig,所以就把这个安上把

找到网卡名称

 ip addr

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

ONBOOT修改为yes

然后重启网络

service network restart

yum provides ifconfig

再安装网络工具

yum install net-tools

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux

sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0 //令配置立即生效

开启支持ipvs

kube-proxy默认需要有iptables,个人感觉不想再去安装iptables了,就打算让kube-proxy用ipvs来工作

要启用ipvs,必须启用转发功能

cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sysctl -p

永久支持ipvs

yum -y install ipvsadm  ipset

# 临时生效
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

# 永久生效
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4"
for kernel_module in \${ipvs_modules}; do
    /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        /sbin/modprobe \${kernel_module}
    fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

修改host

IP serverName
192.168.85.130 rancher-server
192.168.85.131 k8s-node1
192.168.85.132 k8s-node2
192.168.85.130 rancher-server
192.168.85.131 k8s-node1
192.168.85.132 k8s-node2

主机名和ip根据自己情况设置即可,/etc/hosts

修改hostname

hostnamectl set-hostname rancher-server

查看hostname

hostname

docker安装

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 docker-ce-18.06.3.ce
systemctl start docker

配置docker国内的加速器,我这里用阿里云的

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://youraddr.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

rancher安装

在rancher-server主机上先将rancher镜像拉取下来,我这里拉取最新的镜像,当前拉下来的是V2.4.2版本

同时创建两个存放rancher数据的目录

docker pull rancher/rancher
mkdir -p /docker_volume/rancher_home/rancher
mkdir -p /docker_volume/rancher_home/auditlog

运行rancher镜像随后启动rancher,暴露出80和443端口

docker run -d --restart=unless-stopped -p 80:80 -p 443:443 \
-v /docker_volume/rancher_home/rancher:/var/lib/rancher \
-v /docker_volume/rancher_home/auditlog:/var/log/auditlog \
--name rancher rancher/rancher

然后过一下下,访问rancher-server主机的https就可以进入到rancher了

默认情况下直接登录rancher就可以了

然后后面的操作就比较简单了,根据界面的提示,点把点把然后就可以创建一个kubernetes的集群了。

需要注意的一点是,我们这里希望kube-proxy的采用ipvs的工作方式来进行工作,所以在创建kubernetes集群时要将kube-proxy的设置设为ipvs,也就是下图圈起来的部分

 

添加k8s节点

还有就是,在创建k8s的节点时要注意,如果集群中只有一个节点的话,需要将k8s的3个选项都要选中,也就是Etcd、Control、Worker,还有就是最好设置节点名称

然后将界面中生成的命令在对应的机器上执行即可

待所有节点加入后,就可以看到k8s集中的状态了

到这里,kubernetes的集群的环境就搭建完毕了

安装kubectl

为了方便,再在k8s-node1节点上安装一个kubectl吧

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubectl

再将rancher界面中k8s集群首页的kubeconfig复制到kubectl的主机上就可以了

vi ~/.kube/config

然后运行下kubectl验证下

[root@localhost ~]# kubectl get namespaces
NAME              STATUS   AGE
cattle-system     Active   9d
default           Active   9d
ingress-nginx     Active   9d
kube-node-lease   Active   9d
kube-public       Active   9d
kube-system       Active   9d
my-space          Active   8d
security-scan     Active   9d
[root@localhost ~]# 

spring-boot-cloud项目部署

 

对于此开源项目这里就不再介绍了,如想深入了解到,直接看spring-boot-cloud的开源地址即可,当然为了这里部署方便我也将其fork了一份到我的github中,地址为:https://github.com/puhaiyang/spring-boot-cloud

其原项目地址为:https://github.com/zhangxd1989/spring-boot-cloud,如果访问github比慢,也可以访问gitee的地址:https://gitee.com/zhangxd/spring-boot-cloud

安装rabbitmq

因为spring-boot-cloud是用rabbitmq来实现的,所以我们要先安装一个rabbitmq在k8s中

#-------------定义RabbitMQ部署-----------------
apiVersion: apps/v1
kind: Deployment
metadata:
 name: rabbit
spec:
 replicas: 1
 selector:
   matchLabels:
     app: rabbit
 strategy:
   rollingUpdate:
     maxSurge: 25%
     maxUnavailable: 25%
   type: RollingUpdate
 template:
   metadata:
     labels:
       app: rabbit
   spec:
     containers:
     - image: /rabbitmq:latest
       imagePullPolicy: IfNotPresent
       name: rabbit
       ports:
       - containerPort: 15672
         name: rabbit15672
         protocol: TCP
       - containerPort: 5672 
         name: rabbit5672 
         protocol: TCP
---
#-----------------定义rabbit的代理服务,serviceName一定要和代码中的一致-----------
apiVersion: v1
kind: Service
metadata:
 name: rabbitmq
spec:
 ports:
 - name: rabbit32672
   nodePort: 32672
   port: 15672
   protocol: TCP
   targetPort: 15672
 - name: rabbit30672 
   nodePort: 30672 
   port: 5672 
   protocol: TCP 
   targetPort: 5672
 selector:
   app: rabbit
 type: NodePort

同时为了测试方便,再暴露出nodePort端口出来,这样k8s外部环境也就可以访问了

待执行完上面的安装yaml后,访问下k8s任意节点的32672端口就可以打开rabbitmq的后台管理界面了,user/bitnami为默认登录用户名和密码

spring-boot-cloud项目打包

maven打包

package -Dmaven.test.skip=true -f pom.xml

找到root项目,跳过测试直接进行整体项目打包即可

docker打包并推送到仓库

docker插件进行build镜像并推送到远程docker仓库

原项目也有一个docker打包插件,但我感觉那个版本的有点老,我这里将原项目的docker打包插件换为io.fabric8的:

                    <groupId>io.fabric8</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.33.0</version>

具体的直接看https://github.com/puhaiyang/spring-boot-cloud/blob/master/pom.xml

当然,在打包前记得修改下dockerfile,不修改也可以,不过为了加入skywalking还是得修改下

FROM java:8
VOLUME /tmp
ADD ./target/svcb-service.jar /app.jar
RUN bash -c 'touch /app.jar'
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime && echo Asia/Shanghai > /etc/timezone
EXPOSE 8070
ENTRYPOINT ["java","-Dapp.id=svcbService","-javaagent:/opt/skywalking/agent/skywalking-agent.jar","-Dskywalking.agent.service_name=svcbService","-Dskywalking.collector.backend_service=skywalking-oap-server:11800","-jar","-Djava.security.egd=file:/dev/./urandom","/app.jar"]

如svcb项目的,我将其中的运行时区修改为了上海时间,同时加到了skywalking的agent启动参数配置

待修改好了,直接运行docker build和docker push就能将这个镜像上传到镜像仓库了

如果大家觉得打包麻烦,也可以直接用我打好了的包,我把它们放在腾讯云的公开仓库中的

然后每个服务都是执行一样的命令,最后编写一个k8s的yaml版本的部署脚本就可以了,我编写的在这里:https://github.com/puhaiyang/spring-boot-cloud/blob/master/k8s.yaml

然后就可以直接运行了,它就可以将spring-boot-cloud的项目除了skywalking就都能跑起来了

然后再附上一个在docker里安装telnet工具的脚本:

mv /etc/apt/sources.list /etc/apt/sources.list.bak && echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list && echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list && echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list && echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
apt-get update
apt-get install telnet -y
apt-get install net-tools -y

skywalking部署

skywalking-oap-server

apiVersion: apps/v1
kind: Deployment
metadata:
 name: skywalking-oap-server
spec:
 replicas: 1
 selector:
   matchLabels:
     app: skywalking-oap-server
 template:
   metadata:
     labels:
       app: skywalking-oap-server
   spec:
     containers:
     - image: apache/skywalking-oap-server:latest
       imagePullPolicy: IfNotPresent
       name: skywalking-oap-server
       ports:
        - containerPort: 11800
          name: grpc
        - containerPort: 12800
          name: rest
---
#-----------------定义skywalking的代理服务--------------
apiVersion: v1
kind: Service
metadata:
 name: skywalking-oap-server
spec:
 ports:
 - name: grpcporst
   nodePort: 31800
   port: 11800
   protocol: TCP
   targetPort: 11800
 - name: restport
   nodePort: 32100
   port: 12800
   protocol: TCP 
   targetPort: 12800
 selector:
   app: skywalking-oap-server
 type: NodePort

skywalking-ui

apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-ui
  labels:
    app: skywalking-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-ui
  template:
    metadata:
      labels:
        app: skywalking-ui
    spec:
      containers:
      - name: skywalking-ui
        image: apache/skywalking-ui:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: httpport
        env:
        - name: SW_OAP_ADDRESS
          value: skywalking-oap-server:12800
---
#-----------------定义skywalking-ui的代理服务--------------
apiVersion: v1
kind: Service
metadata:
  name: skywalking-ui
  labels:
    service: skywalking-ui
spec:
  ports:
  - port: 8080
    name: httpport
    targetPort: 8080
  type: ClusterIP
  selector:
    app: skywalking-ui
---
#-----------------定义skywalking-ui的ingress--------------
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: skywalking-ui
spec:
  rules:
    - host: skywalking-ui.springcloud.com
      http:
        paths:
          - backend:
              serviceName: skywalking-ui
              servicePort: 8080

skywalking-agent

自建,参考https://hub.docker.com/r/prophet/skywalking-agent。

编写一个Dockerfile:

FROM alpine:3.8

LABEL maintainer="[email protected]"

ENV SKYWALKING_VERSION=7.0.0

ADD http://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/${SKYWALKING_VERSION}/apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz /

RUN tar -zxvf /apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz && \
    mv apache-skywalking-apm-bin skywalking && \
    mv /skywalking/agent/optional-plugins/apm-trace-ignore-plugin* /skywalking/agent/plugins/ && \
    echo -e "\n# Ignore Path" >> /skywalking/agent/config/agent.config && \
    echo "# see https://github.com/apache/skywalking/blob/v7.0.0/docs/en/setup/service-agent/java-agent/agent-optional-plugins/trace-ignore-plugin.md" >> /skywalking/agent/config/agent.config && \
    echo 'trace.ignore_path=${SW_IGNORE_PATH:/health}' >> /skywalking/agent/config/agent.config

docker build -t ccr.ccs.tencentyun.com/haiyang/skywalking-agent:7.0.0 .

待docker build完毕后,push到仓库就可以了

如果大家觉得打包麻烦的话,也可以直接用我build好的镜像:

ccr.ccs.tencentyun.com/haiyang/skywalking-agent:7.0.0

docker push ccr.ccs.tencentyun.com/haiyang/skywalking-agent:7.0.0

当然,push到仓库前记得要先登录,比如我这里的:

sudo docker login --username=puhaiyang ccr.ccs.tencentyun.com

然后到这里,skywalking的准备工作就完毕了

通过yaml部署spring-boot-cloud项目

直接将https://github.com/puhaiyang/spring-boot-cloud/blob/master/k8s.yaml中的yaml运行就好了,可以在界面上操作,也可以在kubectl中apply也可以

 

接口测试一下

这里用postman测试下spring-boot-cloud中有的接口,同时也为zipkin和skywalking做数据准备

为了更真实一点,我这里用swtichHosts配一下假域名

先看下注册中心,因为配了ingress,在配好了host后直接访问http://registry.springcloud.com/就可以了:

通过界面可以看到所有服务都起动好了,也注册好了

然后再在postman中请求下对应的接口:

能访问通,ok!

zipkin与skywalking对比

zipkin拓扑图界面 

skywalking拓扑图界面

其它界面:

不得不说,难怪用zipkin的用户那么少,再对比下skywalking,无论是界面还是采集的数据维度来说差距还是很明显的


对于spring-boot-cloud项目采用rancher+kubernetes+skywalking的部署演示就到这里,其部署脚本和项目代码都可以通过我的github地址找到,https://github.com/puhaiyang/spring-boot-cloud,欢迎关注!

共同学习共同进步!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章