调整结构
This commit is contained in:
25
learning/k8s-practice/spring-cloud/README copy.md
Normal file
25
learning/k8s-practice/spring-cloud/README copy.md
Normal file
@ -0,0 +1,25 @@
|
||||
# Spring Cloud on Kubernetes
|
||||
|
||||
下图是作者在 [会小二](https://www.huixiaoer.com) 工作期间设计的微服务参考架构,设计和研发 Kuboard 的初心便源于此图。Kuboard 的发布,是此参考架构最终成熟的一个重要标志。
|
||||
|
||||
Kuboard 本身是一款免费软件,作者通过向企业提供 微服务落地和实施 的咨询获得收益。服务的范围包括:
|
||||
|
||||
* 业务分析及领域建模
|
||||
* 应用架构设计、数据架构设计
|
||||
* 微服务架构设计
|
||||
* 微服务开发技术培训
|
||||
* DevOps 体系建设及培训
|
||||
|
||||
与作者取得联系时,请扫描微信二维码,并表明来意:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div>
|
||||
<script type='text/javascript' src='https://www.wjx.top/handler/jqemed.ashx?activity=43409534&width=760&source=iframe'></script>
|
||||
</div>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 449 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
49
learning/k8s-practice/spring-cloud/README.md
Normal file
49
learning/k8s-practice/spring-cloud/README.md
Normal file
@ -0,0 +1,49 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 微服务参考架构:包含微服务运行时、构建及测试、部署及运维、监控及评估。设计和研发 Kuboard 的初心便源于此 Spring Cloud 微服务参考架构。
|
||||
---
|
||||
|
||||
# Spring Cloud on Kubernetes
|
||||
|
||||
下图是作者在落地 Spring Cloud 微架构的过程中,设计了如下图所示的微服务参考架构,设计和研发 Kuboard 的初心便源于此图。历时两年时间,Kuboard终于发布,也标志着该参考架构的成熟可用。该参考架构主要包括四个重要组成部分:
|
||||
|
||||
* 微服务运行时
|
||||
* 前后端分离
|
||||
* Spring Cloud
|
||||
* 构建及测试
|
||||
* 源代码/构建管理
|
||||
* 包管理
|
||||
* 部署及运维
|
||||
* Kubernetes + Kuboard
|
||||
* 监控及评估
|
||||
* 熔断及限流
|
||||
* 链路追踪
|
||||
* 性能监控
|
||||
* 日志收集
|
||||
* APM
|
||||
|
||||
在整体架构中,微服务运行时分为如下几层:
|
||||
* 展现层
|
||||
* 网关层
|
||||
* 服务层
|
||||
* 中间件层
|
||||
|
||||
另有监控层,用于微服务运行时的监控和评估。
|
||||
|
||||
展现层、网关层、服务层、中间件层以及监控层,都运行于 Kubernetes 之上,由 Kuboard 管理。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
Spring Cloud on Kubernetes 并不对 Spring Cloud 架构、组件等做过多解释,而是将重点放在如何将 Spring Cloud 的各类型组件顺利部署到 Kubernetes 环境中。
|
||||
|
||||
为了更好地阐述此主题,作者准备了一个最简单的微服务 example 作为例子,该 example 只实现了对一张简单数据库表执行 CRUD 操作的功能,该 example 的部署架构如下图所示,源代码请参考 [kuboard-example](https://github.com/eip-work/kuboard-example),您也可以直接通过 Kuboard [导入 example 微服务](/guide/example/import.html)
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
<div>
|
||||
<script type='text/javascript' src='https://www.wjx.top/handler/jqemed.ashx?activity=43409534&width=760&source=iframe'></script>
|
||||
</div>
|
||||
135
learning/k8s-practice/spring-cloud/cloud-eureka.md
Normal file
135
learning/k8s-practice/spring-cloud/cloud-eureka.md
Normal file
@ -0,0 +1,135 @@
|
||||
---
|
||||
description: 使用 Kuboard 在 Kubernetes 上部署 spring cloud 服务注册发现组件 eureka。
|
||||
---
|
||||
|
||||
# 部署 cloud-eureka
|
||||
|
||||
本文所使用的代码请参考 [cloud-eureka](https://github.com/eip-work/kuboard-example/tree/master/cloud-eureka)
|
||||
|
||||
## 检查 cloud-eureka 项目的配置
|
||||
|
||||
**部署类型**
|
||||
|
||||
对于 cloud-eureka 项目,在部署到 Kubernetes 时,建议选择 StatefulSet 作为 Controller,因为 StatefulSet 可以为其管理的容器组提供稳定的网络标识 [StatefulSet Pod Identity](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-identity),例如,如果 StatefulSet 的名字是 cloud-eureka,副本数为 3, 则 StatefulSet 将确保如下三个容器组的按照 cloud-eureka-0,cloud-eureka-1,cloud-eureka-2 的顺序启动和运行。
|
||||
|
||||
| 容器组名字 | HOSTNAME(环境变量) | DNS name |
|
||||
| -------------- | -------------------- | --------------------------- |
|
||||
| cloud-eureka-0 | cloud-eureka-0 | cloud-eureka-0.cloud-eureka |
|
||||
| cloud-eureka-1 | cloud-eureka-1 | cloud-eureka-1.cloud-eureka |
|
||||
| cloud-eureka-2 | cloud-eureka-2 | cloud-eureka-2.cloud-eureka |
|
||||
|
||||
Eureka Server 要求将 Eureka 实例的 URL 以逗号分隔配置在 eureka.client.serviceUrl.defaultZone 字段中。请参考 [Spring Cloud Eureka Server Peer Awareness](https://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html#spring-cloud-eureka-server-peer-awareness)
|
||||
|
||||
结合 StatefulSet 的特性,在配置 eureka.client.serviceUrl.defaultZone 时,可使用如下类似的参数:
|
||||
|
||||
```yaml
|
||||
eureka.client.serviceUrl.defaultZone: http://cloud-eureka-0.cloud-eureka:9200/eureka, http://cloud-eureka-1.cloud-eureka:9200/eureka, http://cloud-eureka-2.cloud-eureka:9200/eureka
|
||||
```
|
||||
|
||||
|
||||
|
||||
**环境变量**
|
||||
|
||||
参考 cloud-eureka 项目的 [application.yaml](https://github.com/eip-work/kuboard-example/blob/master/cloud-eureka/src/main/resources/application.yml) 文件
|
||||
|
||||
``` yaml
|
||||
spring:
|
||||
application:
|
||||
name: cloud-eureka
|
||||
|
||||
server:
|
||||
port: 9200
|
||||
management:
|
||||
endpoints:
|
||||
web.exposure.include: metrics
|
||||
server:
|
||||
port: 9500
|
||||
|
||||
eureka:
|
||||
instance:
|
||||
preferIpAddress: true
|
||||
client:
|
||||
register-with-eureka: false
|
||||
fetch-registry: false
|
||||
service-url:
|
||||
defaultZone: ${CLOUD_EUREKA_DEFAULT_ZONE}
|
||||
server:
|
||||
eviction-interval-timer-in-ms: 60000
|
||||
enable-self-preservation: false
|
||||
```
|
||||
|
||||
该项目中有一个值取自环境变量:
|
||||
|
||||
* CLOUD_EUREKA_DEFAULT_ZONE 这个参数必须通过环境变量进行配置
|
||||
|
||||
建议配置的值为:
|
||||
|
||||
`http://cloud-eureka-0.cloud-eureka:9200/eureka, http://cloud-eureka-1.cloud-eureka:9200/eureka, http://cloud-eureka-2.cloud-eureka:9200/eureka`
|
||||
|
||||
因为各微服务也需要用到 CLOUD_EUREKA_DEFAULT_ZONE 这个参数(请参考 部署 svc-example 章节),所以建议将该参数配置在 Kubernetes 的 ConfigMap 中最为便捷。
|
||||
|
||||
文件中没有配置 `eureka.instance.hostname`,该参数的默认取值通过 java.net.InetAddress 查找机器的 hostname。如前所示,当我们使用 StatefulSet 部署 eureka 时,hostname 为 cloud-eureka-0 / cloud-eureka-1 / cloud-eureka-2
|
||||
|
||||
**容器 Command 参数**
|
||||
|
||||
参考 cloud-eureka 项目的 [Dockerfile](https://github.com/eip-work/kuboard-example/blob/master/cloud-eureka/Dockerfile) 文件
|
||||
|
||||
```dockerfile
|
||||
FROM eipwork/jdk:1.0.0
|
||||
|
||||
ARG JAR_FILE_NAME=cloud-eureka-0.0.1-SNAPSHOT.jar
|
||||
ARG PORT=9200
|
||||
ARG MANAGEMENT_PORT=9500
|
||||
|
||||
COPY ./target/lib /eip-work/lib
|
||||
COPY ./target/$JAR_FILE_NAME.original /eip-work/app.jar
|
||||
|
||||
ENV CLASSPATH=/eip-work/lib
|
||||
|
||||
EXPOSE $PORT
|
||||
EXPOSE $MANAGEMENT_PORT
|
||||
|
||||
WORKDIR /eip-work
|
||||
|
||||
ENTRYPOINT ["java", "-jar", "/eip-work/app.jar"]
|
||||
```
|
||||
|
||||
ENTRYPOINT 中指定了启动命令为
|
||||
|
||||
``` sh
|
||||
java -jar /eip-work/app.jar
|
||||
```
|
||||
|
||||
因此在 kubernetes 中部署该容器时,无需额外指定 Command 参数。
|
||||
|
||||
|
||||
|
||||
**访问方式及互联网入口**
|
||||
|
||||
Eureka 运行在 9200 端口。Spring Cloud 的微服务组件通过 CLOUD_EUREKA_DEFAULT_ZONE 中的配置直接与 Eureka 容器组通信。
|
||||
|
||||
是否配置访问方式及互联网入口?
|
||||
|
||||
* 如果开发者不需要查看 Eureka 的 Web 界面,则
|
||||
* 无需配置访问方式和互联网入口;
|
||||
* 如果开发者需要查看 Eureka 的 Web 界面,则
|
||||
* 配置集群内访问(Type 为 ClusterIP 的 Service)
|
||||
* 容器端口为9200
|
||||
|
||||
|
||||
|
||||
## 部署 cloud-eureka
|
||||
|
||||
**创建ConfigMap**
|
||||
|
||||
|
||||
|
||||
**创建工作负载**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 检查部署结果
|
||||
|
||||
**查看 Eureka 界面**
|
||||
90
learning/k8s-practice/spring-cloud/db-example.md
Normal file
90
learning/k8s-practice/spring-cloud/db-example.md
Normal file
@ -0,0 +1,90 @@
|
||||
---
|
||||
description: 在 Kubernetes 上部署测试数据库 mysql 的详细介绍。
|
||||
---
|
||||
|
||||
# 部署 db-example
|
||||
|
||||
本文所使用的代码请参考 [db-example](https://github.com/eip-work/kuboard-example/tree/master/db-example)
|
||||
|
||||
## 检查 db-example 项目的配置
|
||||
|
||||
**项目结构解读**
|
||||
|
||||
|
||||
|
||||
**部署类型**
|
||||
|
||||
关于 MySQL 数据库的部署,建议的做法如下:
|
||||
* 在开发环境、测试环境使用 Kuboard 部署一个副本数为 1 的 Deployment,以便可以快速复制 开发环境、测试环境
|
||||
* 在准上线环境和生产环境,使用 IaaS 服务商提供的 RDS 服务,或者自建 MySQL 主从集群,原因是:
|
||||
* 直接将 MySQL 部署到 Kubernetes 虽然简便,但是数据库的运维仍然有大量的事情需要考虑,例如数据的备份、恢复、迁移等
|
||||
* Kubernetes 管理无状态服务已经非常成熟,在管理有状态的容器例如 MySQL 时,仍然需要等待更好的解决方案。目前这方面最新的进展是 [Kubernetes Operator](http://dockone.io/article/8769)
|
||||
* 如果您想尝试部署 MySQL 集群,目前还可以参考 [Run a Replicated Stateful Application](https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/)
|
||||
|
||||
|
||||
**环境变量**
|
||||
|
||||
检查 [Dockerfile](https://github.com/eip-work/kuboard-example/blob/master/db-example/Dockerfile)
|
||||
|
||||
|
||||
``` Dockerfile
|
||||
FROM eipwork/mysql:5.7.26-1.1.11
|
||||
|
||||
LABEL maintainer="shaohq@foxmail.com"
|
||||
|
||||
#把数据库初始化数据的文件复制到工作目录下
|
||||
RUN mv /etc/my.cnf /etc/my.cnf.backup
|
||||
COPY docker/my.cnf /etc/my.cnf
|
||||
COPY docker/init_sql/*.sql /init_sql/
|
||||
|
||||
EXPOSE 3306
|
||||
EXPOSE 9104
|
||||
|
||||
ENV ENABLE_EUREKA_CLIENT=TRUE
|
||||
ENV eureka.name=db-example
|
||||
ENV eureka.port=80
|
||||
ENV eureka.management.port=9104
|
||||
ENV eureka.serviceUrl.default=http://monitor-eureka:9000/eureka
|
||||
```
|
||||
|
||||
Dockerfile 中定义了环境变量 ENABLE_EUREKA_CLIENT=TRUE,这个环境变量用于 Prometheus [监控套件](/guide/monitor/) 的服务发现。在不启用监控套件的情况下,应该将 ***ENABLE_EUREKA_CLIENT*** 这个环境变量设置为 FALSE。
|
||||
|
||||
容器镜像 eipwork/mysql:5.7.26-1.1.11 基于 [mysql/mysql-server:5.7.26](https://hub.docker.com/r/mysql/mysql-server) 制作。参考文档 [More Topics on Deploying MySQL Server with Docker](https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html#docker-environment-variables),通过设置环境变量 ***MYSQL_ROOT_PASSWORD*** ,可指定 MySQL 的root 用户密码
|
||||
|
||||
::: tip
|
||||
可以在部署时覆盖环境变量的值,无需修改 Dockerfile。
|
||||
:::
|
||||
|
||||
**容器 Command 参数**
|
||||
|
||||
容器镜像 eipwork/mysql:5.7.26-1.1.11 的 [Dockerfile](https://github.com/eip-work/eip-docker-library/blob/master/mysql/Dockerfile) 指定了容器的启动方式,此处无需为容器额外设置 Command 参数。
|
||||
|
||||
**数据卷**
|
||||
|
||||
参考文档 [More Topics on Deploying MySQL Server with Docker](https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html#docker-persisting-data-configuration),我们需要将容器内路径 `/var/lib/mysql` 映射到数据卷,以便数据能够持久化。
|
||||
|
||||
|
||||
**访问方式及互联网入口**
|
||||
|
||||
通常在两种情况下需要访问数据库:
|
||||
* 微服务程序中访问数据库
|
||||
* 开发者/运维人员通过 Navicat 等数据库工具访问数据库
|
||||
|
||||
为了同时支持这两种使用场景,建议为数据库配置 VPC内访问方式 (NodePort Service)
|
||||
|
||||
与数据库的通信为 socket,不能为其配置互联网入口 Ingress
|
||||
|
||||
|
||||
## 部署 db-example
|
||||
|
||||
**创建ConfigMap**
|
||||
|
||||
|
||||
|
||||
**创建工作负载**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 检查部署结果
|
||||
Reference in New Issue
Block a user