採用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,歡迎關注!

共同學習共同進步!

 

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