Podinfo,迷你的 Go 微服务模板
项目介绍
Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践。
它已实现的技术指标(截选自官方 README.md ):
里面每一项技术指标的实现方式,其实都可以拿出来单独讲好久,相关理论也有好多。
这里我只是讲针对这个项目,我们该如何使用 Docker 去试玩它。
构建容器调试环境
IDE
VSCode + golang/vscode-go
Go 国内加速镜像
https://learnku.com/go/wikis/38122
编写 Dockerfile.dev 文件
FROM golang:1.14
WORKDIR /workspace
# copy modules manifests
COPY go.mod go.mod
COPY go.sum go.sum
# 阿里云
RUN go env -w GO111MODULE=on
RUN go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# cache modules
RUN go mod download
RUN go get github.com/go-delve/delve/cmd/dlv
构建 Image
docker build -f Dockerfile.dev -t podinfo:dev .
编写 docker-compose.yaml
version: "3.4"
services:
golang:
image: podinfo:dev
command: >
bash -c "ls -la
&& dlv debug /workspace/cmd/podinfo --headless --log -l 0.0.0.0:2345 --api-version=2"
volumes:
- ./:/workspace
ports:
- 9898:9898
- 2345:2345
security_opt:
- "seccomp:unconfined"
配置 .vscode
的 launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote Docker",
"type": "go",
"request": "launch",
"mode": "remote",
"remotePath":"/workspace",
"port": 2345,
"host": "127.0.0.1",
"program": "${workspaceFolder}",
"args": [],
"trace" : "verbose",
"env" : {}
}
]
}
开始试玩
docker compose 一键启动
docker-compose up
Run Remote Docker
查看首页
http://localhost:9898
查看给 Prometheus 的 metrics
API
http://localhost:9898/metrics
下断点,发请求调试
curl http://localhost:9898/api/info
Helm Charts
Podinfo/Charts
https://github.com/stefanprodan/podinfo/tree/master/charts/podinfo
因为 Podinfo 是一个云原生项目,所以它的 Helm Charts 的编写还是值得借鉴和学习的。
当然这里需要你有一些 K8S 的经验。
Helm 安装 Podinfo
$ helm repo add podinfo https://stefanprodan.github.io/podinfo
$ helm upgrade -i my-release podinfo/podinfo
Helm 卸载 Podinfo
$ helm delete my-release
看配置,了解 PodInfo 是如何上云的?
非常值得借鉴
参数 | 默认值 | 描述 |
---|---|---|
replicaCount |
1 |
期望的 K8S Pods(也就是代码在集群中部署几个实例) |
logLevel |
info |
日志级别:
or |
backend |
None |
需要调用的后端或者是第三方的 URL(如 Java 后端) |
backends |
[] |
需要调用的后端或者是第三方的 URLs(如 Java 后端) |
cache |
None |
Redis 地址 <host>:<port> |
redis.enabled |
false |
是否开启 Redis 缓存 |
ui.color |
#34577c |
UI 颜色 |
ui.message |
None |
UI 问候消息 |
ui.logo |
None |
UI logo |
faults.delay |
false |
随机 HTTP 响应延迟 0 到 5 秒 |
faults.error |
false |
1/3 概率的随机 HTTP 响应错误 |
faults.unhealthy |
false |
设置后,永远不会达到健康状态 |
faults.unready |
false |
当设置时,永远不会达到就绪状态 |
faults.testFail |
false |
当设置时,helm 测试总是失败 |
faults.testTimeout |
false |
当设置时,helm 测试总是包括超时 |
h2c.enabled |
false |
允许升级到 h2c |
image.repository |
stefanprodan/podinfo |
镜像库(地址) |
image.tag |
<VERSION> |
镜像 tag |
image.pullPolicy |
IfNotPresent |
Image 拉取策略 |
service.enabled |
true |
创建 Kubernetes 服务,使用 Flagger 时应禁用 |
service.type |
ClusterIP |
Kubernetes Service 类型 |
service.metricsPort |
9797 |
Prometheus 指标端点端口 |
service.httpPort |
9898 |
Container HTTP 端口 |
service.externalPort |
9898 |
ClusterIP HTTP 端口 |
service.grpcPort |
9999 |
ClusterIP gPRC 端口 |
service.grpcService |
podinfo |
gPRC service 名称 |
service.nodePort |
31198 |
HTTP 端点的 NodePort |
hpa.enabled |
false |
启用 Kubernetes HPA (Pod 水平自动伸缩) |
hpa.maxReplicas |
10 |
Pods 最大数量 |
hpa.cpu |
None |
每个 Pod 的目标CPU使用率 |
hpa.memory |
None |
每个 Pod 的目标内存使用量 |
hpa.requests |
None |
每个 Pod 每秒目标 HTTP 请求 |
serviceAccount.enabled |
false |
是否应创建 service account |
serviceAccount.name |
None |
要使用的 service account 的名称,如果未设置且 enabled 为true,则使用 fullname 生成名称 |
linkerd.profile.enabled |
false |
创建 Linkerd 服务配置文件 |
serviceMonitor.enabled |
false |
是否应创建 Prometheus Operator 服务监视器 |
serviceMonitor.interval |
15s |
Prometheus 抓取间隔 |
ingress.enabled |
false |
启用 Ingress |
ingress.annotations |
{} |
Ingress 注解 |
ingress.path |
/* |
Ingress 路径 |
ingress.hosts |
[] |
Ingress 接受的 hosts |
ingress.tls |
[] |
Ingress TLS 配置 |
resources.requests.cpu |
1m |
Pod CPU 请求 |
resources.requests.memory |
16Mi |
Pod 内存 请求 |
resources.limits.cpu |
None |
Pod CPU 限制 |
resources.limits.memory |
None |
Pod memory 限制 |
nodeSelector |
{} |
Pod 分配的集群节点标签(说白了就是固定部署到你指定的机器) |
tolerations |
[] |
可容忍的节点污点列表 |
affinity |
None |
Node/pod 亲和力 |
podAnnotations |
{} |
Pod 注解 |
Refs
笔者修改过的 Podinfo 项目地址
https://github.com/Hacker-Linner/podinfo
官方 Podinfo
https://github.com/stefanprodan/podinfo
Podinfo,迷你的 Go 微服务模板的更多相关文章
- 通用 spring cloud 微服务模板
说明文档 功能 1. 基于映射数据库一键生成 spring cloud 微服务 2. 通用 Controller ,无需编写代码即可完成基于数据库的服务 3. 动态多条件 CRUD + 分页 使用说明 ...
- 一起学习 微服务(MicroServices)-笔记
笔记 微服务特性: 1. 小 专注与做一件事(适合团队就是最好的) 2. 松耦合 独立部署 3. 进程独立 4. 轻量级通信机制 实践: 1. 微服务周边的一系列基础建设 Load Balancing ...
- 微服务时代之自定义archetype(模板/骨架/脚手架)
1. 场景描述 (1)随着微服务越来越常见,一个大的项目会被拆分成多个小的微服务,jar包以及jar之间的版本冲突问题,变得越来越常见,如何保持整体微服务群jar及版本统一,也变成更加重要了,mave ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_17-页面静态化-模板管理-GridFS研究-存文件
将模板信息保存在cms_template里面 存储在fs.chunks这个集合中.这个集合里面存的是分块文件. fs.files存的是文件的基本信息 chunks存的是块信息 创建测试文件 在cms的 ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_16-页面静态化-模板管理-模板制作
这是轮播图的原始文件 运行门户需要把 nginx启动起来 单独运行轮播图.把里面的css的引用都加上网址的url 这就是单独访问到的轮播图的效果 轮播图模板的地址: 阶段5 3.微服务项目[学成在线] ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_18-页面静态化-模板管理-GridFS研究-取文件
需要创建mongoDB的配置类1 配置类里面主要创建.GridFSBucket这个对象.这个对象的作用就是用来打开一个下载流 在cms的微服务下,在config下创建MongoConfig.这个时候就 ...
- 微服务实战(六):选择微服务部署策略 - DockOne.io
原文:微服务实战(六):选择微服务部署策略 - DockOne.io [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同 ...
- Kubernetes 微服务最佳实践
本文由个人笔记 ryan4yin/knowledge 整理而来 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes 配置」,是我个人的「最佳实践」. 其中大部 ...
- 在 Kubernetes 容器集群,微服务项目最佳实践
转载自:https://mp.weixin.qq.com/s/WYu3gDwKKf06f_FYbO9YRg 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes ...
随机推荐
- fMRI数据分析学习笔记——常用工具
背景 在学习fMRI数据处理的过程中,通过其他的资料看到了别人推荐的有用的fMRI数据处理软件和小插件,在此记录一下,以便后期慢慢学习使用. 1.NeuroImaging Analysis Kit ( ...
- 利用Java Flight Recorder(JFR)诊断timing及内存问题
Java Flight Recorder(JFR), 以下简称JFR,请注意这个只有Oracle JDK 1.7(7u40)或以上版本才有, OpenJDK木有这东西. 启用: Java命令行启动参数 ...
- wordpress 后台富文本编辑器,添加图片发现无法左对齐,样式出现混乱
如上图所示,无法左对齐,但是左对齐的按钮全部是正确的,最后一点点排除,发现是因为这个词的影响,去掉就好了,原因不明,可能是这个词被当做某个方法执行了
- Spring Cloud OpenFeign的原理(六)
通过上篇我们了解OpenFeign他也可以完成远程通信,但是它并不是真正义意上的RPC通信,因为他是通过封装代理来实现的,下面和以前一样,知道了怎么用就来看下他是怎么实现的. 一.思考Feign要做的 ...
- 精尽Spring MVC源码分析 - HandlerExceptionResolver 组件
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- FFmpeg 初级使用
ffmpeg来处理多种媒体文件,对帧进行操作的时候非常的复杂,下面介绍下使用FFmpeg对视频文件的操作. 1,安装 windows安装ffmpeg: 下载ffmpeg文件解压文件到c盘配置环境变量C ...
- Git常用命令大全,迅速提升你的Git水平
原博文 https://mp.weixin.qq.com/s/hYjGyIdLK3UCEVF0lRYRCg 示例 初始化本地git仓库(创建新仓库) git init ...
- AutoMapper的源码分析
最近有一个小项目需要提供接口给第三方使用,接口会得到一个大的XML的字符串大约有8个对象100多个字段,在映射到Entity只能通过反射来赋值避免重复的赋值,但是明显感觉到性能下降严重,因为以前接触过 ...
- ConcurrentHashMap线程安全吗?
前言 没啥深入实践的理论系同学,在使用并发工具时,总是认为把HashMap改为ConcurrentHashMap,就完美解决并发了呀.或者使用写时复制的CopyOnWriteArrayList,性能更 ...
- 自定义 demo 集合
各种写着玩的自定义控件demo 有时网上看到一些比较有意思的开源项目,有时间的话就会自己也撸一个出来,但是一般只关注实现样式.动画等,不会太去细致完整地完成,俗称占个坑~ 持续更新中... githu ...