涉及的微服务
涉及三个微服务的demo:
- 服务注册与发现:eureka-server
- 管理服务:admin-service
- 用户服务:user-service
管理服务和用户服务会注册到eureka上,当访问 Admin 服务的 add user api,Admin 服务会调用 User 服务的 add user api,写入到 mysql数据库上。
生成docker镜像
通过dockerfile构建maven项目。在Docker 17.05多阶段构建推出之后,我们只需要维护一个Dockerfile文件即可,具体的文件内容如下。
创建Dockerfile文件:
User-service/Dockerfile:
# 第一阶段构建环境
FROM maven:3.5.0-jdk-8-alpine AS builder
# 添加pom.xml和源代码
ADD ./pom.xml pom.xml
ADD ./src src/
# 跳过测试
RUN mvn package -Dmaven.test.skip=true# 第二阶段,基础镜像是openjdk
FROM openjdk:8u232-jre-stretch
# 第一阶段的jar,copy过来
COPY --from=builder ./target/user-service.jar /app/user-service.jar
ADD runboot.sh /app/
WORKDIR /app
RUN chmod a+x runboot.sh
# run jar
CMD /app/runboot.sh
Eureka-server/Dockerfile:
FROM maven:3.5.0-jdk-8-alpine AS builder
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn package -Dmaven.test.skip=trueFROM openjdk:8u232-jre-stretch
COPY --from=builder ./target/eureka-server.jar /app/eureka-server.jar
ADD runboot.sh /app/
WORKDIR /app
RUN chmod a+x runboot.sh
CMD /app/runboot.sh
admin-server/Dockerfile:
FROM maven:3.5.0-jdk-8-alpine AS builder
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn package -Dmaven.test.skip=trueFROM openjdk:8u232-jre-stretch
COPY --from=builder ./target/admin-service.jar /app/admin-service.jar
ADD runboot.sh /app/
WORKDIR /app
RUN chmod a+x runboot.sh
CMD /app/runboot.sh
这样就完成出了三个DockerFile。
下面构建docker image,以进入Eureka-server/Dockerfile为例,先进入文件目录,执行
docker build -t eureka-server .
# docker run --name [容器名] -p [虚拟机端口:对外暴露端口] [镜像名]
docker run --name eureka -p 8080:8080 eureka-server
在浏览器输入http://localhost:8080/,可以看到eureka控制台:
相同的步骤运行admin-service。admin-service需要提供一个运行参数EURKA_URL
# --env [变量=xx]
docker run --name admin --env EUREKA_URL=http://host.docker.internal:8080/eureka -p 18000:18000 admin-service
user-service需要配置数据库,数据库信息在application.properties中是通过运行参数获得:
docker run --name user --env DB_HOST=host.docker.internal --env EUREKA_URL=http://host.docker.internal:8080/eureka -p 9090:9090 user-service
最终admin和user的服务被发现和注册:
下面是简单测试:
按照格式发送一个POST请求:
运行结果:
数据库中:
k8s环境搭建
环境准备
本地开了三台虚拟机,用来部署k8s服务,操作系统为CentOS7
192.168.80.10 node1 2核 3GB内存
192.168.80.11 node2 1核 2GB内存
192.168.80.12 node3 1核 2GB内存
物理机172.19.191.135
k8s服务安装
同步时钟
# 三台上设置时区
timedatectl set-timezone Asia/Shanghai
关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
配置仓库并安装docker
# 配置Docker的稳定版本仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker CE
yum -y install docker-ce-18.06.1.ce-3.el7
启动docker
# 启动docker
systemctl enable docker && systemctl start docker
docker版本如下
配置docker镜像源,把docker更改驱动为systemtd:
Vim /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io","https://registry.docker-cn.com","https://zeco842d.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"]
}
安装k8s三大组件,版本是1.14的(不是最新的)。
yum install -y kubelet-1.14.3 kubeadm-1.14.3 kubectl-1.14.3
配置网络
/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1sysctl –system
部署master节点(单机版)
将192.168.80.10(node1)作为master。
生成 kubeadm 默认初始化模板:
kubeadm config print init-defaults > kubeadm-config.yaml
修改kubeadm-config.yaml 中advertiseAddress为当前节点的ip地址:
修改阿里源
拉取源:
kubeadm config images pull --config kubeadm-config.yaml
如果master的CPU不是双核或以上此处会报错[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2。
单机版运行起来了:
输出这里给出了一串命令,在其他node上执行可以加入k8s集群:
To start using your cluster, you need to run the follr:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/csudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of https://kubernetes.io/docs/concepts/cluster-adminisThen you can join any number of worker nodes by runnich as root:kubeadm join 192.168.80.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9584a0d8bcac4a4e3a14782b6bf751f31bf4e3621c65ec41d7295f979acd3ea7
查看当前节点信息
kubectl get node
可以看到状态为NotReady,再等一会才能Ready。
集群配置
按照输出的提示执行即可。
在master上:
# master上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
master部署通信组件calico
# master上执行
kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
接下来让其他node也加入,在其他node上执行
# node2,3执行
kubeadm join 192.168.80.10:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:9584a0d8bcac4a4e3a14782b6bf751f31bf4e3621c65ec41d7295f979acd3ea7
微服务部署
部署要求
三个微服务:Admin Service 、User Service、Eruka Service
当访问 Admin 服务的 add user api,Admin 服务会调用 User 服务的 add user api,写入到 mysql数据库
Admin Service 有两个副本,一个 svc 地址
User Service 一个副本
可以用 ingress 访问 Admin Service
可以用 nodeport访问 User Service
编排文件与部署
在物理机docker上开启eruka服务和mysql。
mysql在3306端口
编写yaml文件
springboot-user.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: user-service
spec:replicas: 1selector:app: user-servicetemplate:metadata:labels:app: user-servicecreater: mxbspec:containers:- name: user-serviceimage: user-serviceimagePullPolicy: IfNotPresentenv:- name: EUREKA_URLvalue: http://172.19.191.135:8080/eureka- name: DB_HOSTvalue: 172.19.191.135ports:- containerPort: 9090
运行:
kubectl create -f springboot-user.yaml
可以通过kubectl describe pod xx查看pod情况
通过kubectl logs xxx查看日志
在eureka控制台上可以看到微服务信息:
这样user服务就拉起来了,接下来配置service
springboot-user-svc.yaml:
apiVersion: v1
kind: Service #对象类型,这里是service
metadata:name: user-service #名称labels:name: user #标注
spec:type: NodePortports:- port: 9090targetPort: 9090nodePort: 32001selector:app: user-service
拉起来
kubectl create -f springboot-user-svc.yaml
同理,部署admin:
apiVersion: v1
kind: ReplicationController #对象类型,这里是rc(全称ReplicationController
metadata:name: admin
spec:replicas: 2selector: app: admintemplate:metadata:labels:app: admincreater: mxbspec:containers:- name: adminimage: admin-serviceimagePullPolicy: IfNotPresentenv:- name: EUREKA_URLvalue: http://192.168.0.104:8080/eurekaports:- containerPort: 18000
admin的service部署,编写 admin-svc.yaml:
apiVersion: v1
kind: Service #对象类型,这里是service
metadata:name: admin-svclabels:name: admin
spec:type: NodePortports:- port: 18000targetPort: 18000selector:app: admin
运行:
kubectl create -f admin-svc.yaml
由于需要ingress访问,编写admin-ingress.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: admin-http
spec:rules:- host: test.mxb.comhttp:paths:- backend:serviceName: admin-svcservicePort: 18000
运行:
kubectl create -f admin-ingress.yaml
接下来就来进行验证:
首先是验证用 nodeport访问 User Service。
首先看一下User Service被部署在了哪个node上:
kubectl describe pods user-wgk5s
可以看到被部署在了node3/192.168.80.12上
发送POST请求,返回:
通过nodeport正常访问。
需要通过ingress 访问 Admin Service:
物理机配置hosts,然后通过POST http://test.mxb.com:32054/user调用服务:
20211207:暂时没跑出来,eureka上ip是错的,500访问不到。