目錄
前言
最近在網上看到一個名爲rancher的框架,據說可以快速搭建一個kubernetes的集羣,便決定初步學習嘗試部署一下。
爲了學習與部署方便,便在網上找了一個名爲spring-boot-cloud的開源項目,看了下spring-boot-cloud項目比較簡單但該有的功能都有,便決定將此項目部署到k8s集羣中。
同時看到spring-boot-cloud項目中用的是zipkin來做監控的,但網上都說監控項目現在流行Pinpoint或skywalking,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,歡迎關注!
共同學習共同進步!