王路 12 highlights
同样一潭池水,天人视之为清波,饿鬼视之为阳焰。所有的看法,无非是一个人的世界观投在故事上的倒影,它
就常有这样的经验。比如碰见好久不见的老友,事前特别期待,想到有很多话可以聊,等坐到桌上,却发现只剩下老生常谈。这怪不得谁,每个人的生活都不一样,各自感兴趣的事儿都不同。不像以往,大家都在同一个班里,每天的生活都是类似的,所思所想也都差不了太远。
要想在一个圈子里得到认同,需要遵照这个圈子的价值标准和话语体系。
很久之后,我才慢慢明白自己当初的做法多么愚蠢。想要一个人改变习惯,很难。而尤其不应该的是,总把自己以为便利的东西强加给别人。年龄和岁月足以让一个人的学习能力慢慢退化,并最终丧失对新事物的好奇。从头掌握最基本的技能,对不年轻的人来说,成本太高昂。他们需要为养家糊口奔波,为时不多的暇余,并不足以支撑他们疲惫的身心去探究世界的种种新奇。于是,他们就远远被时代抛下了。
圣诞老人的意思就是:在你爱的人不知道的时候,把礼物放到他的身边。因为收到礼物的人不知道,所以这个夜晚是寂静的。
许多东西,只在此时、此地、此景有。没办法绸缪,也没办法复盘。可贵的事物之所以可贵,正在其转瞬即逝,不可复得。在一刹那灭去,并成为永恒。
屏蔽掉一个人,看不到他的样子,听不到他的声音,却抑制不了不去想他。世间的痛苦和烦恼,不在于不能得到,而在于不能割舍。不在于不想屏蔽的东西被屏蔽,而在于想屏蔽的东西无法屏蔽
对于贪著心,真正可怕的不是一件事情上的得失,而是串习的力量对一个人行为举止的巨大影响。这种影响是潜在的,却是深刻而难以磨灭的。
三涂之苦
编程谓之 Class,《
钱穆先生曾在《宋明理学概述》序言里说:““虽居乡僻,未尝敢一日废学。虽经乱离困厄,未尝敢一日颓其志。虽或名利当前,未尝敢动其心。虽或毁誉横生,未尝敢馁其气。虽学不足以自成立,未尝或忘先儒之榘矱,时切其向慕。虽垂老无以自靖献,未尝不于国家民族世道人心,自任以匹夫之有其责。””
佛家说烦恼即是般若,那些让你斩不断的愁丝才是真正度你到彼岸的船筏。
前言 阿德勒:超越自卑,找到生命的真正意义 阿德勒是个体心理学的先驱和代表。个体心理学与其他心理学流派相比,最突出显要的一点在于,它对人的研究是以个体为始,即首先关注个体本身的成长发展和人生历程。有趣的是,如果你对阿德勒本人的人生经历及其学说有所了解的话,你会发现其人的发展轨迹恰好印证了他所秉持的观点和理论。阿德勒认为,每个人都有不同程度的自卑感,而优越感则是自卑感的补偿。但自卑感的存在并不是一件坏事,因为它激励了人不断追求卓越,克服自身的障碍,在有限的生命空间内发挥出最大的价值。可以说,正是由于人类会有自卑感,才会有不断取得发展和进步的不竭动力。与此相印证的是,阿德勒本人就是一个““先天发展不足””、一开始就存在着极为强烈自卑感的人。阿德勒是一个直到 4 岁才会走路的体弱多病的儿童。他患有佝偻病,无法进行激烈的体育活动。但他并没有让身体上的缺陷压倒自己,相反,这刺激了他的上进心。
:::info 通过 PR 的方式共同对主仓库进行贡献的方式,是开源项目协作的非常有效的方法;通常我们不会直接对主仓库直接提交代码。 :::
一般情况下,我们的操作是,在需要贡献时,Fork 一份项目,然后自己修改以 PR 的方式提交贡献请求。
熟悉 Github 的同学会发现,在 Github 上最近更新了 Sync fork
的功能,通过简单的点击操作,即可完成对源库 (upstream) 的更新同步。
通过以上方式,我们可以方便在跟随主库的更新
Tips Github 的方式,仅在 Web 端 和 Github CLI 官方提供的 GH 才可以使用这样的功能
Github 更多在开源项目时贡献,实际上,在我们日常的工作当中,更多会有自建的 Gitlab 或者其他的代码 Hub,这里以 Gitlab 为例
Gitlab 并未提供 Sync fork 的功能,所以我们需要自行解决同步的需求
:::success
以下方式会在终端或本地使用Sourcetree
更加自由,仅使用 Git 的方式协作,自由度很大
:::
基于这个方式我们可以实现,有关联的 主库到从库的同步;也可以完成跨 Hub 的同步,比如:
samzonglu at samzongs-MacBook-Pro in ~/Git/daocloud/DaoCloud-docs(main✔)
± git remote add upstream https://github.com/DaoCloud/DaoCloud-docs.git
Alias tip: gra upstream https://github.com/DaoCloud/DaoCloud-docs.git
samzonglu at samzongs-MacBook-Pro in ~/Git/daocloud/DaoCloud-docs(main✔)
± git remote
Alias tip: gr
origin
upstream
samzonglu at samzongs-MacBook-Pro in ~/Git/daocloud/DaoCloud-docs(main✔)
± git fetch upstream
Alias tip: gf upstream
remote: Enumerating objects: 1268, done.
remote: Counting objects: 100% (182/182), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 1268 (delta 177), reused 182 (delta 177), pack-reused 1086
Receiving objects: 100% (1268/1268), 1.87 MiB | 2.74 MiB/s, done.
Resolving deltas: 100% (637/637), completed with 119 local objects.
From https://github.com/DaoCloud/DaoCloud-docs
* [new branch] feature/theme -> upstream/feature/theme
* [new branch] fix-typo -> upstream/fix-typo
* [new branch] gh-pages -> upstream/gh-pages
* [new branch] main -> upstream/main
* [new branch] patch-new-gh-pages-01 -> upstream/patch-new-gh-pages-01
* [new branch] stash/bug-codes -> upstream/stash/bug-codes
samzonglu at samzongs-MacBook-Pro in ~/Git/daocloud/DaoCloud-docs(main✔)
± git pull upstream main
Alias tip: gl upstream main
From https://github.com/DaoCloud/DaoCloud-docs
* branch main -> FETCH_HEAD
Already up to date.
samzonglu at samzongs-MacBook-Pro in ~/Git/daocloud/DaoCloud-docs(main✔)
± git push origin main
Alias tip: gp origin main
Everything up-to-date
厂家 | 产品控制台主页 | 应用模式 |
---|---|---|
阿里云 | https://kafka.console.aliyun.com/ | 中间件 PaaS 模块之一 |
腾讯云 | https://console.cloud.tencent.com/ckafka/overview | 中间件 PaaS 模块之一 |
华为云 | https://console.huaweicloud.com/dms/?region=cn-east-3&engine=kafka | 中间件 PaaS 模块之一 |
QingCloud | https://console.qingcloud.com/pek3/app/app-n9ro0xcp/ | 中间件 AppCenter 模块之一 |
UCloud | https://console.ucloud.cn/ukafka/ukafka | 中间件 PaaS 模块之一 |
时速云 | https://console.tenxcloud.com/middleware_center/app | 中间件 应用之一 |
功能点 | 阿里云 | 腾讯云 | 华为云 | QingCloud | UCloud | 时速云 | strimzi-kafka-operator | koperator |
---|---|---|---|---|---|---|---|---|
Kafka 实例的生命周期管理 | √ | √ | √ | √ | √ | √ | √ | √ |
Kafka 多版本支持 | √ 默认固定,工单调整 | √ | √ | √(仅 1 个) | √ | √ | √ | √ |
Kafka 节点列表 | √ | √ | √ | 跳转 Pod | √ (能创建 pod) | √ | ||
Kafka 原生参数管理 | ||||||||
√ | √ 原生 | √ | √ 原生 | √ | √ | |||
Kafka 常用参数抽象 | √ | √ | √ | √ | √ | √ | ||
Kafka 模块自带 Zookeeper | √ | √ | √ | √ | √ | |||
消息查询功能 | √ | √ | √ | √ 原生 | √ 原生 | |||
消息下载功能 | √(高级版) | |||||||
Topic 管理列表 | √ | √ | √ | √ 原生 | √ | √ 原生 | ||
Topic 增删改查 | √ | √ | √ | √ 原生 | √ | √ 原生 | ||
Topic 高级参数支持 | √ | √ | √ | √ 原生 | √ | √ 原生 | ||
Topic 详情 | √ | √ | ||||||
√ 原生 | √ | √ 原生 | √ | √ | ||||
Consumer Group 列表 | √ | √ | √ 原生 | √ 原生 | ||||
Consumer Group 增删改查 | √ | √ | √ 原生 | √ | √ 原生 | |||
资源监控看板 | √ | √ | √ | √ | √ | √ grafana dashboard | √ grafana dashboard | |
Kafka 业务数据监控 (消息量/积压/消费情况) | √ | √ | √ | √ | √Grafana | √ exporter+grafana | √ exporter+grafana | |
示例接入代码 | √ | √ | √ | |||||
消息发送测试窗口 | √ | √ | √ | |||||
Kafka 服务日志查看 | ||||||||
操作审计日志查看 | √ | √ | √ | |||||
提供 Kafka Manager UI | √ | √ | ||||||
提供 kafka export 备份功能 | √ | √ | ||||||
友好性帮助文档 | √ | √ | √ | √ | √ | |||
提供帮助用户迁入上云 | √ | √ | √ |
厂家 | 字段 |
---|---|
阿里云 | 名称流量规格集群流量 = 业务流量 + 集群内副本复制流量,该规格实际业务读流量处理峰值为 50 MB/s,业务写流量处理峰值为 10 MB/s。磁盘容量数据默认 3 副本存储。实例规格为标准版时,如购买 300G 磁盘,实际存储业务的磁盘大小为 100G,其余 200G 为备份容量。实例规格为专业版时,如购买 300G 磁盘,实际存储业务的磁盘大小为 300G,额外赠送 600G 备份容量。消息保留最长时间是指在磁盘容量充足的情况下,消息的最长保留时间;在磁盘容量不足(即磁盘水位达到 85%)时,将提前删除旧的消息,以确保服务可用性;默认 72 小时,可选 24 小时 ~ 168 小时。最大消息大小,默认 1MB 边界值?标准版实例单条消息最大为 256KB,专业版实例单条消息最大为 10MB 且支持下载Topic 数量 |
腾讯云 | 名称 Kafka 版本实例规格配置存储容量消息保留时长 |
华为云 | 名称 Kafka 版本实例规格配置存储容量 |
QingCloud | 名称 Kafka 版本 Kafka 节点配置:CPU / 内存 / 节点数(规格)客户端节点配置:CPU / 内存 / 节点数(规格)Kafka-Manager / CLI)Zookeeper 实例存储容量自定义参数配置内部 Topic offset replicasKafka manager 认证 zabbix.agentkafka scale version |
UCloud | 名称 Kafka 版本实例规格配置 + 存储容量实例数 3<设定值<100 消息保留时长 |
DCE5 支持多集群,Kafka 采用 operator 的方式部署,则需要先安装 Operator 模板到集群内
在用户创建 kafka 实例时,检测是否目标集群是否存在 kafka-operator,如果不存在则同步安装
什么时间移除 kafka-operator,默认情况下安装后不移除;交由 Kpanda 对集群释放时处理
通过多版本 对应 多 Kafka-opeator 的方式,让用户进行多版本选择
非必要需求,短期不支持
默认情况下更新了 operator 之后,不对存量做处理;后续可以做友好提示用户升级即可
实例创建
实例详情
https://cloud.tencent.com/document/product/597/73566
创建时,需要关联依赖服务 zookeeper
提供了原生的 Kafka-manager 管理 UI https://docsv3.qingcloud.com/middware/kafka/manual/kafka_manager/kafka_manager_topic/
访问方式,以 openvpn 的方式接入到 VPC(需绑定入口公网 IP) 后,通过 client 内网地址访问
将上游 Kafka 数据传输到 HDFS 或者 es
提供原生的实例管理界面,进行配置更新等
直接跳转到 K8s 容器组界面查看
在 Kafka manger 原生 UI 控制台内管理,默认启用了控制台公网访问能力
基础 CPU、内存、网络、存储监控
接入 Grafana 提供一个 Dashboard 的,可以查看 Topics 的消息数,消费量,积压数
操作视频已上传到 OneDrive 共享空间
腾讯云只可以按月份订购,所以没有录制视频。
方案一:
实现:
方案比对:
方案二:
实现:
方案对比:
poetry 是目前比较流行的 Python 环境管理工具 和 包管理工具,对多项目开发时的环境隔离有非常大的帮助,同时集成了包管理能力。
官方网站 https://python-poetry.org/ 集成了所有 Poetry 最新的使用文档,以下仅在我的环境上经过验证
# In Pip
- 安装 pip install poetry # pip3
- 更新 poetry self update
# In my Mac
- 安装 brew install poetry
- 更新 brew upgrade poetry
# In my CentOS
- 安装 curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
- 更新 poetry self update
在开始使用前,建议先对 poetry 的配置有些了解,并调整为适合你的方式,主要是调整一下虚拟环境的安装位置
:::info
poetry config
poetry 相关的查看和编辑的命令
:::
~ poetry config --list # 获取当前 poetry 的配置情况
cache-dir = "/Users/$username/Library/Caches/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs" # /Users/$username/Library/Caches/pypoetry/virtualenvs
| 配置项目 | 配置内容 | 配置项说明 | 建议配置 | | — | — | — | — | | cache-dir | String | 缓存目录配置,使用 poetry 安装的包源文件都会缓存到这个目录。 | 不建议更改 | | installer.parallel | boolean | 此配置会被忽略 | | | virtualenvs.create | boolean | 默认为 true,如果当前工程的虚拟环境不存在,就创建一个 | 不建议更改 | | virtualenvs.in-project | boolean | None:poetry 会在系统特定目录创建一个.venv 目录,由下面的 path 参数指定 true:poetry 会在项目根目录创建一个.venv 目录 false:poetry 将会忽略已存在的.venv 目录 | 《建议修改》
推荐这种方式,在项目根目录创建虚拟环境,这样就算移动目录位置也不影响虚拟环境的使用 | ||||
virtualenvs.path | string | 默认是{cache-dir}/virtualenvs,虚拟环境创建的目录,如果上面的 in-project 为 true,此配置就无效 | 不建议更改 |
:::danger 建议 在使用前 启用 virtualenvs.in-project,这样会在每个项目下有一个.venv 方便隔离管理 :::
# poetry 配置说明
poetry config virtualenvs.in-project true
Poetry Command | 解释 |
---|---|
$ poetry –version | 显示您的 Poetry 安装版本。 |
$ poetry new | 创建一个新的 Poetry 项目。 |
$ poetry init | 将 Poetry 添加到现有项目中。 |
$ poetry run | 使用 Poetry 执行给定的命令。 |
$ poetry add | 添加一个包 pyproject.toml 并安装它。 |
$ poetry update | 更新项目的依赖项。 |
$ poetry install | 安装依赖项。 |
$ poetry show | 列出已安装的软件包。 |
$ poetry lock | 将最新版本的依赖项固定到 poetry.lock. |
$ poetry lock –no-update | 刷新 poetry.lock 文件而不更新任何依赖版本。 |
$ poetry check | 验证 pyproject.toml。 |
$ poetry config –list | 显示 Poetry 配置。 |
$ poetry env list | 列出项目的虚拟环境。 |
$ poetry export | 导出 poetry.lock 为其他格式。 |
这里以 初始化一个 FastAPI 项目作为 实例
➜ fastapi poetry new fastapi-demo
Created package fastapi_demo in fastapi-demo
➜ fastapi ls -lh fastapi-demo
total 8
-rw-r--r-- 1 samzonglu staff 0B 2 15 14:28 README.rst
drwxr-xr-x 3 samzonglu staff 96B 2 15 14:28 fastapi_demo
-rw-r--r-- 1 samzonglu staff 304B 2 15 14:28 pyproject.toml
drwxr-xr-x 4 samzonglu staff 128B 2 15 14:28 tests
➜ fastapi cd fastapi-demo
➜ fastapi-demo poetry env use 3.10.2 # 配置项目的虚拟环境
这里会遇到一个问题,已存在的项目基本都已经有了 requirements.txt,所以 poetry 最好可以直接读取它
poetry add `cat requirements.txt`
将项目依赖导出为 requirements.txt
poetry export --output requirements.txt
如何把项目移交给一个 not use Poetry 的人运行,对于 Python 的 环境包 依赖,上述的 ouput/input 的方式,会存在一些问题,这里进行纠正。
:::warning pip freeze > requirements.txt :::
anyio @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/cd/3f/ae/baff749ce6cb4d7985e4142650605d2d30cb92eb418e2d121868e4413d/anyio-3.6.1-py3-none-any.whl
certifi @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/b1/9b/6f/cd63ce97294ee9a1fb57e5cebf02f251fbb8f9ac48353a27ceeddc410b/certifi-2022.6.15-py3-none-any.whl
charset-normalizer @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/86/c8/3e/d878881698fbd2b72f484e4fca340588d633102920a002b66a293f9480/charset_normalizer-2.1.0-py3-none-any.whl
click @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/63/f3/4c/2270b95f4d37b9ea73cd401abe68b6e9ede30380533cd4e7118a8e3aa3/click-8.1.3-py3-none-any.whl
fastapi @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/f9/37/53/c998e9ffd7ace66218174711f5c3ef1026a0bd3cd72f5fe2908e9b949b/fastapi-0.78.0-py3-none-any.whl
h11 @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/ef/5c/a2/a6d556bc5e3493616e52726df9c880b2da2fbf9c3be5e8351c84fbfafd/h11-0.13.0-py3-none-any.whl
idna @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/90/36/8c/81eabf6ac88608721ab27f439c9a6b9a8e6a21cc58c59ebb1a42720199/idna-3.3-py3-none-any.whl
pydantic @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/c2/13/d4/b9f7dbf75702d85504b4a5f36545ff903c7e2264d4889e94ce02637276/pydantic-1.9.1-cp310-cp310-macosx_11_0_arm64.whl
requests @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/14/1f/4d/1b93db6513b8ab38db841e4ce62691288ba549a5c1b6f3ca7274a1c9fd/requests-2.28.1-py3-none-any.whl
sniffio @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/2b/1b/93/9c34d727e29f7bb11ce5b2ca7f43e77cb4e96a81ee5e07a92763951416/sniffio-1.2.0-py3-none-any.whl
starlette @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/3d/fc/74/569a1206737284325f5bb2e4f34689632c159dafbe8b7ff30bf2893c2d/starlette-0.19.1-py3-none-any.whl
typing_extensions @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/4a/aa/fe/e4680f3423fbdb5ac89a6fb2f83d9e7ff7fb48173b0fa1604786182558/typing_extensions-4.3.0-py3-none-any.whl
urllib3 @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/8a/87/ce/4a44bf6bb59a745f4af7082c6977ab23a478fca039ad4d631dfdc0185b/urllib3-1.26.10-py2.py3-none-any.whl
uvicorn @ file:///Users/samzonglu/Library/Caches/pypoetry/artifacts/62/76/ec/dcafe6bae872839618dbf982c87eb314eee97784f7df74895e07bd198a/uvicorn-0.18.2-py3-none-any.whl
可以看到,默认情况下pip freeze
在输出时,携带里对应的安装路径;如果这个时候,我们把项目移交给其他人运行时,会遇到以下问题
ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such
这是 pip 安装软件包的一种特殊语法(自 19.1 开始受支持)PEP404, 但是该此种路径取决于环境,file:///URL 仅在本地文件系统上可用,你不能将生成的 requirements.txt 文件提供给其他人使用
poetry export --without-hashes --format=requirements.txt > requirements.txt
通过 poetry 自带的导出能力,会携带更多的一些信息:对于环境中 python 版本的依赖,虽然更加友好一些。
anyio==3.6.1; python_full_version >= "3.6.2"
certifi==2022.6.15; python_version >= "3.6"
charset-normalizer==2.1.0; python_full_version >= "3.6.0"
click==8.1.3; python_version >= "3.7"
colorama==0.4.5; python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or platform_system == "Windows" and python_version >= "3.7" and python_full_version >= "3.5.0"
fastapi==0.78.0; python_full_version >= "3.6.1"
h11==0.13.0; python_version >= "3.6"
idna==3.3; python_version >= "3.5"
pydantic==1.9.1; python_full_version >= "3.6.1"
requests==2.28.1; python_version >= "3.7" and python_version < "4"
sniffio==1.2.0; python_version >= "3.5"
starlette==0.19.1; python_version >= "3.6"
typing-extensions==4.3.0; python_version >= "3.7"
urllib3==1.26.10; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0" and python_version < "4")
uvicorn==0.18.2; python_version >= "3.7"
在新版的 python 中,推荐采用另外一个命令方式,pip list --format=freeze
这样会输出一份干净的依赖清单,我们可以通过这个方式,快速导出一份 原汁原味
的 requirements.txt
poetry run pip list --format=freeze
anyio==3.6.1
certifi==2022.6.15
charset-normalizer==2.1.0
click==8.1.3
fastapi==0.78.0
h11==0.13.0
idna==3.3
pip==22.2
pydantic==1.9.1
requests==2.28.1
setuptools==62.6.0
sniffio==1.2.0
starlette==0.19.1
typing_extensions==4.3.0
urllib3==1.26.10
uvicorn==0.18.2
wheel==0.37.1
with poetry
cat requirements.txt | xargs poetry add
without poetry
pip install -r requirements.txt
Skoala 的微服务治理和微服务是强依赖的 Ghippo、Insight 和 Kpanda 作为基石;同时 Skoala 也支持了 Mesh 服务治理能力,所以也需要 Mspider。 为了保证良好的使用体验,以及减少不可预知的部署问题,请确认以上组件均可正常工作。
访问 UI 界面环境,可以在左侧导航栏能够正确看到所有模块,并且可以正常使用。
通过终端查看集群内的 apiserver 是否正常,检查服务 Pod 是否正常运行
# 检测 ghippo
~ kubectl -n ghippo-system get pods | egrep "apiserver|ui"
ghippo-apiserver-589c4ddcf6-cmct7 3/3 Running 0 17h
ghippo-apiserver-589c4ddcf6-sts8t 3/3 Running 0 17h
ghippo-ui-7ddddc548c-nsbkj 2/2 Running 0 94m
# 检查 kpanda
~ kubectl -n kpanda-system get pods | egrep "apiserver|ui"
kpanda-apiserver-695b76f476-kdb8l 2/2 Running 0 5m56s
kpanda-apiserver-695b76f476-mvllg 2/2 Running 0 7m51s
kpanda-clusterpedia-apiserver-574d49c4c-hptm7 2/2 Running 0 74m
kpanda-clusterpedia-apiserver-574d49c4c-mjm84 2/2 Running 0 74m
kpanda-ui-5f9586d49b-f4mn2 2/2 Running 0 66m
kpanda-ui-5f9586d49b-qpgwd 2/2 Running 0 66m
# 检查 Insight
~ kubectl -n insight-system get pods | egrep "server|ui"
insight-server-5bbc96bb94-n2wc7 1/1 Running 0 174m
insight-ui-66b6795c44-zm6qj 1/1 Running 0 3h38m
# 检查 mspider
~ kubectl -n mspider-system get pods | egrep "api|ui"
mspider-api-service-7d96c6798-mljst 2/2 Running 0 3h20m
mspider-ui-6f5d58cdc6-59hbn 2/2 Running 0 170m
mspider-work-api-684b75dccb-4659g 2/2 Running 0 3h20m
配置好 skoala 仓库,即可查看和获取到 skoala 的应用 chart
helm repo add skoala-release https://release.daocloud.io/chartrepo/skoala
helm repo update
需要实现安装 Helm
在安装 skoala 的组件时,hive 和 sesame 需要用到 mysql 组件,所以这里需要预先安装一下 mysql,执行下方 yaml。
# 使用如下命令
kubectl -n skoala-system apply -f skoala-mysql.yml
# 保存到 skoala-mysql.yml 文件
~ cat skoala-mysql.yml
apiVersion: v1
kind: Service
metadata:
name: skoala-mysql
namespace: skoala-system
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: skoala-mysql
namespace: skoala-system
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: release.daocloud.io/skoala/mysql:5.7.32
name: mysql
env:
# Use secret in real usage
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
登录到 pod 内,并成功登录到 mysql 内
kubectl -n skoala-system exec pods/`kubectl -n skoala-system get pods | grep skoala-mysql | awk '{print $1}'` -it bash
初始化数据库表
注意把对应的版本,建议使用最新的版本,这里建议 v0.6.1
helm upgrade --install skoala --create-namespace -n skoala-system --cleanup-on-fail \
--set image.tag=v0.6.1 \
skoala/skoala-agent \
--version 0.6.1
这里会将资源部署到 skoala-system 命名空间内,可以通过查看该命名空间内的资源来查看是否部署成功。
~ kubectl -n skoala-system get pods
NAME READY STATUS RESTARTS AGE
hive-96b58785c-shhnh 0/1 Running 0 23h
sesame-cdd894f74-l55hw 0/1 Running 0 23h
ui-7df9754f85-v2gg5 1/1 Running 0 23h
helm search repo skoala-release/skoala --versions
NAME CHART VERSION APP VERSION DESCRIPTION
skoala-release/skoala 0.6.1 0.6.1 The helm chart for Skoala
skoala-release/skoala 0.6.0 0.6.0 The helm chart for Skoala
skoala-release/skoala 0.5.1 0.5.1 The helm chart for Skoala
这里注意各个组件的版本,建议安装如下版本,直接执行命令即可,【在 demo 部署时】
helm upgrade --install skoala --create-namespace -n skoala-system --cleanup-on-fail \
--set ui.image.tag=v0.5.3 \
--set hive.image.tag=v0.6.1 \
--set sesame.image.tag=v0.6.1 \
daocloud-registry/skoala \
--version 0.6.1
查看部署的 pod 是否启动成功
~ kubectl -n skoala-system get pods
NAME READY STATUS RESTARTS AGE
hive-96b58785c-shhnh 1/1 Running 0 25h
sesame-cdd894f74-l55hw 1/1 Running 0 25h
skoala-mysql-75dc5cfc7-99tbs 1/1 Running 0 25h
ui-7df9754f85-v2gg5 1/1 Running 0 23h
helm uninstall skoala -n skoala-system
Key | Type | Default | Description |
---|---|---|---|
global.image.pullPolicy | string | "IfNotPresent" |
|
global.image.repository | string | "release.daocloud.io" |
|
global.imageCredentials.email | string | "" |
|
global.imageCredentials.password | string | "" |
|
global.imageCredentials.username | string | "" |
|
global.imagePullSecrets | list | [] |
|
global.istioInjection.enable | bool | true |
|
global.namespace | string | "skoala-system" |
|
hive.configMap.chart-repos.skoala.name | string | "skoala" |
|
hive.configMap.chart-repos.skoala.password | string | "" |
|
hive.configMap.chart-repos.skoala.url | string | "https://release.daocloud.io/chartrepo/skoala" |
|
hive.configMap.chart-repos.skoala.user | string | "" |
|
hive.configMap.client.ghippo.kubeconfig | string | "" |
|
hive.configMap.client.ghippo.timeout | int | 30 |
|
hive.configMap.client.insight | string | "insight-server.insight-system:80" |
|
hive.configMap.client.kpanda | string | "kpanda-apiserver.kpanda-system:80" |
|
hive.configMap.client.mspider | string | "mspider-api-service.mspider-system:8081" |
|
hive.configMap.client.mspider_mcpc | string | "mspider-work-api.mspider-system:8081" |
|
hive.configMap.data.database.database | string | "hive" |
|
hive.configMap.data.database.driver | string | "mysql" |
|
hive.configMap.data.database.host | string | "skoala-mysql" |
|
hive.configMap.data.database.max-connection-lifetime | int | 20 |
|
hive.configMap.data.database.max-idle-connections | int | 150 |
|
hive.configMap.data.database.max-open-connections | int | 150 |
|
hive.configMap.data.database.password | string | "dangerous" |
|
hive.configMap.data.database.port | int | 3306 |
|
hive.configMap.data.database.user | string | "root" |
|
hive.configMap.data.server.grpc.addr | string | "0.0.0.0:9091" |
|
hive.configMap.data.server.grpc.timeout | string | "1s" |
|
hive.configMap.data.server.http.addr | string | "0.0.0.0:8081" |
|
hive.configMap.data.server.http.timeout | string | "1s" |
|
hive.enable | bool | true |
|
hive.image.name | string | "skoala/hive" |
|
hive.image.pullPolicy | string | "IfNotPresent" |
|
hive.image.tag | string | "v0.6.0" |
|
hive.nameOverride | string | "hive" |
|
hive.replicaCount | int | 1 |
|
hive.resources | object | {} |
|
hive.service.grpc.nodePort | int | 30091 |
|
hive.service.grpc.port | int | 9091 |
|
hive.service.http.nodePort | int | 30081 |
|
hive.service.http.port | int | 8081 |
|
hive.service.type | string | "NodePort" |
|
sesame.configMap.chart-repos.skoala.name | string | "skoala" |
|
sesame.configMap.chart-repos.skoala.password | string | "" |
|
sesame.configMap.chart-repos.skoala.url | string | "https://release.daocloud.io/chartrepo/skoala" |
|
sesame.configMap.chart-repos.skoala.user | string | "" |
|
sesame.configMap.client.ghippo.kubeconfig | string | "" |
|
sesame.configMap.client.ghippo.timeout | int | 30 |
|
sesame.configMap.client.insight | string | "insight-server.insight-system:80" |
|
sesame.configMap.client.kpanda | string | "kpanda-apiserver.kpanda-system:80" |
|
sesame.configMap.data.server.grpc.addr | string | "0.0.0.0:9092" |
|
sesame.configMap.data.server.grpc.timeout | string | "1s" |
|
sesame.configMap.data.server.http.addr | string | "0.0.0.0:8082" |
|
sesame.configMap.data.server.http.timeout | string | "1s" |
|
sesame.configMap.log.development | bool | true |
|
sesame.configMap.log.disable-color | bool | false |
|
sesame.configMap.log.disable-stacktrace | bool | false |
|
sesame.configMap.log.enable-caller | bool | true |
|
sesame.configMap.log.error-output-paths | string | "dist/log/skoala-sesame.error.log" |
|
sesame.configMap.log.format | string | "console" |
|
sesame.configMap.log.level | string | "debug" |
|
sesame.configMap.log.name | string | "skoala-sesame" |
|
sesame.configMap.log.output-paths | string | "dist/log/skoala-sesame.log,stdout" |
|
sesame.enable | bool | true |
|
sesame.image.name | string | "skoala/sesame" |
|
sesame.image.pullPolicy | string | "IfNotPresent" |
|
sesame.image.tag | string | "v0.6.0" |
|
sesame.nameOverride | string | "sesame" |
|
sesame.replicaCount | int | 1 |
|
sesame.resources | object | {} |
|
sesame.service.grpc.nodePort | int | 30092 |
|
sesame.service.grpc.port | int | 9092 |
|
sesame.service.http.nodePort | int | 30082 |
|
sesame.service.http.port | int | 8082 |
|
sesame.service.type | string | "NodePort" |
|
ui.enable | bool | true |
|
ui.image.name | string | "skoala/skoala-ui" |
|
ui.image.pullPolicy | string | "IfNotPresent" |
|
ui.image.tag | string | "v0.4.0" |
|
ui.nameOverride | string | "ui" |
|
ui.replicaCount | int | 1 |
|
ui.resources | object | {} |
|
ui.service.nodePort | int | 30090 |
|
ui.service.port | int | 80 |
|
ui.service.type | string | "NodePort" |
|
create | bool | true |
|
ui.serviceAccount.name | string | "" |
|
ui.tolerations | list | [] |
安装步骤说明
~ helm search repo skoala-release/skoala-agent --versions
NAME CHART VERSION APP VERSION DESCRIPTION
skoala/skoala-agent 0.6.1 0.6.1 A Helm chart for Skoala Agent
skoala/skoala-agent 0.6.0 0.6.0 A Helm chart for Kubernetes
skoala/skoala-agent 0.5.1 0.5.1 A Helm chart for Kubernetes
skoala/skoala-agent 0.5.0 0.5.0 A Helm chart for Kubernetes
helm upgrade --install skoala-agent --create-namespace -n skoala-agent --cleanup-on-fail \
--set image.tag=v0.6.1 \
skoala/skoala-agent \
--version 0.6.1
查看部署的 pod 是否启动成功
~ kubectl -n skoala-agent get pods
NAME READY STATUS RESTARTS AGE
skoala-agent-679c6d64b4-tb7k4 1/1 Running 0 26h
helm uninstall skoala-agent -n skoala-agent
Key | Type | Default | Description |
---|---|---|---|
affinity | object | {} |
|
autoscaling.enabled | bool | false |
|
autoscaling.maxReplicas | int | 100 |
|
autoscaling.minReplicas | int | 1 |
|
autoscaling.targetCPUUtilizationPercentage | int | 80 |
|
fullnameOverride | string | "" |
|
image.pullPolicy | string | "IfNotPresent" |
|
image.repository | string | "release-ci.daocloud.io/skoala/skoala-agent" |
|
image.tag | string | "v0.6.0" |
|
imagePullSecrets | list | [] |
|
ingress.annotations | object | {} |
|
ingress.className | string | "" |
|
ingress.enabled | bool | false |
|
ingress.hosts[0].host | string | "chart-example.local" |
|
ingress.hosts[0].paths[0].path | string | "/" |
|
ingress.hosts[0].paths[0].pathType | string | "ImplementationSpecific" |
|
ingress.tls | list | [] |
|
istioInjection.enable | bool | true |
|
nameOverride | string | "" |
|
nodeSelector | object | {} |
|
podAnnotations | object | {} |
|
podSecurityContext | object | {} |
|
replicaCount | int | 1 |
|
resources | object | {} |
|
securityContext | object | {} |
|
service.port | int | 443 |
|
service.type | string | "NodePort" |
|
serviceAccount.annotations | object | {} |
|
serviceAccount.create | bool | false |
|
serviceAccount.name | string | "" |
|
tolerations | list | [] |
canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
canal 特别设计了 client-server 模式,交互协议使用 protobuf 3.0 , client 端可采用不同语言实现不同的消费逻辑,欢迎大家提交 pull request
canal 作为 MySQL binlog 增量获取和解析工具,可将变更记录投递到 MQ 系统中,比如 Kafka/RocketMQ,可以借助于 MQ 的多语言能力
canal 的策略是模拟了 MySQL Slave 的行为,因此需要有 SELECT, REPLICATION SLAVE, REPLICATION CLIENT 的权限
在 Service Mesh 微服务架构中,我们常常会听到东西流量和南北流量两个术语。
南北流量(NORTH-SOUTH traffic)和东西流量(EAST-WEST traffic)是数据中心环境中的网络流量模式。下面我们通过一个例子来理解这两个术语。
假设我们尝试通过浏览器访问某些 Web 应用。Web 应用部署在位于某个数据中心的应用服务器中。在多层体系结构中,典型的数据中心不仅包含应用服务器,还包含其他服务器,如负载均衡器、数据库等,以及路由器和交换机等网络组件。假设应用服务器是负载均衡器的前端。
当我们访问 web 应用时,会发生以下类型的网络流量:
数据中心树型拓扑图是一个典型的包含接入层、汇聚层、核心层三层的网络结构。这种结构诞生之初就是为了将外部流量引流到内部应用。
流量从外部穿过防火墙或者数据中心其它外围网络设备进来,对应到上⾯这张图里,流动方向为从上到下,称为南向流量(和地图一样,上北下南),而与之对应的,数据中心内部产生的,离开数据中心的流量,从下到上故称为北向流量。合起来称为南北流量。
在微服务化流行之前,以巨石系统(monolithic)这种单体应用为单位部署的方式,产生的是典型的南北流量。一个单体应用配有一个专门的服务器(或虚拟机),一个外部请求通常在单体应用内独立完成,除了访问数据库等必须依赖服务之外,很少会发生横向的流量。
但云计算机、大数据、微服务、云原生等技术的发展催生了大量的从左到右以及从右到左的流量,也被称为东西流量。
数据中心内部南北流量的削弱,而东西流量的井喷在硬件上要求数据中心要横向扩展以提供更宽的大二层以及容纳更多的服务器,而在软件上则要求一种新的服务编排方式以便能充分挖掘、利用现有的计算能力,从这个角度看 K8s 的出现是一种必然。
举两个例子:
客户端(位于数据中心一侧的浏览器)与负载均衡器(位于数据中心)之间的网络流量
负载均衡器、应用服务器、数据库等之间的网络流量,它们都位于数据中心。
在这个例子中,前者即即客户端和服务器之间的流量被称为南北流量。简而言之,南北流量是 server-client 流量。
第二种流量即不同服务器之间的流量与数据中心或不同数据中心之间的网络流被称为东西流量。简而言之,东西流量是 service-service 流量。
当下,东西流量远超南北流量,尤其是在当今的大数据生态系统中,比如 Hadoop 生态系统(大量 server 驻留在数据中心中,用 map reduce 处理),server-server 流量远大于 server-client 流量。
大家可能会好奇,东西南北,为什么这么命名?
该命名来自于绘制典型 network diagrams 的习惯。在图表中,通常核心网络组件绘制在顶部(NORTH),客户端绘制在底部(SOUTH),而数据中心内的不同服务器水平(EAST-WEST)
在 Windows 和 Linux 中使用 Docker,可以通过 docker0 这个网络 IP,在容器内访问宿主机的端口及服务
➜ ~ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:65:e2:82:de txqueuelen 0 (Ethernet)
RX packets 19240 bytes 9107695 (8.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16989 bytes 9952021 (9.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
但以上在 macOS 中无 docker0 端口,那我们如何在 Docker for Mac 中访问宿主机的服务呢?
docker.for.mac.host.internal
可以采用以上本地域名内实现在容器内访问 宿主机的服务
亨利••大卫••梭罗 7 highlights, 1 note
最好在坏事一开始的时候就防止它。
在任何一个社会中,书籍的作者都是天生的极富魅力的精英分子,对人类发挥着比帝王们更大的影响。当目不识丁的、也许还是鄙视一切的商人,通过魄力和勤奋挣得了垂涎已久的闲暇和衣食无忧的生活,进入了财富和时尚的圈子以后,最终不可避免地会转向那更高的然而却难以企及的知识和才赋的圈子,这时他才会意识到自己文化的残缺,以及他一切财富的空虚无用;于是他不遗余力地要使子女获得知识文化,他深刻地感到自己这方面的不足,从而证明了他的明智;就这样,他成了一个家族的缔造者。
我们应该和古代的圣贤一样优秀,但是首先要知道他们有多么优秀。我们是一群矮子,我们智力翱翔所达之处只不过稍高于报纸的专栏而已。
德不孤,必有邻。
孤独不能以一个人和别人之间有多少英里的空间来衡量。