涉及的微服务

涉及三个微服务的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镜像:

启动容器:

# 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

这样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: 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访问不到。

k8s平台微服务部署相关推荐

  1. iUAP云运维平台v3.0全面支持基于K8s的微服务架构

    什么是微服务架构? 微服务(MicroServices)架构是当前互联网业界的一个技术热点,业内各公司也都纷纷开展微服务化体系建设.微服务架构的本质,是用一些功能比较明确.业务比较精练的服务去解决更大 ...

  2. 基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  3. 微服务开发及部署_基于 Kubernetes 的微服务部署即代码

    在基于 Kubernetes 的基础设施即代码一文中,我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的,以及它的 ...

  4. 微服务实战(六):选择微服务部署策略

    http://dockone.io/article/1066 微服务实战(六):选择微服务部署策略 [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺 ...

  5. Java生鲜电商平台-微服务架构概述

    Java生鲜电商平台-微服务架构概述 单体架构存在的问题 在传统的软件技术架构系统中,基本上将业务功能集中在单一应用内,或者是单一进程中.尽管现代化的软件架构理论以及设计原则已推广多年,但实际技术衍化 ...

  6. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在"强大"的JSP上面,那时候S ...

  7. 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

    介绍 本文的目的是:通过使用 DockerHub 和 Azure Kubernetes Service (AKS) 将之前 使用 .NET 和 Docker 构建的微服务 部署到微软 Azure 云上 ...

  8. 基于Spring Cloud及K8S构建微服务应用

    摘要 广发证券蔡波斯先生通过三个大方向来为我们分享基于Spring Cloud及K8S构建微服务应用. 内容来源:2017年6月10日,广发证券蔡波斯在"Spring Cloud中国社区技术 ...

  9. (转)微服务架构 互联网保险O2O平台微服务架构设计

    http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也 ...

最新文章

  1. ssh-copy-id不生效问题
  2. OpenShift Express:部署Java EE应用程序(支持AS7)
  3. 中兴通讯 基于定位的技术和市场分析
  4. linux常用命令(4)
  5. 第十一届蓝桥杯省赛C++组试题 第3题 求阴影面积
  6. java ibatis 获取执行的sql_阿里Java技术面开源框架面试真题曝光,这些真题你能答对多少?...
  7. 自学编程的八大误区!克服它们,豁然开朗!
  8. java输入两个整数_Java中从键盘输入多个整数的方法
  9. 【转】Swig 使用指南
  10. Python模块——xml
  11. s3c2440的pwm输出
  12. SECS/GEM EAP介绍
  13. 积木机器人拼装图恐龙图纸_‎App Store: 机器人积木模型--恐龙积木拼装对战游戏...
  14. 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)
  15. 分享20个无版权的高清无码图库站
  16. VC6.0补丁Vs6sp6安装方法
  17. Android平台单独编译内核模块ko insmod
  18. 前端常见问题和技术解决方案
  19. 人而无梦 不知其可矣
  20. 对话任正非:华为是一家全球化公司

热门文章

  1. 使用哈希表统计数组中数字出现的次数
  2. 武音官网服务器不稳定,@所有武音er | 恭喜你获得一张教育网WiFi“国际通行证”...
  3. 区块链分布式存储提升数据可靠性安全性
  4. 达梦数据库初始化实例参数说明(页大小 (page_size)、簇大小 (extent_size)、大小写敏感 (case_sensitive)、字符集 (charset))
  5. js实现网页漂浮广告
  6. php报错 Function name must be a string in xxxx解决
  7. 14.4 手机号码归属地查询
  8. Redis 实战篇:GEO 助我邂逅附近女神
  9. 【每日一个GitHub项目】GitHub中文排行榜
  10. 10个WordPress电商产品页面扩展功能