本系列文章目录
- (一)基础k8s yaml脚本发布
- (二)helm+shell脚本优化大量冗余配置发布
- (三)jenkins用户审核的流水化方式部署
- (四)service mesh(istio)服务网格化发布
- (五)istio对项目进行金丝雀部署
目录
前言
最近在网上看到一个名为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="761396462@qq.com"
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,欢迎关注!
共同学习共同进步!