涉及的微服务

涉及三个微服务的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=true

FROM 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=true

FROM 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镜像:
在这里插入图片描述
启动容器:

# 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 = 1

sysctl –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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/c
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of 
  https://kubernetes.io/docs/concepts/cluster-adminis

Then 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

这样node2、3也加入了k8s集群:
在这里插入图片描述

微服务部署

部署要求

三个微服务: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: 1
  selector:
    app: user-service
  template:
    metadata:
      labels:
        app: user-service
        creater: mxb
    spec:
      containers:
      - name: user-service
        image: user-service
        imagePullPolicy: IfNotPresent
        env:
          - name: EUREKA_URL
            value: http://172.19.191.135:8080/eureka
          - name: DB_HOST
            value: 172.19.191.135
        ports:
        - 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: NodePort
  ports:
  - port: 9090
    targetPort: 9090
    nodePort: 32001
  selector:
    app: user-service

拉起来

kubectl create -f springboot-user-svc.yaml

同理,部署admin:

apiVersion: v1
kind: ReplicationController #对象类型,这里是rc(全称ReplicationController
metadata:
  name: admin
spec:
  replicas: 2
  selector: 
    app: admin
  template:
    metadata:
      labels:
        app: admin
        creater: mxb
    spec:
      containers:
      - name: admin
        image: admin-service
        imagePullPolicy: IfNotPresent
        env:
          - name: EUREKA_URL
            value: http://192.168.0.104:8080/eureka
        ports:
        - containerPort: 18000

在这里插入图片描述
在这里插入图片描述
admin的service部署,编写 admin-svc.yaml:

apiVersion: v1
kind: Service #对象类型,这里是service
metadata:
  name: admin-svc
  labels:
    name: admin
spec:
  type: NodePort
  ports:
  - port: 18000
    targetPort: 18000
  selector:
    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.com
    http:
      paths:
      - backend:
          serviceName: admin-svc
          servicePort: 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访问不到。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐