├── pic ├── img.png ├── k8s.png ├── qq.png ├── wx.png ├── xy.png ├── 学浪.png ├── 统计.png ├── 1v1大纲.png ├── img_12.png ├── img_13.png ├── img_18.png ├── img_20.png ├── img_21.png ├── img_22.png ├── img_23.png ├── img_24.png ├── img_5.png ├── img_7.png ├── k8s采集.png ├── mo01.png ├── mo02.png ├── mo03.png ├── mo04.png ├── mo05.png ├── new │ ├── e6.png │ ├── img.png │ ├── img_1.png │ ├── img_2.png │ ├── img_3.png │ ├── img_4.png │ └── k8s源码-new.png ├── qq群二维码.png ├── 代码行数统计.png ├── 任务kill.png ├── 切换用户执行.png ├── 原地升级.png ├── 反馈01.png ├── 反馈02.png ├── 反馈03.png ├── 反馈04.png ├── 反馈05.png ├── 告警屏蔽.png ├── 在离混部卖点.png ├── 工单评论.png ├── 工单通知全.png ├── 第8模块卖点.png ├── 统计-2.png ├── 网络探测介绍.png ├── 表单设计2.png ├── 记录 │ ├── img.png │ ├── img_1.png │ ├── img_2.png │ ├── img_3.png │ ├── img_4.png │ ├── img_5.png │ ├── img_6.png │ ├── img_7.png │ ├── img_8.png │ ├── img_9.png │ ├── img_10.png │ ├── img_11.png │ ├── img_12.png │ ├── img_13.png │ ├── img_14.png │ ├── img_15.png │ ├── img_16.png │ ├── img_17.png │ ├── img_18.png │ ├── img_19.png │ ├── img_20.png │ ├── img_21.png │ ├── img_22.png │ ├── img_23.png │ └── img_24.png ├── 飞书卡片.png ├── 7模块_资产统计.png ├── gpu新品榜单.png ├── gpu课程规划.png ├── grpc的联调.png ├── ha_arch.png ├── http-sd.png ├── k8s_node.png ├── k8s_obj.png ├── k8s单机详情.png ├── p_target.png ├── thanos卖点.png ├── 并发度滚动执行.png ├── 1v1课程 │ ├── img.png │ ├── img_1.png │ ├── img_2.png │ ├── img_3.png │ ├── img_4.png │ └── img_5.png ├── cicd_img_16.png ├── cicd_img_21.png ├── cicd_img_22.png ├── cicd_img_23.png ├── gpu课程购买详情.png ├── http服务发现标签.png ├── k8s_img_2.png ├── k8s_server.png ├── sidecar形式部署.png ├── 大纲pic │ ├── 面试题.png │ ├── 调优小课大纲.png │ ├── webhook大纲长截图.png │ ├── 多集群守卫大纲.md │ ├── go基础大纲.md │ ├── 巡检大纲.md │ ├── golang实战大纲.md │ ├── 网络探测大纲.md │ ├── 面试题_大纲.md │ ├── crd大纲.md │ ├── 集群网格大纲.md │ ├── webhook大纲.md │ ├── 运维大师大纲.md │ ├── 7模块-工单大纲.md │ ├── 新源码大纲.md │ ├── 7模块-服务树大纲.md │ ├── k8s平台大纲.md │ ├── 1v1新课程的头脑风暴.md │ ├── 7模块-底座大纲.md │ ├── 7模块-任务执行grpc大纲.md │ ├── prometheus源码大纲.md │ ├── 7模块-k8s大纲.md │ ├── 7模块-cicd大纲.md │ └── 7模块-监控大纲.md ├── webhook │ ├── img_7.png │ ├── img_8.png │ ├── img_9.png │ ├── img_10.png │ └── img_11.png ├── 课程卖点 │ ├── 卖点-新源码解读.png │ ├── 卖点-thanos.png │ ├── 卖点-k8s在离混部-潮汐调度golang开发实战.png │ └── 卖点-aiInfra-大模型-aiOnK8s-gpu-离线训练-volcano调度.png ├── 12.10.jwt临期刷新问题.png ├── prome_remote01.png ├── 新增用户来验证审批组过滤逻辑.png ├── 新源码解读卖点pic │ ├── img.png │ ├── img_1.png │ ├── img_2.png │ ├── img_3.png │ ├── img_4.png │ ├── img_5.png │ └── img_6.png ├── multi_remote_read.jpg ├── gpu和ebpf课程 │ ├── 二次filter.png │ ├── ibgp开关配置不一样.png │ ├── gpu-on-k8s-训练.png │ ├── vxlan的iperf流量.png │ ├── 对比iptables性能更好.png │ ├── gpu和ebpf课程涉及开源项目的源码解读.png │ ├── 使用视频剪辑软件看看gpu利用率能否打上去.png │ └── hubble-ui的trace-prometheus采集.png ├── gpu和ebpf课程涉及开源项目的源码解读.png ├── 7模块_头部打印服务树节点表示a.b.c.d前端展示.png └── k8s在离混布-抄袭调度-动态感知高级运维开发效果图.png ├── kube_pic ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png ├── 9.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png └── 15.png ├── prometheus免费课程 ├── service │ ├── prome_k8s_all_pod │ │ ├── prometheus_storageclass.yaml │ │ ├── kube-stats-metrics │ │ │ ├── service-account.yaml │ │ │ ├── cluster-role-binding.yaml │ │ │ ├── service.yaml │ │ │ ├── deployment.yaml │ │ │ └── cluster-role.yaml │ │ ├── pv.yaml │ │ ├── README.md │ │ ├── rbac.yaml │ │ ├── control_plane_service.yaml │ │ ├── statsfulset.yaml │ │ └── prometheus_config.yaml │ ├── grafana │ │ ├── README.md │ │ └── grafana_k8s.yaml │ ├── m3db │ │ ├── m_query.yml │ │ ├── prometheus.yml │ │ ├── m_query.service │ │ ├── m3dbnode.service │ │ ├── m3db_single_install.sh │ │ └── m3dbnode_single.yaml │ └── prometheus_in_k8s.yml ├── 04_低成本multi_remote_read方案.md ├── 02_k8s监控指标讲解.md ├── 03_时序监控集群存储m3db.md └── 01_prometheus适配k8s采集.md ├── .gitignore ├── thanos课程.md ├── readme_bk.md ├── kube-prometheus课程.md └── 10个k8s运维开发方向.md /pic/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img.png -------------------------------------------------------------------------------- /pic/k8s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s.png -------------------------------------------------------------------------------- /pic/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/qq.png -------------------------------------------------------------------------------- /pic/wx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/wx.png -------------------------------------------------------------------------------- /pic/xy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/xy.png -------------------------------------------------------------------------------- /pic/学浪.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/学浪.png -------------------------------------------------------------------------------- /pic/统计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/统计.png -------------------------------------------------------------------------------- /kube_pic/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/1.png -------------------------------------------------------------------------------- /kube_pic/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/2.png -------------------------------------------------------------------------------- /kube_pic/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/3.png -------------------------------------------------------------------------------- /kube_pic/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/4.png -------------------------------------------------------------------------------- /kube_pic/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/5.png -------------------------------------------------------------------------------- /kube_pic/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/6.png -------------------------------------------------------------------------------- /kube_pic/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/7.png -------------------------------------------------------------------------------- /kube_pic/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/8.png -------------------------------------------------------------------------------- /kube_pic/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/9.png -------------------------------------------------------------------------------- /pic/1v1大纲.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1大纲.png -------------------------------------------------------------------------------- /pic/img_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_12.png -------------------------------------------------------------------------------- /pic/img_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_13.png -------------------------------------------------------------------------------- /pic/img_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_18.png -------------------------------------------------------------------------------- /pic/img_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_20.png -------------------------------------------------------------------------------- /pic/img_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_21.png -------------------------------------------------------------------------------- /pic/img_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_22.png -------------------------------------------------------------------------------- /pic/img_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_23.png -------------------------------------------------------------------------------- /pic/img_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_24.png -------------------------------------------------------------------------------- /pic/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_5.png -------------------------------------------------------------------------------- /pic/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/img_7.png -------------------------------------------------------------------------------- /pic/k8s采集.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s采集.png -------------------------------------------------------------------------------- /pic/mo01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/mo01.png -------------------------------------------------------------------------------- /pic/mo02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/mo02.png -------------------------------------------------------------------------------- /pic/mo03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/mo03.png -------------------------------------------------------------------------------- /pic/mo04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/mo04.png -------------------------------------------------------------------------------- /pic/mo05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/mo05.png -------------------------------------------------------------------------------- /pic/new/e6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/e6.png -------------------------------------------------------------------------------- /pic/qq群二维码.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/qq群二维码.png -------------------------------------------------------------------------------- /pic/代码行数统计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/代码行数统计.png -------------------------------------------------------------------------------- /pic/任务kill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/任务kill.png -------------------------------------------------------------------------------- /pic/切换用户执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/切换用户执行.png -------------------------------------------------------------------------------- /pic/原地升级.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/原地升级.png -------------------------------------------------------------------------------- /pic/反馈01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/反馈01.png -------------------------------------------------------------------------------- /pic/反馈02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/反馈02.png -------------------------------------------------------------------------------- /pic/反馈03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/反馈03.png -------------------------------------------------------------------------------- /pic/反馈04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/反馈04.png -------------------------------------------------------------------------------- /pic/反馈05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/反馈05.png -------------------------------------------------------------------------------- /pic/告警屏蔽.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/告警屏蔽.png -------------------------------------------------------------------------------- /pic/在离混部卖点.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/在离混部卖点.png -------------------------------------------------------------------------------- /pic/工单评论.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/工单评论.png -------------------------------------------------------------------------------- /pic/工单通知全.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/工单通知全.png -------------------------------------------------------------------------------- /pic/第8模块卖点.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/第8模块卖点.png -------------------------------------------------------------------------------- /pic/统计-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/统计-2.png -------------------------------------------------------------------------------- /pic/网络探测介绍.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/网络探测介绍.png -------------------------------------------------------------------------------- /pic/表单设计2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/表单设计2.png -------------------------------------------------------------------------------- /pic/记录/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img.png -------------------------------------------------------------------------------- /pic/飞书卡片.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/飞书卡片.png -------------------------------------------------------------------------------- /kube_pic/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/10.png -------------------------------------------------------------------------------- /kube_pic/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/11.png -------------------------------------------------------------------------------- /kube_pic/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/12.png -------------------------------------------------------------------------------- /kube_pic/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/13.png -------------------------------------------------------------------------------- /kube_pic/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/14.png -------------------------------------------------------------------------------- /kube_pic/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/kube_pic/15.png -------------------------------------------------------------------------------- /pic/7模块_资产统计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/7模块_资产统计.png -------------------------------------------------------------------------------- /pic/gpu新品榜单.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu新品榜单.png -------------------------------------------------------------------------------- /pic/gpu课程规划.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu课程规划.png -------------------------------------------------------------------------------- /pic/grpc的联调.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/grpc的联调.png -------------------------------------------------------------------------------- /pic/ha_arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/ha_arch.png -------------------------------------------------------------------------------- /pic/http-sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/http-sd.png -------------------------------------------------------------------------------- /pic/k8s_node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s_node.png -------------------------------------------------------------------------------- /pic/k8s_obj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s_obj.png -------------------------------------------------------------------------------- /pic/k8s单机详情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s单机详情.png -------------------------------------------------------------------------------- /pic/new/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/img.png -------------------------------------------------------------------------------- /pic/p_target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/p_target.png -------------------------------------------------------------------------------- /pic/thanos卖点.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/thanos卖点.png -------------------------------------------------------------------------------- /pic/并发度滚动执行.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/并发度滚动执行.png -------------------------------------------------------------------------------- /pic/记录/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_1.png -------------------------------------------------------------------------------- /pic/记录/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_2.png -------------------------------------------------------------------------------- /pic/记录/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_3.png -------------------------------------------------------------------------------- /pic/记录/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_4.png -------------------------------------------------------------------------------- /pic/记录/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_5.png -------------------------------------------------------------------------------- /pic/记录/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_6.png -------------------------------------------------------------------------------- /pic/记录/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_7.png -------------------------------------------------------------------------------- /pic/记录/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_8.png -------------------------------------------------------------------------------- /pic/记录/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_9.png -------------------------------------------------------------------------------- /pic/1v1课程/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1课程/img.png -------------------------------------------------------------------------------- /pic/1v1课程/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1课程/img_1.png -------------------------------------------------------------------------------- /pic/1v1课程/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1课程/img_2.png -------------------------------------------------------------------------------- /pic/1v1课程/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1课程/img_3.png -------------------------------------------------------------------------------- /pic/1v1课程/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1课程/img_4.png -------------------------------------------------------------------------------- /pic/1v1课程/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/1v1课程/img_5.png -------------------------------------------------------------------------------- /pic/cicd_img_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/cicd_img_16.png -------------------------------------------------------------------------------- /pic/cicd_img_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/cicd_img_21.png -------------------------------------------------------------------------------- /pic/cicd_img_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/cicd_img_22.png -------------------------------------------------------------------------------- /pic/cicd_img_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/cicd_img_23.png -------------------------------------------------------------------------------- /pic/gpu课程购买详情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu课程购买详情.png -------------------------------------------------------------------------------- /pic/http服务发现标签.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/http服务发现标签.png -------------------------------------------------------------------------------- /pic/k8s_img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s_img_2.png -------------------------------------------------------------------------------- /pic/k8s_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s_server.png -------------------------------------------------------------------------------- /pic/new/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/img_1.png -------------------------------------------------------------------------------- /pic/new/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/img_2.png -------------------------------------------------------------------------------- /pic/new/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/img_3.png -------------------------------------------------------------------------------- /pic/new/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/img_4.png -------------------------------------------------------------------------------- /pic/sidecar形式部署.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/sidecar形式部署.png -------------------------------------------------------------------------------- /pic/大纲pic/面试题.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/大纲pic/面试题.png -------------------------------------------------------------------------------- /pic/记录/img_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_10.png -------------------------------------------------------------------------------- /pic/记录/img_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_11.png -------------------------------------------------------------------------------- /pic/记录/img_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_12.png -------------------------------------------------------------------------------- /pic/记录/img_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_13.png -------------------------------------------------------------------------------- /pic/记录/img_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_14.png -------------------------------------------------------------------------------- /pic/记录/img_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_15.png -------------------------------------------------------------------------------- /pic/记录/img_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_16.png -------------------------------------------------------------------------------- /pic/记录/img_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_17.png -------------------------------------------------------------------------------- /pic/记录/img_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_18.png -------------------------------------------------------------------------------- /pic/记录/img_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_19.png -------------------------------------------------------------------------------- /pic/记录/img_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_20.png -------------------------------------------------------------------------------- /pic/记录/img_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_21.png -------------------------------------------------------------------------------- /pic/记录/img_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_22.png -------------------------------------------------------------------------------- /pic/记录/img_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_23.png -------------------------------------------------------------------------------- /pic/记录/img_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/记录/img_24.png -------------------------------------------------------------------------------- /pic/new/k8s源码-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/new/k8s源码-new.png -------------------------------------------------------------------------------- /pic/webhook/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/webhook/img_7.png -------------------------------------------------------------------------------- /pic/webhook/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/webhook/img_8.png -------------------------------------------------------------------------------- /pic/webhook/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/webhook/img_9.png -------------------------------------------------------------------------------- /pic/大纲pic/调优小课大纲.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/大纲pic/调优小课大纲.png -------------------------------------------------------------------------------- /pic/课程卖点/卖点-新源码解读.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/课程卖点/卖点-新源码解读.png -------------------------------------------------------------------------------- /pic/12.10.jwt临期刷新问题.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/12.10.jwt临期刷新问题.png -------------------------------------------------------------------------------- /pic/prome_remote01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/prome_remote01.png -------------------------------------------------------------------------------- /pic/webhook/img_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/webhook/img_10.png -------------------------------------------------------------------------------- /pic/webhook/img_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/webhook/img_11.png -------------------------------------------------------------------------------- /pic/新增用户来验证审批组过滤逻辑.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新增用户来验证审批组过滤逻辑.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img_1.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img_2.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img_3.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img_4.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img_5.png -------------------------------------------------------------------------------- /pic/新源码解读卖点pic/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/新源码解读卖点pic/img_6.png -------------------------------------------------------------------------------- /pic/课程卖点/卖点-thanos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/课程卖点/卖点-thanos.png -------------------------------------------------------------------------------- /pic/multi_remote_read.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/multi_remote_read.jpg -------------------------------------------------------------------------------- /pic/大纲pic/webhook大纲长截图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/大纲pic/webhook大纲长截图.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/二次filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/二次filter.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程涉及开源项目的源码解读.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程涉及开源项目的源码解读.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/ibgp开关配置不一样.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/ibgp开关配置不一样.png -------------------------------------------------------------------------------- /pic/7模块_头部打印服务树节点表示a.b.c.d前端展示.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/7模块_头部打印服务树节点表示a.b.c.d前端展示.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/gpu-on-k8s-训练.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/gpu-on-k8s-训练.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/vxlan的iperf流量.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/vxlan的iperf流量.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/对比iptables性能更好.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/对比iptables性能更好.png -------------------------------------------------------------------------------- /pic/k8s在离混布-抄袭调度-动态感知高级运维开发效果图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/k8s在离混布-抄袭调度-动态感知高级运维开发效果图.png -------------------------------------------------------------------------------- /pic/课程卖点/卖点-k8s在离混部-潮汐调度golang开发实战.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/课程卖点/卖点-k8s在离混部-潮汐调度golang开发实战.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/gpu和ebpf课程涉及开源项目的源码解读.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/gpu和ebpf课程涉及开源项目的源码解读.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/使用视频剪辑软件看看gpu利用率能否打上去.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/使用视频剪辑软件看看gpu利用率能否打上去.png -------------------------------------------------------------------------------- /pic/gpu和ebpf课程/hubble-ui的trace-prometheus采集.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/gpu和ebpf课程/hubble-ui的trace-prometheus采集.png -------------------------------------------------------------------------------- /pic/课程卖点/卖点-aiInfra-大模型-aiOnK8s-gpu-离线训练-volcano调度.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ning1875/prometheus-guidebook/HEAD/pic/课程卖点/卖点-aiInfra-大模型-aiOnK8s-gpu-离线训练-volcano调度.png -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/prometheus_storageclass.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: storage.k8s.io/v1 2 | kind: StorageClass 3 | metadata: 4 | name: prometheus-lpv 5 | provisioner: kubernetes.io/no-provisioner 6 | volumeBindingMode: WaitForFirstConsumer 7 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/kube-stats-metrics/service-account.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-state-metrics 6 | app.kubernetes.io/version: v1.9.7 7 | name: kube-state-metrics 8 | namespace: kube-system 9 | -------------------------------------------------------------------------------- /prometheus免费课程/service/grafana/README.md: -------------------------------------------------------------------------------- 1 | # 部署工作 2 | ```shell script 3 | # 1. 修改yaml中的节点选择器标签 k8s-node01改为你自己的节点 4 | # 在节点上创建数据目录 5 | mkdir -pv /data/grafana 6 | 7 | 8 | # 2. 部署grafana 9 | kubectl apply -f grafana_k8s.yaml 10 | 11 | # 3. 访问 节点的 :30000端口 账户密码 : admin/admin 12 | # 4. 添加prometheus数据源,如果prometheus是 hostnetwork的,直接写node的ip:port即可 13 | ``` 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | *.exe~ 3 | *.dll 4 | *.dylib 5 | *.test 6 | *.out 7 | *.prof 8 | *.log 9 | *.o 10 | *.a 11 | *.so 12 | *.sw[po] 13 | *.tar.gz 14 | *.[568vq] 15 | [568vq].out 16 | 17 | *.cgo1.go 18 | *.cgo2.c 19 | _cgo_defun.c 20 | _cgo_gotypes.go 21 | _cgo_export.* 22 | _testmain.go 23 | _obj 24 | _test 25 | 26 | /log* 27 | /k8s-mon 28 | /bin 29 | /out 30 | /dist 31 | 32 | .idea 33 | .host_ip 34 | .DS_Store 35 | 60_docker_mon 36 | docker_mon 37 | -------------------------------------------------------------------------------- /prometheus免费课程/service/m3db/m_query.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 3 | evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 4 | query_log_file: /opt/logs/prometheus_query_log 5 | 6 | 7 | remote_read: 8 | - url: "http://192.168.0.106:9090/api/v1/read" 9 | read_recent: true 10 | - url: "http://192.168.0.107:9090/api/v1/read" 11 | read_recent: true 12 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/kube-stats-metrics/cluster-role-binding.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRoleBinding 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-state-metrics 6 | app.kubernetes.io/version: v1.9.7 7 | name: kube-state-metrics 8 | roleRef: 9 | apiGroup: rbac.authorization.k8s.io 10 | kind: ClusterRole 11 | name: kube-state-metrics 12 | subjects: 13 | - kind: ServiceAccount 14 | name: kube-state-metrics 15 | namespace: kube-system 16 | -------------------------------------------------------------------------------- /prometheus免费课程/service/m3db/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 3 | evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 4 | query_log_file: /opt/logs/prometheus_query_log 5 | 6 | 7 | 8 | scrape_configs: 9 | - job_name: node_exporter 10 | honor_timestamps: true 11 | scrape_interval: 15s 12 | scrape_timeout: 10s 13 | static_configs: 14 | - targets: 15 | - localhost:9100 16 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/kube-stats-metrics/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-state-metrics 6 | app.kubernetes.io/version: v1.9.7 7 | name: kube-state-metrics 8 | namespace: kube-system 9 | spec: 10 | clusterIP: None 11 | ports: 12 | - name: http-metrics 13 | port: 8080 14 | targetPort: http-metrics 15 | - name: telemetry 16 | port: 8081 17 | targetPort: telemetry 18 | selector: 19 | app.kubernetes.io/name: kube-state-metrics 20 | -------------------------------------------------------------------------------- /prometheus免费课程/service/m3db/m_query.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description="m_query" 3 | Documentation=https://m_query.io/ 4 | After=network.target 5 | 6 | [Service] 7 | Type=simple 8 | ExecStart=/opt/app/m_query/prometheus --config.file=/opt/app/m_query/prometheus.yml --storage.tsdb.path=/opt/app/m_query/data --web.enable-lifecycle --web.listen-address=0.0.0.0:8090 9 | 10 | Restart=on-failure 11 | RestartSecs=5s 12 | SuccessExitStatus=0 13 | LimitNOFILE=65536 14 | StandardOutput=syslog 15 | StandardError=syslog 16 | SyslogIdentifier=m_query 17 | 18 | 19 | [Install] 20 | WantedBy=multi-user.target 21 | 22 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/pv.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolume 3 | metadata: 4 | name: prometheus-lpv-0 5 | spec: 6 | capacity: 7 | storage: 10Gi 8 | volumeMode: Filesystem 9 | accessModes: 10 | - ReadWriteOnce 11 | persistentVolumeReclaimPolicy: Retain 12 | storageClassName: prometheus-lpv 13 | local: 14 | path: /data/prometheus 15 | nodeAffinity: 16 | required: 17 | nodeSelectorTerms: 18 | - matchExpressions: 19 | - key: kubernetes.io/hostname 20 | operator: In 21 | values: 22 | - k8s-node01 23 | -------------------------------------------------------------------------------- /prometheus免费课程/service/m3db/m3dbnode.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description="M3DB Timeseries Database" 3 | Documentation=https://docs.m3db.io/ 4 | After=network.target 5 | 6 | [Service] 7 | Type=simple 8 | ExecStart=/opt/app/m3db/m3dbnode -f /opt/app/m3db/m3dbnode_single.yaml 9 | Restart=on-failure 10 | SuccessExitStatus=0 11 | 12 | # May not be honored if higher than kernel limit (sysctl fs.file-max) or process 13 | # limit (sysctl fs.nr_open). Also may not be honored if lower than systemd limit 14 | # (system.conf) or systemd user limit (user.conf). 15 | LimitNOFILE=3000000 16 | 17 | [Install] 18 | WantedBy=multi-user.target 19 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/README.md: -------------------------------------------------------------------------------- 1 | # 部署工作 2 | ```shell script 3 | # 1.监控etcd需要创建 secret 4 | kubectl create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=/etc/kubernetes/pki/etcd/ca.crt -n kube-system 5 | 6 | # 2. 修改pv.yaml中的节点选择器标签 k8s-node01改为你自己的节点 7 | # 在节点上创建数据目录 8 | mkdir -pv /data/prometheus 9 | 10 | 11 | # 3. 部署kube-stats-metrics 12 | kubectl apply -f kube-stats-metrics 13 | 14 | # 4. 部署prometheus服务 15 | kubectl apply -f prome_k8s_all_pod/ 16 | 17 | # 5. 使用node的ip:8091即可访问服务 18 | ``` 19 | 20 | -------------------------------------------------------------------------------- /pic/大纲pic/多集群守卫大纲.md: -------------------------------------------------------------------------------- 1 | # k8s集群维护工作的重点 :节点 2 | 3 | 4 | 5 | # 项目背景:为什么需要guard工具 6 | - 多集群的管理:集群多了,故障多了,没有自动处理工具应付不过来 7 | - 异常节点的自动禁止:节点的异常影响,但是kubelet感知不到,还是往这个节点调度,运行的pod会有异常 8 | - 异常pod的自动处理 9 | - 自动恢复加入集群 10 | - 集群中宕机机器多了的维修问题 11 | - gpu坏卡自动 驱逐pod 维修机器 12 | 13 | 14 | # 发现 上报 处理 恢复 15 | 16 | 17 | # 设计模式 架构图 18 | 19 | 20 | ## 获取异常的标准 21 | - prometheus查询 22 | - agg_over_time 解决误报问题,确定问题已经持续了一段时间 23 | 24 | ## 无需关心 25 | 26 | 27 | ## 节点的异常影响,但是kubelet感知不到,还是往这个节点调度,运行的pod会有异常 28 | - 基础架构守护程序问题:ntp 服务关闭; 29 | - 硬件问题:CPU、内存或磁盘故障; 30 | - 内核问题:内核死锁、损坏的文件系统; 31 | - 容器运行时问题:无响应的运行时守护进程; 32 | 33 | # 01 k8s节点的问题检测工具 https://github.com/kubernetes/node-problem-detector 34 | - daemonset 部署到节点 35 | - 检查各个方向的异常 36 | - 给节点打condition 和event 上报到apiserver 37 | - 交给其它处理组件处理 38 | 39 | 40 | # 02 -------------------------------------------------------------------------------- /thanos课程.md: -------------------------------------------------------------------------------- 1 | 2 | # 源码级别教程地址 3 | - [源码级别教程地址](https://ke.qq.com/course/3883439?tuin=361e95b0) 4 | 5 | 6 | # thanos项目总结 7 | - sidecar架构图 8 | ![image](./pic/sidecar形式部署.png) 9 | 10 | 11 | 12 | 13 | ## 核心优点总结 14 | - 无需维护存储,存储高可用: 利用廉价的公有云对象存储,高可用 15 | - 长时间存储,数据降采样:利用Compactor降采样 16 | - 完全适配原生prometheus查询接口:Query实现 17 | - 多级数据缓存配置 18 | 19 | ## 怎样才能用好thanos 20 | - 需要对prometheus 有很深入的理解 21 | - 包括查询的流程 22 | - 查询的接口 23 | - tsdb存储的问题 24 | - 数据交互的主要流程 25 | - 如果你有很好的prometheus源码接触,再看thanos就水到渠成了。 26 | 27 | > thanos的重点是 28 | 29 | - 理清楚thanos每个组件存在的意思是什么 30 | - 每个组件都干了什么 31 | > 为什么说prometheus的源码理解很重要 32 | - 因为thanos的每个模块都是为了解决prometheus解决不了或者解决不好的问题 33 | 34 | # 我看thanos源码的心得 35 | - 因为我对prometheus拿捏的死死的 36 | - 所以thanos每个项目我都能猜到要干什么 37 | - 再结合源码一看就清晰了 38 | 39 | 40 | # 在调优thanos之前请先了解上面的东西 41 | - 基础不牢,只能出一个新组件追一个,但是每个都不知道在干什么 -------------------------------------------------------------------------------- /pic/大纲pic/go基础大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 课程大纲 4 | 5 | - 第2章 基础语法和基础数据类型 6 | - 01_基础语法 7 | - 02_基础数据类型 8 | - 03_字符串 9 | - 04_复合数据类型数组和切片 10 | - 05_go中的map和锁 11 | - 第3章 go中的锁和管道 12 | - 01分片锁map 13 | - 02带过期时间map 14 | - 03通道同步异步模式 15 | - 04chan中close和select的作用 16 | - 05流程控制01 17 | - 05流程控制02 18 | - 07函数01 19 | - 08defer和return和匿名函数 20 | 21 | 22 | - 第4章 结构体,面向对象和接口 23 | - 01defer和panic的关系 24 | - 02_操作结构体和结构体可见性 25 | - 03结构体深浅拷贝 26 | - 04面向对象和接口 27 | - 05错误处理和IO操作 28 | - 06自定义io.Reader 29 | - 07常见io函数 30 | 31 | 32 | - 第4章 反射、包导入形式和调用链 33 | - map增量更新 34 | - 02反射查看对象和反射调用方法 35 | - 03反射标签获取 36 | - 04路径、目录名、包名、文件名的关系 37 | - 05包导入形式和调用链 38 | - 06发布我们自己的模块多版本管理 39 | - 07goget和go install的区别 40 | - 08单元测试01 41 | 42 | - 第5章 http探测项目、单测、日志 43 | - http探测项目讲解 44 | - 02单元测试01 45 | - 02单元测试02 46 | - 04基准测试 47 | - 05日期处理 48 | - 06日志处理和hook 49 | 50 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/rbac.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 # api的version 2 | kind: ClusterRole # 类型 3 | metadata: 4 | name: prometheus 5 | rules: 6 | - apiGroups: [""] 7 | resources: # 资源 8 | - nodes 9 | - nodes/proxy 10 | - services 11 | - endpoints 12 | - pods 13 | verbs: ["get", "list", "watch"] 14 | - apiGroups: 15 | - extensions 16 | resources: 17 | - ingresses 18 | verbs: ["get", "list", "watch"] 19 | - nonResourceURLs: ["/metrics"] 20 | verbs: ["get"] 21 | --- 22 | apiVersion: v1 23 | kind: ServiceAccount 24 | metadata: 25 | name: prometheus # 自定义名字 26 | namespace: kube-system # 命名空间 27 | --- 28 | apiVersion: rbac.authorization.k8s.io/v1 29 | kind: ClusterRoleBinding 30 | metadata: 31 | name: prometheus 32 | roleRef: # 选择需要绑定的Role 33 | apiGroup: rbac.authorization.k8s.io 34 | kind: ClusterRole 35 | name: cluster-admin 36 | subjects: # 对象 37 | - kind: ServiceAccount 38 | name: prometheus 39 | namespace: kube-system 40 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/control_plane_service.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | namespace: kube-system 6 | name: kube-scheduler 7 | labels: 8 | k8s-app: kube-scheduler 9 | spec: 10 | selector: 11 | component: kube-scheduler 12 | ports: 13 | - name: http-metrics 14 | port: 10259 15 | targetPort: 10259 16 | protocol: TCP 17 | 18 | --- 19 | apiVersion: v1 20 | kind: Service 21 | metadata: 22 | namespace: kube-system 23 | name: kube-controller-manager 24 | labels: 25 | k8s-app: kube-controller-manager 26 | spec: 27 | selector: 28 | component: kube-controller-manager 29 | ports: 30 | - name: http-metrics 31 | port: 10257 32 | targetPort: 10257 33 | protocol: TCP 34 | 35 | --- 36 | apiVersion: v1 37 | kind: Service 38 | metadata: 39 | namespace: kube-system 40 | name: kube-etcd 41 | labels: 42 | k8s-app: kube-etcd 43 | spec: 44 | selector: 45 | component: etcd 46 | tier: control-plane 47 | ports: 48 | - name: http-metrics 49 | port: 2379 50 | targetPort: 2379 51 | protocol: TCP 52 | 53 | -------------------------------------------------------------------------------- /readme_bk.md: -------------------------------------------------------------------------------- 1 | 2 | # 项目说明 3 | >这是一个免费的prometheus底层原理课程(当然是精简版的) 4 | 5 | > 主要介绍两大块内容,这也是大家常见的问题 6 | - prometheus采集k8s的原理 7 | - prometheus的高可用存储怎么做 8 | 9 | # 付费全方位教程 10 | > 如果想进一线互联网大厂从事监控运维/开发的工作(冲击35k+的月薪) 11 | 12 | > 需要更全面的了解Prometheus底层原理,并有高可用实战项⽬经验。 13 | 14 | > 可以购买下面的付费课程, 15 | 16 | - 课程链接:[prometheus全组件配置使用、底层原理解析、高可用实战](https://ke.qq.com/course/3549215?tuin=361e95b0) 17 | ## 付费课程介绍 18 | 19 | 1. 学完这个课程,你可以可以搭建如下架构哦 20 | ![image](./pic/ha_arch.png) 21 | 22 | 2. 门课目标用户收益 23 | - 一线运维人员:学习使用、熟悉配置、掌握调优、升职加薪 24 | - 可以从头到尾熟悉prometheus、各种exporter、alertmanager、grafana、m3db、loki等组件的使用配置 25 | - 熟悉主流exporter(中间件、存储)的告警表达式配置 26 | - 同时能掌握相关组件调优的经验 27 | 28 | - 运维开发人员:学习高性能原理,可助⼒斩获⼤⼚监控运维开发offer 29 | - 从源码级别了解prometheus高性能的设计方案 30 | - 掌握二次开发相关组件的能力 31 | - 了解分布式系统高可用改造方案 32 | 33 | 34 | # 免费课程目录导航 35 | - [01 prometheus采集k8s底层原理](./01_prometheus适配k8s采集.md) 36 | - [02 k8s监控指标讲解](./02_k8s监控指标讲解.md) 37 | - [03 时序监控集群存储m3db](./03_时序监控集群存储m3db.md) 38 | - [04 低成本multi_remote_read方案](./04_低成本multi_remote_read方案.md) 39 | 40 | ## 免费课程链接 41 | - 链接:[prometheus为了适配k8s监控的改造,高可用时序监控存储实战](https://ke.qq.com/course/3517990?taid=12068265399791142&tuin=361e95b0) -------------------------------------------------------------------------------- /pic/大纲pic/巡检大纲.md: -------------------------------------------------------------------------------- 1 | 2 | k8s运维大师的课程:https://ke.qq.com/course/5586848 3 | 4 | 5 | - 第1章 开篇词 6 | - 1.1 简介 7 | 8 | - 第2章 巡检系统简介 9 | - 2.1 什么是巡检系统和为什么要巡检 10 | - 2.2 预期结果展示 11 | 12 | - 第3章 架构设计 13 | - 3.1 processon 架构设计 14 | 15 | - 第4章 mysql表设计 16 | - 4.1 安装mysql和Navicat 17 | - 4.2 基线 脚本表结构设计 18 | - 4.3 任务 结果表结构设计 19 | 20 | 21 | - 第5章 代码目录设计和准备工作 22 | - 5.1 代码目录和server端配置文件设计 23 | - 5.2 server端启动服务编排 24 | 25 | - 第6章 数据库操作相关 26 | - 6.1 数据库连接和字段翻译成go的struct 27 | - 6.2 其他剩余表的结构并添加索引 28 | 29 | - 第7章 web操作 30 | - 7.1 web-server和响应库 31 | - 7.2 脚本的增删改查的view函数 32 | - 7.3 其他剩余对象的增删改查的view函数 33 | 34 | - 第8章 服务端作业下发管理器 35 | - 8.1 设计CheckJobManager对象和周期性下发任务 36 | - 8.2 用数据库做调谐下发任务 37 | - 8.3 go-ansible下发任务 38 | - 8.4 封装任务下发的playbook并执行 39 | 40 | - 第9章 任务下发的核心流程 41 | - 9.1 任务下发的核心流程 42 | - 9.2 测试任务下发 43 | 44 | - 第10章 agent侧执行的流程 45 | - 10.1 agent的基础代码 46 | - 10.2 测试agent 47 | - 10.3 补全server的node-result-report接口 48 | 49 | - 第11章 server端的计算逻辑 50 | - 11.1 计算作业成功率 51 | - 11.2 metrics打点暴露指标 52 | 53 | - 第12章 确定巡检项目和脚本 54 | - 12.1 确定巡检项目 55 | - 12.2 通用的k8s节点脚本 56 | 57 | - 第13章 联调测试和grafana大盘 58 | - 13.1 在宿主机上测试 59 | - 13.2 grafana大盘准备 60 | - 13.3 打镜像部署到k8s中联调 61 | - 13.4 容器中的ansible处理 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/kube-stats-metrics/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-state-metrics 6 | app.kubernetes.io/version: v1.9.7 7 | name: kube-state-metrics 8 | namespace: kube-system 9 | spec: 10 | replicas: 1 11 | selector: 12 | matchLabels: 13 | app.kubernetes.io/name: kube-state-metrics 14 | template: 15 | metadata: 16 | labels: 17 | app.kubernetes.io/name: kube-state-metrics 18 | app.kubernetes.io/version: v1.9.7 19 | spec: 20 | containers: 21 | - image: quay.io/coreos/kube-state-metrics:v1.9.7 22 | livenessProbe: 23 | httpGet: 24 | path: /healthz 25 | port: 8080 26 | initialDelaySeconds: 5 27 | timeoutSeconds: 5 28 | name: kube-state-metrics 29 | ports: 30 | - containerPort: 8080 31 | name: http-metrics 32 | - containerPort: 8081 33 | name: telemetry 34 | readinessProbe: 35 | httpGet: 36 | path: / 37 | port: 8081 38 | initialDelaySeconds: 5 39 | timeoutSeconds: 5 40 | nodeSelector: 41 | kubernetes.io/os: linux 42 | serviceAccountName: kube-state-metrics 43 | -------------------------------------------------------------------------------- /pic/大纲pic/golang实战大纲.md: -------------------------------------------------------------------------------- 1 | # 课程大纲 2 | 3 | - 第1章 运维平台介绍和准备工作 4 | - 1.1 运维开发系统分类和运维平台编写方法论 5 | - 1.2 本课程模块架构介绍 6 | 7 | # 第1部分 服务树 8 | 9 | - 第2章 服务树服务标识path表设计 10 | - 2.1 服务树项目组织目录和整体架构说明 11 | - 2.2 master基础代码之命令行参数和配置文件 12 | - 2.3 服务树服务标识path表设计 13 | - 2.4 path表查询需求分析和分类实现 14 | 15 | - 第3章 服务树资源操作之agent采集上报 16 | - 3.1 go编排之oklog-run 17 | - 3.2 agent和server之间的json-rpc通信 18 | - 3.3 agent采集信息模块并rpc推送给server 19 | - 3.4 设计机器表并接收rpc数据写入 20 | 21 | - 第4章 服务树资源挂载到树节点 22 | - 4.1 node_path操作的函数添加gin的支持 23 | - 4.2 设计资源挂载到树的逻辑 24 | 25 | - 第5章 服务树共有云资源同步模块 26 | - 5.1 同步模块主逻辑 27 | 28 | - 第6章 服务树资源查询和倒排索引模块 29 | - 6.1 倒排索引原理讲解 30 | - 6.2 写倒排索引interface 31 | - 6.3 刷索引的同时用g.p.a更新下path表 32 | - 6.4 利用倒排索引统计功能的接口 33 | - 第7章 服务树使用prometheus-sdk打统计数据 34 | - 7.1 使用prometheus-sdk打统计数据 35 | 36 | # 第2部分 日志监控 37 | - 第8章 日志监控架构分析和准备工作 38 | - 8.1 时序监控和日志监控的对比,分析日志监控的核心诉求 39 | - 8.2 golang实战项目log2metrics架构说明 40 | - 8.3 准备工作,编写配置文件,解析配置,校验正则,设置log 41 | - 第9章 日志监控消费者组和正则处理 42 | - 9.1 日志任务增量更新管理器和具体的日志job对象 43 | - 9.2 日志消费组和日志正则处理对象AnalysPoint 44 | - 9.3 时序统计的结构体对象和metrics结果打点方法 45 | - 9.4 agent和server同步logjob并测试 46 | 47 | # 第3部分 任务执行中心 48 | - 第10章 任务执行中心 49 | - 10.1 架构分析和表设计 50 | - 10.2 服务端逻辑task任务缓存,task配置和web打通,task的rpc下发 51 | - 10.3 客户端逻辑agent接受任务执行并上报结果 52 | - 10.4 编译运行测试 53 | 54 | # 第4部分 分布式ping探测 55 | - 第11章 分布式ping探测 56 | - 11.1 网络监控工具调研和xprober架构分析 57 | - 11.2 客户端逻辑之执行探测并上报结果 58 | - 11.3 服务端生成探测池、聚合探测结果 59 | - 11.4 编译运行测试 60 | -------------------------------------------------------------------------------- /pic/大纲pic/网络探测大纲.md: -------------------------------------------------------------------------------- 1 | # why 为什么需要在k8s中进行网络探测 2 | - 在k8s中 网络链路比较复杂 3 | - k8s运维经常需要排查问题,但是不能第一时间定位 4 | - 需要一个探测项目提供数据 5 | 6 | # 本课程适合哪些学员 7 | - 想去写运维平台的同学 8 | - 缺乏go项目实战经验 9 | 10 | 11 | # 学习本课程需要具备的技能 12 | - 后端:go有点基础即可 13 | 14 | # 本课程主要卖点 15 | - 网络探测 c/s架构设计 ,属于运维的一个高频需求 or 项目 16 | - prometheus 自定义exporter的开发 17 | - http 交互模式 18 | - 部署在k8s中的daemonset探针和deployment server端 19 | 20 | # 20个课程简介 21 | ```shell 22 | p0 零基础入门 23 | p1 高可用调优 24 | p2 kube-prom 25 | p3 prom二开 26 | p4 p监控k8 27 | k0 零基础入门 28 | k1-k3 k8s源码 29 | k4 operator开发 30 | k5 运维大师 31 | k6 二开调度器 32 | g1 零基础入门 33 | g2 运维平台 34 | g3 巡检平台 35 | c1 tekton 36 | thanos + go99 + 职业规划+直播免费 不计入统计 37 | 总结:prometheus 6个 + k8s 8个 + go5个+cicd1个 =22 个 38 | 上面是对买课同学的标记和对应的课程,方便答疑时区分 39 | 40 | ``` 41 | 42 | 43 | 44 | # 目录 45 | 46 | - 第1章 开篇词 47 | - 1.1 开篇词 48 | 49 | - 第2章 需求分析和架构设计 50 | - 2.1 需求分析和架构设计 51 | - 第3章 代码目录结构 52 | - 3.1 代码目录结构 53 | - 第4章 agent基础代码 54 | - 4.1 代码目录结构 55 | - 4.2 自定义exporter核心实现prometheus的collector 56 | - 4.3 定义探测的single-target 57 | - 4.4 agent暴露prometheus-sdk 58 | - 第5章 agent4种探针代码 59 | - 5.1 tcp探针 60 | - 5.2 dns探针 61 | - 5.3 http探针 62 | - 5.4 ping探针 63 | 64 | - 第6章 agent从server端获取target的逻辑 65 | - 6.1 使用k8s-wait后台刷新 66 | 67 | - 第7章 server端基础代码 68 | - 7.1 server侧引用go-restful 启动web 69 | - 7.2 go-restful-view处理函数和validator校验器 70 | - 7.3 给store存储定义接口 71 | - 7.4 实现file类型的存储 72 | - 7.5 初始化存储并开启定时重载到缓存的任务 73 | 74 | - 第8章 c/s本地联调 75 | - 8.1 python请求更新targets 76 | - 8.2 解决ping超时不生效问题 77 | - 第9章 容器化k8s部署 78 | - 9.1 准备dockerFile打镜像推送到阿里云 79 | - 9.2 准备server的deployment yaml 80 | - 9.3 准备agent的daemonset yaml 81 | - 第10章 绘制grafana大盘 82 | - 10.1 再次解决ping域名超时问题 83 | - 10.2 绘制grafana大盘 -------------------------------------------------------------------------------- /prometheus免费课程/service/m3db/m3db_single_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | systemctl stop m3dbnode 5 | # 慎重哦 6 | rm -rf /opt/app/m3db 7 | # 创建目录 8 | mkdir -p /opt/app/m3db/data/{m3db,m3kv} 9 | # 拷贝文件 10 | /bin/cp -f m3dbnode /opt/app/m3db/m3dbnode 11 | /bin/cp -f m3dbnode_single.yaml /opt/app/m3db/m3dbnode_single.yaml 12 | # 设置内核参数 13 | sysctl -w vm.max_map_count=3000000 14 | sysctl -w vm.swappiness=1 15 | sysctl -w fs.file-max=3000000 16 | sysctl -w fs.nr_open=3000000 17 | ulimit -n 3000000 18 | 19 | grep 'vm.max_map_count = 3000000' /etc/sysctl.conf || cat >> /etc/sysctl.conf <<'EOF' 20 | # m3db 21 | vm.max_map_count = 3000000 22 | vm.swappiness = 1 23 | fs.file-max = 3000000 24 | fs.nr_open = 3000000 25 | EOF 26 | 27 | # 复制service文件 28 | sudo /bin/cp -f -a m3dbnode.service /etc/systemd/system/m3dbnode.service 29 | systemctl daemon-reload 30 | systemctl start m3dbnode 31 | systemctl status m3dbnode 32 | 33 | 34 | # 创建namespace和placement 35 | curl -X POST http://localhost:7201/api/v1/database/create -d '{ 36 | "type": "local", 37 | "namespaceName": "default", 38 | "retentionTime": "48h", 39 | "numShards": "8" 40 | }' 41 | 42 | # 查看初始化状态 43 | curl http://localhost:7201/api/v1/services/m3db/placement |python -m json.tool 44 | # ready一下 45 | 46 | #!/bin/bash 47 | curl -X POST http://localhost:7201/api/v1/services/m3db/namespace/ready -d '{ 48 | "name": "default" 49 | }' 50 | 51 | # 写入测试数据 52 | #!/bin/bash 53 | curl -X POST http://localhost:7201/api/v1/json/write -d '{ 54 | "tags": 55 | { 56 | "__name__": "third_avenue", 57 | "city": "new_york", 58 | "checkout": "1" 59 | }, 60 | "timestamp": '\"$(date "+%s")\"', 61 | "value": 3347.26 62 | }' 63 | # 查询测试数据 64 | 65 | curl -X "POST" -G "http://localhost:7201/api/v1/query_range" \ 66 | -d "query=third_avenue" \ 67 | -d "start=$(date "+%s" -d "45 seconds ago")" \ 68 | -d "end=$( date +%s )" \ 69 | -d "step=5s" -------------------------------------------------------------------------------- /pic/大纲pic/面试题_大纲.md: -------------------------------------------------------------------------------- 1 | k8s和golang面试真题解析 运维开发面试经验分享 2 | 3 | # 第0部分 小乙老师面试经验分享 4 | - 第0章 小乙老师面试经验分享 5 | - 0.1 小乙老师面试经验分享 6 | 7 | # 第1部分 linux操作系统内核相关 8 | 9 | - 第1章 linux操作系统相关 10 | - 1.1 linux cpu监控-中断-进程-相关 11 | - 1.2 linux 内存相关 12 | - 1.3 linux io相关 13 | 14 | # 第2部分 go语言和算法相关 15 | 16 | - 第2章 go语言和算法相关 17 | - 2.1 go语言基础易考点 18 | - 2.2 go语言调度相关 19 | - 2.3 go语言实战算法解析之编排 20 | - 2.4 go语言实战算法解析之一致性哈希 21 | - 2.5 go语言实战算法解析之二分法和二叉树 22 | - 2.6 go语言实战算法解析之字符串交替打印 23 | - 2.7 go语言实战算法解析之排序 24 | - 2.8 go语言实战算法解析之翻转和布隆过滤器 25 | - 2.9 go语言实战算法解析之队列和栈 26 | 27 | # 第3部分 k8s集群调优相关 28 | 29 | - 第3章 k8s集群调优相关 控制面etcd调优 30 | - 3.1 etcd核心监控指标和cpu磁盘调优 31 | - 3.2 etcd参数调优 32 | - 3.3 etcd拆分event 来自运维大师12.1 33 | 34 | - 第4章 控制面apiserver调优 35 | - 4.1 apiserver核心监控指标 36 | - 4.2 apiserver参数调优 37 | 38 | - 第5章 kubelet 调优 39 | - 5.1 kubelet 参数调优 40 | 41 | - 第6章 提升集群利用率的4种方法 来自运维大师课程 14.2 42 | - 6.1 提升集群利用率的4种方法 来自运维大师课程 14.2 43 | 44 | # 第4部分 k8s源码原理相关 45 | - 第7章 k8s源码原理相关 46 | - 7.1 容器相关 47 | - 7.2 kubectl apply源码三方diff 原理 48 | - 7.3 informer核心结构和作用 49 | - 7.4 sharedInformer resync_period和relist 50 | - 7.5 为什么k8s不支持io限速 51 | - 7.6 k8s删除策略-删除deployment的顺序 52 | - 7.7 dockerd 和containerd作为cri 创建容器链路区别 53 | - 7.8 hpa和vpa的流程 54 | - 7.9 Pod和Service之间的通信和iptables规则解析 55 | - 7.10 openkruise原地升级原理 56 | 57 | # 第5部分 运维开发项目相关 58 | 59 | 60 | 61 | # 有golang基础的想往k8s运维开发进阶走的 62 | - 再k8s中的网络探测吧,作为写golang的一个小的实战项目 [06_k8s中的网络探测吧,作为写golang的一个小的实战项目](https://ke.qq.com/course/5860635) 63 | - [02_golang运维平台实战,服务树,日志监控,任务执行,分布式探测](https://ke.qq.com/course/4334675) 64 | 65 | - [01_k8s运维大师课程](https://ke.qq.com/course/5586848) 66 | - [02_k8s-operator和crd实战开发 助你成为k8s专家](https://ke.qq.com/course/5458555) 67 | - [03_k8s二次开发之基于真实负载的调度器](https://ke.qq.com/course/5814034) 68 | - [04_go运维开发实战之k8s多集群自动守卫自愈组件k8s-cluster-guard](https://ke.qq.com/course/5925095) 69 | - [05_k8s管理运维平台实战前端vue后端golang](https://ke.qq.com/course/5856444) 70 | 71 | 72 | -------------------------------------------------------------------------------- /kube-prometheus课程.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # kube-prometheus项目理解起来有难度,需要你对k8s和prometheus有较深的理解。本课程内容如下 4 | 5 | - 内置的k8s采集任务都采集了什么指标,应用了哪些prometheus技术 6 | - 内置的grafana-dashboard看图都包含什么图表,动态dashboard怎么做的 7 | - 专家级别的promql怎么写的 8 | - apiserver6层slo预聚合到底怎么做的 9 | - 为什么要加着一层kube-rbac-proxy代理 10 | - 怎样把我的golang代表打包部署到k8s中,暴露metrics,使用prometheus基础的pod_sd采集 11 | - 怎样把我自定义的指标应用到prometheus-operator中 12 | kube-prometheus和prometheus-operator实战和原理介绍 ,课程地址https://ke.qq.com/course/3912017?tuin=361e95b0 13 | 14 | # 这一切的一切仅在这里 15 | - [kube-prometheus和prometheus-operator史诗级教程](https://ke.qq.com/course/3912017?tuin=361e95b0) 16 | 17 | # prometheus-guidebook git仓库地址 18 | - [guidebook仓库地址](https://github.com/ning1875/prometheus-guidebook) 19 | 20 | # kube-prometheus解决了哪些问题 21 | ![image](./kube_pic/6.png) 22 | - 一键化部署k8s-prometheus中的所有组件 23 | - 复杂的k8s采集自动生成 24 | - 内置了很多alert和record rule,专业的promql,不用我们自己写了 25 | - 多级嵌套的record计算如apiserver的slo 26 | - 使用 Prometheus Operator 框架及其自定义资源,使指标的接入可以由业务方自行配置,无需监控管理员介入 27 | 28 | 29 | 30 | # kube-prometheus采集难点 31 | ![image](./kube_pic/4.png) 32 | 33 | - kube-prometheus内置的k8s采集任务都采集了什么 34 | - 怎么采集到了 35 | - 为什么要采集这些 36 | - 用了哪些优化手段 37 | 38 | 39 | # kube-prometheus内置的grafana-dashboard看图分析难点 40 | ![image](./kube_pic/5.png) 41 | - 内置的grafana-dashboard看图都包含什么图表 42 | - 为什么要设置这些图表 43 | - 6层slo预聚合到底怎么做的 44 | - 动态dashboard怎么实现的 45 | 46 | 47 | # kube-prometheus内置的告警和预聚合分析,6层预聚合slo原理 48 | ![image](./kube_pic/14.png) 49 | - 内置的告警包含哪些规则 50 | - 怎么配置上去的 51 | - apiserver6层slo预聚合到底怎么做的 52 | - 我怎样去自定义规则 53 | 54 | 55 | 56 | # kube-rbac 鉴权是干什么的 57 | - 为什么要加着一层 58 | - 和envoy项目什么关系 59 | - 如果代理upstream的流量 60 | 61 | # 怎样把我自定义的指标应用到prometheus-operator中 62 | ![image](./kube_pic/11.png) 63 | - 如何用go编写项目部署到k8s的pod中 64 | - prometheus原始的k8s_pod_sd怎么采集自定义指标 65 | - 怎样使用serviceMonitor方式接入 66 | 67 | 68 | 69 | 70 | # 如何利用阿里云构建国外的镜像 71 | 72 | ![image](./kube_pic/1.png) 73 | ![image](./kube_pic/2.png) 74 | ![image](./kube_pic/3.png) 75 | - 为何要关闭代码缓存 76 | 77 | 78 | # 这一切的一切仅在这里 79 | - [kube-prometheus和prometheus-operator史诗级教程](https://ke.qq.com/course/3912017?tuin=361e95b0) 80 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/kube-stats-metrics/cluster-role.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-state-metrics 6 | app.kubernetes.io/version: v1.9.7 7 | name: kube-state-metrics 8 | rules: 9 | - apiGroups: 10 | - "" 11 | resources: 12 | - configmaps 13 | - secrets 14 | - nodes 15 | - pods 16 | - services 17 | - resourcequotas 18 | - replicationcontrollers 19 | - limitranges 20 | - persistentvolumeclaims 21 | - persistentvolumes 22 | - namespaces 23 | - endpoints 24 | verbs: 25 | - list 26 | - watch 27 | - apiGroups: 28 | - extensions 29 | resources: 30 | - daemonsets 31 | - deployments 32 | - replicasets 33 | - ingresses 34 | verbs: 35 | - list 36 | - watch 37 | - apiGroups: 38 | - apps 39 | resources: 40 | - statefulsets 41 | - daemonsets 42 | - deployments 43 | - replicasets 44 | verbs: 45 | - list 46 | - watch 47 | - apiGroups: 48 | - batch 49 | resources: 50 | - cronjobs 51 | - jobs 52 | verbs: 53 | - list 54 | - watch 55 | - apiGroups: 56 | - autoscaling 57 | resources: 58 | - horizontalpodautoscalers 59 | verbs: 60 | - list 61 | - watch 62 | - apiGroups: 63 | - authentication.k8s.io 64 | resources: 65 | - tokenreviews 66 | verbs: 67 | - create 68 | - apiGroups: 69 | - authorization.k8s.io 70 | resources: 71 | - subjectaccessreviews 72 | verbs: 73 | - create 74 | - apiGroups: 75 | - policy 76 | resources: 77 | - poddisruptionbudgets 78 | verbs: 79 | - list 80 | - watch 81 | - apiGroups: 82 | - certificates.k8s.io 83 | resources: 84 | - certificatesigningrequests 85 | verbs: 86 | - list 87 | - watch 88 | - apiGroups: 89 | - storage.k8s.io 90 | resources: 91 | - storageclasses 92 | - volumeattachments 93 | verbs: 94 | - list 95 | - watch 96 | - apiGroups: 97 | - admissionregistration.k8s.io 98 | resources: 99 | - mutatingwebhookconfigurations 100 | - validatingwebhookconfigurations 101 | verbs: 102 | - list 103 | - watch 104 | - apiGroups: 105 | - networking.k8s.io 106 | resources: 107 | - networkpolicies 108 | verbs: 109 | - list 110 | - watch 111 | -------------------------------------------------------------------------------- /pic/大纲pic/crd大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | - 第1章 operator基础知识 6 | - 第2章 K8s日志采集最佳实践 7 | - 第3章 小白的第一个operator实战项目用kubebuilder生成 8 | - 3.1 日志operator需求和yaml设计 9 | - 3.2 用kubebuilder生成框架代码 10 | - 3.3 编写逻辑之定义日志后端写入管理器 11 | - 3.4 调谐logBackend处理新增的逻辑 12 | - 3.5 处理logBackend的status子资源 13 | - 3.6 新增完成后将spec更新到annotation中 14 | - 3.7 调谐处理logBackend的更新 15 | - 3.8 了解k8s对象删除流程和Finalizers 16 | - 3.9 给logBackend自定义删除终结器 17 | - 3.10 在日志管理器中删除lb 18 | - 第4章 logoperator 中collectrule 19 | - 4.1 思考采集规则crd的yaml 20 | - 4.2 定义collectrule spec结构体 21 | - 4.3 将collectrule改成集群范围生效 22 | - 4.4 给调谐对象添加coreclient写个获取pod-log的demo 23 | - 4.5 调谐内部逻辑失败requeue的选择 24 | - 4.6 定义采集规则管理器 25 | - 4.7 单一采集规则对日志的处理函数 26 | - 4.8 修改之前的logbackend写入逻辑 27 | 28 | - 第5章 collectrule采集主正则的处理 29 | - 5.1 collectrule采集主正则的处理逻辑 30 | - 5.2 准备打印日志的pod服务 31 | - 5.3 修复控制器重启不接管running的lb-cr的问题 32 | - 5.4 部署测试collectrule采集主正则 33 | 34 | - 第6章 collectrule告警正则的处理 35 | - 6.1 编写发送钉钉的逻辑 36 | - 6.2 在collectrule中加入处理告警的逻辑 37 | - 6.3 部署测试告警正则 38 | 39 | - 第7章 webhook校验用户配置的CRD 40 | - 7.1 webhook在collectrule中的应用 41 | - 7.2 kubebuilder 开启collectrule的webhook 42 | - 7.3 编写collectrule创建的校验方法 43 | - 7.4 部署证书管理器和webhook 44 | - 7.5 将logbackend_dir映射到宿主上 45 | - 7.6 创建cr验证webhook 46 | 47 | - 第8章 collectrule的修改和删除 48 | - 8.1 collectrule的删除调谐 49 | - 8.2 collectrule的变更调谐 50 | 51 | - 第9章 cicd流水线项目基础信息 52 | - 9.1 流水operator需求和yaml设计 53 | - 9.2 用kubebuilder生成框架代码 54 | - 9.3 编写MytaskSpec对象 55 | - 9.4 定义MytaskRunSpec对象 56 | - 9.5 MyTaskRun调谐新对象判定的新方法 57 | - 9.6 MyTaskRun中校验参数和ws 58 | - 9.7 MyTaskRun中创建pod的变量替换 59 | - 9.8 MyTaskRun中创建pod的公共volumes 60 | - 9.9 MyTaskRun为每个step生成容器和volume 61 | - 9.10 进行单step的测试 62 | 63 | - 第10章 cicd流水线项目之clone-gen 64 | - 10.1 更新MyTaskRun的状态 65 | - 10.2 pod状态和step切换的效果测试 66 | - 10.3 容器执行命令改为脚本全路径 67 | - 10.4 流水线项目 git-clone 68 | - 10.5 私有仓库ssh-key鉴权问题 69 | - 10.6 生成推送镜像的随机字符串标签 70 | 71 | - 第11章 cicd流水线项目之build-push-apply 72 | - 11.1 build和push 73 | - 11.2 go项目构建时引用私有仓库的解决方法 74 | - 11.3 上线到k8s之apply-yaml 75 | - 11.4 上线到k8s之set-image 76 | 77 | - 第12章 组合这些步骤成流水线 78 | - 12.1 修改kaniko代码支持从result读取image-url 79 | - 12.2 准备目标服务token-auth 80 | - 12.2 准备目标服务token-auth 81 | - 12.3 clone-build-push流水线 82 | - 12.4 set-image全流水线 83 | 84 | 85 | - 自定义pipelines 和多租户系统 86 | - operator开发总结心得 87 | 88 | -------------------------------------------------------------------------------- /prometheus免费课程/04_低成本multi_remote_read方案.md: -------------------------------------------------------------------------------- 1 | # 文章地址 2 | - https://zhuanlan.zhihu.com/p/368868988 3 | # 架构图 4 | ![image](../pic/multi_remote_read.jpg) 5 | 6 | ## multi_remote_read 7 | > 如果我们配置了多个remote_read 接口的话即可实现 multi 8 | 9 | ```yaml 10 | remote_read: 11 | - url: "http://172.20.70.205:9090/api/v1/read" 12 | read_recent: true 13 | - url: "http://172.20.70.215:9090/api/v1/read" 14 | read_recent: true 15 | 16 | ``` 17 | 18 | > 上述配置代表并发查询两个后端存储,并可以对查询的结果进行merge 19 | - merge有啥用: 以为着你们的查询promql或者alert配置文件无需关心数据到底存储在哪个存储里面 20 | - 可以直接使用全局的聚合函数 21 | 22 | ## prometheus可以remote_read prometheus自己 23 | > 感觉这个特点很多人不知道,以为remote_read必须配置第三方存储如 m3db等 24 | 25 | ## 所以结合上述两个特点就可以用多个采集的prometheus + 多个无状态的prometheus query实现prometheus的高可用方案 26 | - 监控数据存储在多个采集器的本地,可以是机器上的prometheus 27 | - 也可以是k8s中的prometheus statefulset 28 | - prometheus query remote_read 填写多个`prometheus/api/v1/read/`地址 29 | 30 | ### 数据重复怎么办 31 | - 不用管,上面提到了query会做merge,多个数据只会保留一份 32 | - 到正可以利用这个特点模拟副本机制: 33 | - 重要的采集job由两个以上的采集prometheus采集 34 | - 查询的时候merge数据 35 | - 可以避免其中一个挂掉时没数据的问题 36 | ### 那么这种方案的缺点在哪里 37 | - 并发查询必须要等最慢的那个返回才返回,所以如果有个慢的节点会导致查询速度下降,举个例子 38 | - 有个美东的节点,网络基础延迟是1秒,那么所有查询无论返回多快都必须叠加1秒的延迟 39 | 40 | - 应对重查询时可能会把query打挂 41 | - 但也正是这个特点,会很好的保护后端存储分片 42 | - 重查询的基数分散给多个采集器了 43 | - 由于是无差别的并发query,也就是说所有的query都会打向所有的采集器,会导致一些采集器总是查询不存在他这里的数据 44 | - 那么一个关键性的问题就是,查询不存在这个prometheus的数据的资源开销到底是多少 45 | - 据我观察,新版本速度还是很快的说明资源开销不会在很深的地方才判断出不属于我的数据 46 | - m3db有布隆过滤器来防止这个问题 47 | - 如果想精确把query打向数据它的存储分片可以参考我之前写的route方案:[开源项目 : prome-route: 使用反向代理实现prometheus分片](https://zhuanlan.zhihu.com/p/231914857) 48 | - 主要哦,需要特征标签支持,并且数据天然就是分开的!! 49 | 50 | ### 可以加一些探活/管理采集器的逻辑来完善这个方案 51 | 52 | 53 | # 如何验证 54 | > 两个prometheus只配置采集本地一个node_exporter 的job 55 | ```yaml 56 | global: 57 | scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 58 | evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 59 | query_log_file: /opt/logs/prometheus_query_log 60 | 61 | 62 | 63 | scrape_configs: 64 | - job_name: node_exporter 65 | honor_timestamps: true 66 | scrape_interval: 15s 67 | scrape_timeout: 10s 68 | static_configs: 69 | - targets: 70 | - 192.168.0.106:9100 71 | 72 | ``` 73 | - 这样在单一prometheus中只能查询到自己的数据 74 | 75 | > 启动一个m_query服务 ,multi_remote_read 多个采集器 76 | ```yaml 77 | global: 78 | scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. 79 | evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. 80 | query_log_file: /opt/logs/prometheus_query_log 81 | 82 | 83 | remote_read: 84 | - url: "http://192.168.0.106:9090/api/v1/read" 85 | read_recent: true 86 | - url: "http://192.168.0.107:9090/api/v1/read" 87 | read_recent: true 88 | 89 | ``` 90 | 91 | > 验证在 m_query服务上,即可查到所有数据,达到替换m3db的目的 92 | 93 | ```shell script 94 | node_cpu_seconds_total{cpu="0", mode="system"} 95 | ``` -------------------------------------------------------------------------------- /prometheus免费课程/service/grafana/grafana_k8s.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: v1 3 | kind: PersistentVolumeClaim 4 | metadata: 5 | name: grafana-pvc 6 | spec: 7 | accessModes: 8 | - ReadWriteOnce 9 | storageClassName: grafana-storageclass 10 | resources: 11 | requests: 12 | storage: 1Gi 13 | --- 14 | apiVersion: apps/v1 15 | kind: Deployment 16 | metadata: 17 | labels: 18 | app: grafana 19 | name: grafana 20 | spec: 21 | selector: 22 | matchLabels: 23 | app: grafana 24 | template: 25 | metadata: 26 | labels: 27 | app: grafana 28 | spec: 29 | securityContext: 30 | fsGroup: 472 31 | supplementalGroups: 32 | - 0 33 | containers: 34 | - name: grafana 35 | image: grafana/grafana:7.5.2 36 | imagePullPolicy: IfNotPresent 37 | ports: 38 | - containerPort: 3000 39 | name: http-grafana 40 | protocol: TCP 41 | readinessProbe: 42 | failureThreshold: 3 43 | httpGet: 44 | path: /robots.txt 45 | port: 3000 46 | scheme: HTTP 47 | initialDelaySeconds: 10 48 | periodSeconds: 30 49 | successThreshold: 1 50 | timeoutSeconds: 2 51 | livenessProbe: 52 | failureThreshold: 3 53 | initialDelaySeconds: 30 54 | periodSeconds: 10 55 | successThreshold: 1 56 | tcpSocket: 57 | port: 3000 58 | timeoutSeconds: 1 59 | resources: 60 | requests: 61 | cpu: 250m 62 | memory: 750Mi 63 | volumeMounts: 64 | - mountPath: /var/lib/grafana 65 | name: grafana-pv 66 | volumes: 67 | - name: grafana-pv 68 | persistentVolumeClaim: 69 | claimName: grafana-pvc 70 | --- 71 | apiVersion: v1 72 | kind: Service 73 | metadata: 74 | name: grafana-node-port 75 | labels: 76 | name: grafana-node-port 77 | spec: 78 | type: NodePort #这里代表是NodePort类型的 79 | ports: 80 | - port: 80 #这里的端口和clusterIP(10.97.114.36)对应,即10.97.114.36:80,供内部访问。 81 | targetPort: 3000 #端口一定要和container暴露出来的端口对应,nodejs暴露出来的端口是8081,所以这里也应是8081 82 | protocol: TCP 83 | nodePort: 30000 # 所有的节点都会开放此端口,此端口供外部调用。 84 | selector: 85 | app: grafana #这里选择器一定要选择容器的标签,之前写name:kube-node是错的。 86 | --- 87 | apiVersion: storage.k8s.io/v1 88 | kind: StorageClass 89 | metadata: 90 | name: grafana-storageclass 91 | provisioner: kubernetes.io/no-provisioner 92 | volumeBindingMode: WaitForFirstConsumer 93 | 94 | --- 95 | 96 | apiVersion: v1 97 | kind: PersistentVolume 98 | metadata: 99 | name: grafana-pv 100 | spec: 101 | capacity: 102 | storage: 10Gi 103 | volumeMode: Filesystem 104 | accessModes: 105 | - ReadWriteOnce 106 | persistentVolumeReclaimPolicy: Retain 107 | storageClassName: grafana-storageclass 108 | local: 109 | path: /data/grafana 110 | nodeAffinity: 111 | required: 112 | nodeSelectorTerms: 113 | - matchExpressions: 114 | - key: kubernetes.io/hostname 115 | operator: In 116 | values: 117 | - k8s-node01 118 | 119 | -------------------------------------------------------------------------------- /pic/大纲pic/集群网格大纲.md: -------------------------------------------------------------------------------- 1 | 2 | # ingress k8s流量网关 apisix 高级运维开发课程 3 | # 一般的公司k8s集群流量网关重要性 4 | - 业务模式是在线服务 5 | - 流量网关的建设是重点 6 | 7 | ## 01 为什么要开这门课程 8 | - 小白不太懂ingress存在的意义 7层代理到流量网关 9 | - 流量网关的一些概念,重要的功能 10 | - ingress各个主流的控制器使用 11 | - 控制器的源码解读 12 | - 对于在线服务的重要: 13 | - 网站 流量入口 14 | - 转发规则 15 | - 降级 16 | - 泳道 17 | - 灰度指的是权重 随机性 18 | - 蓝绿是默认有default 指定header到新版本 19 | - HPC 大部分不做这个 20 | - 高性能 21 | - 22 | 23 | 24 | 25 | ## 02 包含哪几部分内容 26 | - ingress controller 等重要概念讲解:目的 27 | - 重点高频控制器的使用 28 | - 挑1-2重点ingress控制器的源码解读 部分 29 | - ingress-nginx 基础使用 高级运维 源码解读 30 | - apisix 基础使用 高级运维 源码解读 31 | - apisxi 二次开发 32 | 33 | - 用golang 写一个自己的k8s集群流量网关k8s-api-gateway :golang开发项目 34 | - 目的不是完成一个非常厉害的控制器:难度比较高的 35 | - 更多的是在于在go源码级别让你更好的理解 ingress控制器的工作流程 36 | - 有助于排查底层的问题 37 | 38 | # 课程大纲 39 | 40 | - 第1章 开篇词和文档下载 41 | - 第2章 重要概念基础知识 42 | - 2.1 梳理一下课程定位和主要内容 43 | - 2.2 集群东西流量和南北流量 44 | - 2.3 公有云的lb类型的svc 45 | - 2.4 为什么还要有ingress 46 | 47 | - 第3章 Kubernetes官方维护的NGINX Ingress Controller 48 | - 3.1 helm安装官方维护的NGINX Ingress Controller 49 | - 3.2 配置helm国内chart加速拉取 50 | - 3.3 ng-ingress控制器的使用 51 | - 3.4 ingress控制器的svc-nodeport改为80 52 | - 3.5 配置Prometheus和grafana的ingress 53 | - 3.6 阿里云配置的镜像加速方法 54 | 55 | - 第4章 NGINX Ingress Controller高级玩法 56 | - 4.1 nginx通过init-container定制首页 57 | - 4.2 负载均衡和会话保持 58 | - 4.3 高并发下upstream直连pod请求概率失败 59 | - 4.4 经过svc-proxy的upstream请求模式 60 | - 4.5 调整控制器的access日志到json模式 61 | - 4.6 请求日志按照域名分离到单独文件中 62 | - 4.7 tls证书和ssl请求 63 | - 4.8 内外网流量分离之多控制器共存 64 | - 4.9 多个流量入口和限流配置 65 | 66 | - 第5章 NGINX Ingress Controller源码解读 67 | - 5.1 ingres和控制器和class三者的关系 68 | - 5.2 ingres的类型 69 | - 5.3 ingress-nginx vs nginx-ingress 70 | - 5.4 ingress-nginx控制器是怎么工作的 71 | - 5.5 主配置文件中上游动态更新和负载处理的lua 72 | - 5.6 nginx.tmpl的golang渲染代码解析 73 | - 5.7 控制器动态更新upstream-post给openresty 74 | - 5.8 数据流量负载处理的逻辑 75 | - 5.9 控制器启动逻辑 76 | 77 | - 第6章 k8s集群流量网关功能和选型 78 | - 6.1 集群网关选型 79 | - 6.2 生产环境大集群慎用istio 80 | - 6.3 api网关泳道等核心功能 81 | - 6.4 以k8s api gateway文档为例再认识一下集群网关 82 | - 6.5 流量治理金丝雀等实例 83 | 84 | - 第7章 k8s集群流量网关新晋网红apisix 85 | - 7.1 apisix组件介绍和3种部署模式 86 | - 7.2 k8s中部署排查init容器依赖顺序 87 | - 7.3 etcd为什么起不来 88 | - 7.4 local类型的动态pvc尝试 89 | - 7.5 部署nfs-pv-provisioner 90 | - 7.6 整理nfs-pv-provisioner 91 | - 7.7 etcd使用nfs类型的存储 92 | - 7.8 通过crd配置apisix 93 | - 7.9 通过ingress配置apisix 94 | - 7.10 通过admin-api配置路由 95 | 96 | - 第8章 helm-chart调优和apisix高级玩法 97 | - 8.1 扩容1个ingress网关专用节点 98 | - 8.2 containerd打包镜像发送节点导入 99 | - 8.3 chart配置污点调度到网关专用节点 100 | - 8.4 chart配置镜像地址 101 | - 8.5 部署dashboard并调整几个svc到nodeport 102 | - 8.6 在dashboard配置直连的node类型route 103 | - 8.7 配置k8s服务发现类型的route 104 | - 8.8 配置apisix的灰度发布 105 | - 8.9 配置apisix的泳道 106 | - 8.10 基于service的泳道 107 | 108 | - 第9章 apisix高级运维和二次开发 109 | - 9.1 再来总结下traffic-split泳道 110 | - 9.2 request-id插件 111 | - 9.3 apisix监控之部署kube-prometheus项目 112 | - 9.4 apisix开启servicesMonitor 113 | - 9.5 监控大盘和指标进阶 114 | - 9.6 logger插件设置 115 | - 9.7 查看files-logger插件源码泳道header 116 | - 9.8 对apisix进行二次开发 117 | - 9.9 总结apisix二开后构建镜像的步骤 118 | - 9.10 准备lua环境再次二开 119 | 120 | - 第10章 源码解读apisxi-ingress控制器 121 | - 10.1 启动打印配置的逻辑 122 | - 10.2 调谐前的启动各个控制器 123 | - 10.3 ingress对象的调谐过程 124 | 125 | - 第11章 go开发集群流量网关k8s-api-gateway之控制器调谐 126 | - 11.1 对比几种流量网关并设计自己的架构图 127 | - 11.2 informer-workqueue样例代码 128 | - 11.3 ingress的informer 129 | - 11.4 2个对象informer通知的逻辑 130 | - 11.5 proxy转发host和svc的map设计 131 | - 11.6 编写ingress的缓存map和同步逻辑 132 | - 11.7 删除对象的回调获取 133 | - 11.8 service的缓存map同步逻辑 134 | 135 | - 第12章 go开发集群流量网关k8s-api-gateway之流量转发 136 | - 12.1 golang的http-proxy方向代理 137 | - 12.2 http-proxy扩展到控制器上面 138 | - 12.3 host匹配ingress和service 139 | - 12.4 测试proxy精确匹配 140 | - 12.5 proxy前缀匹配模式 141 | - 12.6 构建镜像部署自定义控制器到k8s中 142 | 143 | -------------------------------------------------------------------------------- /pic/大纲pic/webhook大纲.md: -------------------------------------------------------------------------------- 1 | 2 | # k8s-webhook动态准入源码解读和实战运维开发课程 3 | 4 | - 第1章 准入控制器k8s源码解读和准备工作 5 | - 1.1 webhook在k8s运维开发中的重要性 6 | - 1.2 什么是k8s的准入控制器 7 | - 1.3 准入控制器插件map数据结构 8 | - 1.4 解读几个典型的控制代码 9 | - 1.5 解读event限流控制器 10 | - 1.6 mutation类型webhook源码解读 11 | - 1.7 validating类型webhook源码解读 12 | - 1.8 学习官方文档中关于动态准入控制的介绍 13 | - 1.9 学习最佳实践 14 | 15 | - 第2章 源码解读k8s官方e2e示例中的webhook 16 | - 2.1 解析官方e2e示例的main流程 17 | - 2.2 源码解读view处理函数 18 | - 2.3 serve通用逻辑 19 | - 2.4 解读hook函数之添加标签的几种判断情况 20 | - 2.5 解读hook函数之给pod注入init容器 21 | - 2.6 解读hook函数之剩余函数 22 | - 2.7 webhook源码示例的总结 23 | 24 | - 第3章 参考e2e示例中的webhook写简单的 25 | - 3.1 新建项目准备工作 26 | - 3.2 找k8s源码中test生成证书 27 | - 3.3 自签生成证书的问题 28 | - 3.4 本地测试 29 | - 3.5 研究k8s源码test中如何部署webhook 30 | - 3.6 使用最古老的方式生成MutatingWebhookConfiguration 31 | - 3.7 部署到集群中遇到证书问题 32 | - 3.8 尝试解决 33 | - 3.9 部署MutatingWebhookConfiguration 34 | 35 | - 第4章 使用certmanager管理证书 36 | - 4.1 部署certmanager 37 | - 4.2 使用cert生成证书部署MutatingWebhookConfiguration 38 | - 4.3 ca-bundle能否自动注入 39 | - 4.4 大型项目怎么部署 MutatingWebhookConfiguration 难道还要手写吗 40 | - 4.5 证书续签的问题 41 | - 4.6 查看你mwc中的证书信息 42 | - 4.7 准备问题复现的环境 43 | - 4.8 https服务端证书更新的问题 44 | - 4.9 思考为什么会出现这个问题 45 | 46 | - 第5章 编写webhook的正确姿势 47 | - 5.1 添加tls-watcher逻辑 48 | - 5.2 部署到k8s集群中测试 49 | - 5.3 认识一下k8s-controller-runtime作用 50 | - 5.4 分析test中如何快速构建webhook 51 | - 5.5 用它来实战创建webhook之准备 52 | - 5.6 写个简单的逻辑试试 53 | - 5.7 添加addLabel的hook 54 | - 5.8 部署测试正常 55 | 56 | - 第6章 开始webhook实战项目 57 | - 6.1 给sts的pod注入INDEX环境变量标识其序号需求说明 58 | - 6.2 编写代码之stsowner判断 59 | - 6.3 index判断和patch 60 | - 6.4 打包镜像部署到k8s集群测试遇到问题 61 | - 6.5 给web添加zap-logger打印日志 62 | - 6.6 更换一种patch思路 63 | - 6.7 解决之前的问题 64 | - 6.8 测试有sidecar和index覆盖的情况 65 | - 6.9 k8s官方的支持 66 | 67 | - 第7章 webhook实战之consul代理注册 68 | - 7.1 搭建环境之consul-server 69 | - 7.2 搭建环境之k8s中的consul-client-ds 70 | - 7.3 使用golang注册服务 71 | - 7.4 curl注册服务 72 | - 7.5 代理注册的问题 73 | - 7.6 代码编写之添加容器ip变量 74 | - 7.7 拼接注册cmd之check 75 | - 7.8 完成所有的逻辑 76 | - 7.9 打包镜像部署到k8s集群测试发现问题 77 | - 7.10 解决curl命令的问题 78 | - 7.11 解决localhost-8500的问题 79 | - 7.12 测试扩容和注销的prestop 80 | 81 | - 第8章 webhook实战之防删除 82 | - 8.1 沟通需求 83 | - 8.2 开始编码 84 | - 8.3 打包镜像部署到k8s集群测试遇到问题 85 | - 8.4 解决format的问题 86 | - 8.5 给master01扩容磁盘 87 | - 8.6 把docker和containerd改到新磁盘中 88 | 89 | - 第9章 webhook实战之pod注入sidecar容器 90 | - 9.1 沟通需求 91 | - 9.2 开始编码 92 | - 9.3 解决harbor失败的问题 93 | - 9.4 打包镜像部署到k8s集群测试遇到问题 94 | - 9.5 清理非正常的pod 95 | 96 | - 第10章 webhook实战之init容器准备工作 97 | - 10.1 沟通需求 98 | - 10.2 开始编码准备volume 99 | - 10.3 完成编码 100 | - 10.4 部署测试 101 | 102 | - 第11章 webhook实战之监听namespace自动创建对象 103 | - 11.1 沟通需求 104 | - 11.2 开始编码之获取client 105 | - 11.3 完成编码 106 | - 11.4 部署测试发现缺少权限 107 | - 11.5 添加原始的kubeclient 108 | 109 | - 第12章 webhook实战之监听ingress配置检查 110 | - 12.1 沟通需求 111 | - 12.2 开始编码 112 | - 12.3 打包镜像部署到k8s集群测试 113 | 114 | - 第13章 webhook实战之k8s节点资源超卖 115 | - 13.1 沟通需求和准备基础环境 116 | - 13.2 开始编码之超卖参数 117 | - 13.3 完成逻辑 118 | - 13.4 打包镜像部署到k8s集群测试 119 | - 13.5 编写pod超卖的代码 120 | - 13.6 测试发现cpu取整的问题 121 | - 13.7 进行总结并赠送k8s中搭建使用harbor 122 | 123 | 124 | 125 | 126 | 127 | # 开发webhook的踩坑点 128 | 129 | 130 | 131 | > tls证书更新问题 132 | - 主要是 webhook-https程序 没有处理tls cert文件更新,导致证书续期后webhook侧没更新 133 | - mwc中的cabundle 你不要手写,直接使用certmanager 注入 134 | - 准备参考 k8s controller-runtime 模块 添加watch cert文件更新,reload tls证书 135 | 136 | 137 | 138 | > webhook 劫持范围 139 | - namespaceSelector 只劫持指定namespace 140 | - objectSelector 只过滤需要代理注册的服务 141 | 142 | 143 | # k8s webhook 开发实战案例 144 | - 给sts的pod注入INDEX环境变量标识其序号 145 | - postStart 和preStop 实现未引用consul-sdk 类服务通过curl注册注销服务 146 | - 资源防删除 147 | - pod注入sidecar容器 148 | - 监听namespace 自动创建secret 149 | - ingress配置检查:检查svc port等是否存在 150 | - 资源超卖 151 | - pod request资源改低 152 | - node 把node的allocatable调高 153 | - 等于是虚标 allocatable ,比如还剩下10G,但是我虚标成 100G 154 | - 反正usage比较低也没有什么影响 155 | 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/statsfulset.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: StatefulSet 3 | metadata: 4 | name: prometheus 5 | namespace: kube-system 6 | labels: 7 | k8s-app: prometheus 8 | kubernetes.io/cluster-service: "true" 9 | spec: 10 | serviceName: "prometheus" 11 | podManagementPolicy: "Parallel" 12 | replicas: 1 13 | selector: 14 | matchLabels: 15 | k8s-app: prometheus 16 | template: 17 | metadata: 18 | labels: 19 | k8s-app: prometheus 20 | N9E_NID: "8" 21 | 22 | annotations: 23 | scheduler.alpha.kubernetes.io/critical-pod: '' 24 | spec: 25 | affinity: 26 | podAntiAffinity: 27 | requiredDuringSchedulingIgnoredDuringExecution: 28 | - labelSelector: 29 | matchExpressions: 30 | - key: k8s-app 31 | operator: In 32 | values: 33 | - prometheus 34 | topologyKey: "kubernetes.io/hostname" 35 | priorityClassName: system-cluster-critical 36 | hostNetwork: true 37 | dnsPolicy: ClusterFirstWithHostNet 38 | containers: 39 | - name: prometheus-server-configmap-reload 40 | image: "jimmidyson/configmap-reload:v0.4.0" 41 | imagePullPolicy: "IfNotPresent" 42 | args: 43 | - --volume-dir=/etc/config 44 | - --webhook-url=http://localhost:8091/-/reload 45 | volumeMounts: 46 | - name: config-volume 47 | mountPath: /etc/config 48 | readOnly: true 49 | resources: 50 | limits: 51 | cpu: 10m 52 | memory: 10Mi 53 | requests: 54 | cpu: 10m 55 | memory: 10Mi 56 | - image: prom/prometheus:v2.27.1 57 | imagePullPolicy: IfNotPresent 58 | name: prometheus 59 | command: 60 | - "/bin/prometheus" 61 | args: 62 | - "--config.file=/etc/prometheus/prometheus.yml" 63 | - "--storage.tsdb.path=/prometheus" 64 | - "--storage.tsdb.retention=24h" 65 | - "--web.console.libraries=/etc/prometheus/console_libraries" 66 | - "--web.console.templates=/etc/prometheus/consoles" 67 | - "--web.enable-lifecycle" 68 | - "--web.listen-address=0.0.0.0:8091" 69 | ports: 70 | - containerPort: 8091 71 | protocol: TCP 72 | volumeMounts: 73 | - mountPath: "/prometheus" 74 | name: prometheus-data 75 | - mountPath: "/etc/prometheus" 76 | name: config-volume 77 | - name: secret-volume 78 | mountPath: "/etc/prometheus/secrets/etcd-certs" 79 | #readOnly: true 80 | readinessProbe: 81 | httpGet: 82 | path: /-/ready 83 | port: 8091 84 | initialDelaySeconds: 30 85 | timeoutSeconds: 30 86 | livenessProbe: 87 | httpGet: 88 | path: /-/healthy 89 | port: 8091 90 | initialDelaySeconds: 30 91 | timeoutSeconds: 30 92 | resources: 93 | requests: 94 | cpu: 100m 95 | memory: 100Mi 96 | limits: 97 | cpu: 1000m 98 | memory: 2500Mi 99 | securityContext: 100 | runAsUser: 65534 101 | privileged: true 102 | serviceAccountName: prometheus 103 | volumes: 104 | - name: config-volume 105 | configMap: 106 | name: prometheus-config 107 | - name: secret-volume 108 | secret: 109 | secretName: etcd-certs 110 | volumeClaimTemplates: 111 | - metadata: 112 | name: prometheus-data 113 | spec: 114 | accessModes: [ "ReadWriteOnce" ] 115 | storageClassName: "prometheus-lpv" 116 | resources: 117 | requests: 118 | storage: 5Gi 119 | -------------------------------------------------------------------------------- /prometheus免费课程/02_k8s监控指标讲解.md: -------------------------------------------------------------------------------- 1 | # 指标分析 2 | **下面只给出了部分指标的解读** 3 | - 毕竟是免费的课程,如需了解更多请购买付费课,那里面会讲解的很详细。谢谢支持 4 | - 课程链接:[prometheus全组件配置使用、底层原理解析、高可用实战](https://ke.qq.com/course/3549215?tuin=361e95b0) 5 | 6 | ## 容器基础资源指标 7 | ### cpu 8 | - cpu 在Kubernetes中CPU属于可压缩资源,意思是pod中服务使用CPU超过设置的limits,pod不会被kill掉但会被限制。所以我们应该通过观察容器CPU被限制的情况来考虑是否将CPU的limit调大。 9 | - 有这样的两个CPU指标,`container_``CPU``_cfs_periods_total`代表 container生命周期中度过的CPU周期总数,`container_``CPU``_cfs_throttled_periods_total`代表container生命周期中度过的受限的CPU周期总数。 10 | - 所以我们可以使用下面的表达式来查出最近5分钟,超过25%的CPU执行周期受到限制的container有哪些。 11 | 12 | ```yaml 13 |  100 * sum by(container_name, pod_name, namespace) (increase(container_CPU_cfs_throttled_periods_total{container_name!=""}[5m])) 14 | / sum by(container_name, pod_name, namespace) (increase(container_CPU_cfs_periods_total[5m])) > 25 15 | ``` 16 | - 我们可以用下面的计算方式表示容器CPU使用率,其中`container_``CPU``_usage_seconds_total`代表CPU的计数器,`container_spec_``CPU``_quota`是容器的CPU配额,它的值是容器指定的CPU个数*100000。 17 | 18 | ```yaml 19 | sum(rate(container_CPU_usage_seconds_total{image!=""}[1m])) by (container, pod) / (sum(container_spec_CPU_quota{image!=""}/100000) by (container, pod) )* 100 20 | ``` 21 | ### mem 22 | - 在Kubernetes中mem属于不可压缩资源,pod之间是无法共享的,完全独占的。所以一旦容器内存使用超过limits,会导致oom,然后重新调度。 23 | - `container_memory_working_set_bytes`是容器真实使用的内存量, kubelet通过比较`container_memory_working_set_bytes`和`container_spec_memory_limit_bytes`来决定oom container。 24 | - 同时还有`container_memory_usage_bytes`用来表示容器使用内存,其中包含了很久没用的缓存,该值比`container_memory_working_set_bytes`要大 25 | - 所以内存使用率可以使用下面的公式计算 26 | 27 | ```yaml 28 | (container_memory_working_set_bytes/container_spec_memory_limit_bytes )*100 29 | ``` 30 | 31 | ## k8s对象资源指标 32 | ### pod状态 33 | 下面的表格中一系列指标描述容器的运行状态。 34 | 35 | |**指标名**|**含义**|**标签举例**| 36 | | ---- | ---- | ---- | 37 | |kube_pod_status_phase|容器当前的运行状态,非Running的都是异常的。|Pending
Succeeded
Failed
Running
Unknown| 38 | |kube_pod_container_status_waiting|容器处于waiting状态|值为1代表waiting| 39 | |kube_pod_container_status_waiting_reason|pod处于waiting状态原因|ContainerCreating
CrashLoopBackOff pod启动崩溃,再次启动然后再次崩溃
CreateContainerConfigError
ErrImagePull
ImagePullBackOff
CreateContainerError
InvalidImageName| 40 | |kube_pod_container_status_terminated|pod处于terminated状态|值为1代表terminated| 41 | |kube_pod_container_status_terminated_reason|pod处于terminated状态原因|OOMKilled
Completed
Error
ContainerCannotRun
DeadlineExceeded
Evicted| 42 | |kube_pod_container_status_restarts_total|pod中的容器重启次数|-| 43 | 44 | 45 | - 下面给出一些经常使用的告警。 46 | - 比如查看下因为拉取镜像失败导致waiting的容器`kube_pod_container_status_waiting_reason{reason="ErrImagePull"}==1` 47 | 48 | - 查看下发生oom的容器`kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}==1` 49 | - 最近十分钟内有重启`(kube_pod_container_status_restarts_total - kube_pod_container_status_restarts_total offset 10m >= 1)` 50 | 51 | ### node状态 52 | - 那么站在Kubernetes集群管理员的角度,也需要关心下node整体的资源情况。 53 | 54 | |**指标名**|**含义**|**标签举例**| 55 | | ---- | ---- | ---- | 56 | |kube_node_status_condition|node节点的运行状态,非Ready都是异常
同时可以看到因为哪种资源压力导致的|condition:
NetworkUnavailable
MemoryPressure
DiskPressure
PIDPressure
Ready| 57 | |kube_node_status_allocatable_CPU_cores|节点可以分配CPU核数|| 58 | |kube_node_status_allocatable_memory_bytes|节点可以分配内存总量(单位:字节)|| 59 | |kube_node_spec_taint|节点污点情况|| 60 | 61 | - 下面给出一些经常使用的告警。 62 | 63 | - 比如查看节点因为内存有压力不可用`kube_node_status_condition{condition="MemoryPressure",status="true"}==1` 64 | 65 | ### 其他资源的常见指标 66 | - dep 副本数不正常 `kube_deployment_spec_replicas!= kube_deployment_status_replicas_available` 67 | - daemonset中不可用的数量 :`kube_daemonset_status_number_unavailable > 0`来表示 68 | - 可以使用`kube_job_failed > 0`来表示失败的job 69 | - 在kube-state-metrics中还有很多其他对象的指标,你可以自行查阅使用。 70 | 71 | ## k8s服务组件指标 72 | ### 四大黄金指标 73 | **延迟、请求qps、错误数、饱和度** 74 | ### 指标 75 | - apiserver 错误率:`100 - 100 * sum(rate(apiserver_request_total{job="kubernetes-apiservers",code=~"2.."}[5m])) /sum(rate(apiserver_request_total{job="kubernetes-apiservers"}[5m]))` 76 | - apiserver 延迟:`histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{job="kubernetes-apiservers"}[5m])) by (verb, le))` 77 | - etcd存储空间使用率:`(etcd_mvcc_db_total_size_in_bytes / etcd_server_quota_backend_bytes)*100` 78 | - 成功调度一个pod 的平均尝试次数:`scheduler_pod_scheduling_attempts_sum/scheduler_pod_scheduling_attempts_count`代表 79 | 80 | ## pod业务埋点指标 81 | 各个业务自行决定即可。 82 | 83 | -------------------------------------------------------------------------------- /pic/大纲pic/运维大师大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 即将出一个k8s运维大师的课程: 3 | # 课程卖点 4 | - 丰富真实的一线k8s集群问题排查调优经验 5 | - 发现问题:通过监控/日志/event 6 | - 排查问题:相关源码解读和debug手段 7 | - 解决问题:实战golang k8s运维开发项目 8 | - 给你带来解决k8s问题思路 9 | - 如果能真实掌握,那么变成k8s专家不是梦 10 | - 即使不会写这些go代码,那么镜像你拿去直接部署就可以 11 | 12 | 13 | # 课程大纲 14 | 15 | - 第0章 安装Ubuntu 20 部署k8s 1.24集群 16 | - 0.1 安装Ubuntu 20 部署k8s 1.24集群 17 | - 0.2 安装centos7 部署k8s 1.24集群 18 | 19 | - 第1章 在k8s中部署prometheus sts和grafana dep 20 | - 1.1 在k8s中部署prometheus sts和grafana dep 21 | - 第2章 云原生日志采集控制器logging operator 使用 22 | - 2.1 安装logging operator 23 | - 2.2 fluentbit链接fluentd dns排错 24 | - 2.3 fluentd错误日志查看 25 | - 2.4 准备打印日志的pod服务 26 | - 2.5 采集自定义pod的日志 27 | 28 | - 第3章 logging operator 源码解读 29 | - 3.1 fluentd-configcheck的前置检查 30 | - 3.2 fluentd-sts所需一系列资源的调谐公共函数 31 | - 3.3 fluentbit-ds 采集k8s 容器日志 32 | 33 | - 第4章 容器oom问题和子进程父进程 34 | - 4.1 oom监控指标和pod/容器/kubectl get状态解读 35 | - 4.2 containerd获取容器状态源码解读 36 | - 4.3 写一个申请GB内存的golang服务 37 | - 4.4 部署go-mem-allocate测试oomKill 38 | - 4.5 oomWatcher管理器源码解读 39 | - 4.6 pod中多个进程子进程oom问题 40 | - 4.7 oomkill信息不同步问题梳理 41 | - 4.8 5.0内核的oom信息展示 42 | 43 | - 第5章 containerd-oom-metrics项目go代码编写 44 | - 5.1 如何根据cgroup信息找到pod-容器信息 45 | - 5.2 containerd-go-sdk代码编写 46 | - 5.3 读取解析内核日志kmsg的代码 47 | - 5.4 oom-metrics项目的准备工作 48 | - 5.5 OomStreamer对象及其方法 解析正则 暴露metrics 49 | - 5.6 kubelet containded替换数据目录 50 | - 5.7 为k8s1.24做适配 51 | - 5.8 编译二进制测试 52 | - 5.9 打镜像部署daemonset 53 | 54 | - 第6章 节点上文件清理和c++ coredump清理daemonset 55 | - 6.1 c++ coredump问题背景说明 56 | - 6.2 清理go项目的参数解析 任务编排等准备工作 57 | - 6.3 fsnotify事件监听和ticker处理 58 | - 6.4 编译二进制在node上进行测试 59 | - 6.5 编写dockerFile推送镜像 准备daemonset-yaml 60 | - 6.6 部署ds到k8s中测试 61 | 62 | - 第7章 pod临时存储和节点压力驱逐 63 | - 7.1 pod临时存储和指标相关问题 64 | - 7.2 容器日志疑似被删除问题 65 | - 7.3 节点压力驱逐问题 66 | 67 | - 第8章 scheduler e2e调度延迟高告警排查 68 | - 8.1 背景说明告警指标讲解 69 | - 8.2 分位值summary和histogram对比 70 | - 8.3 histogram线性插值法源码解读 71 | - 8.4 追踪scheduler中调度延迟的埋点代码 72 | 73 | - 第9章 etcd核心监控指标和io写入延迟问题 74 | - 9.1 etcd 核心指标讲解 75 | - 9.2 cpu频率和磁盘io对etcd的影响 76 | 77 | - 第10章 疑似node networkPlugin cni failed导致pod之间网络不通问题 78 | - 10.1 pod之间网络不通问题背景 79 | - 10.2 这个日志是否是创建sandbox网络报出的 80 | - 10.3 物理网卡的ringbuffer参数和丢包 81 | 82 | - 第11章 cri插件相关 83 | - 11.1 dockerd作为cri的种种弊端和问题 84 | - 11.2 cri从dockerd替换为containerd 85 | - 11.3 nodeio高导致containerd createContainerd慢 kubelet创建pod失败 86 | - 11.4 nodeio高来自谁的调用-是node组件-还是容器写临时存储 87 | 88 | - 第12章 event处理相关之监控告警 89 | - 12.1 event存储到单独的etcd集群中和etcd quota问题 90 | - 12.2 event转化为metrics的方法和源码解读 91 | - 12.3 二开这个项目 添加日志和imageEvent的处理 92 | - 12.4 部署项目到k8s集群中查看指标 93 | - 12.5 将event-log通过fluentbit采集到loki中 94 | 95 | - 第13章 event处理相关之trace处理 96 | - 13.1 trace和k8s-event结合 97 | - 13.2 写代码认识jaeger和opentelemetry 98 | - 13.3 trace项目源码查看 99 | 100 | - 第14章 k8s集群资源限制相关 101 | - 14.1 group-left计算k8s集群cpu-mem申请率使用率 102 | - 14.2 cpu-mem申请率使用率差距问题 103 | - 14.3 resourceQuota限制 104 | 105 | - 第15章 基于准入控制器的资源超卖golang项目 106 | - 15.1 项目架构和实现思路解析 107 | - 15.2 tls证书和签名 108 | - 15.3 编写go项目代码 实现webhook服务器 109 | - 15.4 超售效果测试 打镜像部署到k8s集群中测试 110 | 111 | - 第16章 k8s集群探针项目 112 | - 16.1 k8s集群探针项目架构设计 113 | - 16.2 go写一个定时退出的web探针 114 | - 16.3 编排框架代码编写 115 | - 16.4 k8s-prober代码编写 116 | - 16.5 部署探针到集群中测试 117 | 118 | > 【更新内容】第17章 容器临时存储的危害和监控 119 | - 17.1 总结容器中的文件读写的场景 120 | - 17.2 回顾一下容器临时存储的问题 121 | - 17.3 追查containerd作为cri时监控指标的问题 122 | - 17.4 windows安装docker-registry私有仓库 123 | - 17.5 试试特定版本的cadvisor-ds 124 | - 17.6 通过sm采集到Prometheus查看 125 | - 17.7 继续排查这个issue追踪summary上游 126 | - 17.8 用token直接请求kubelet接口 127 | - 17.9 追查源码之handlerSummary的systemContainers逻辑 128 | - 17.10 podStats如何获取到的 129 | 130 | > 【更新内容】第18章 kubelet中的PodStats代码追踪 131 | - 18.1 完成非onlyCPUAndMemory的全量stat源码追踪 132 | - 18.2 继续追踪podStats.ContainerStats.rootfs之gate判断 133 | - 18.3 Partially就是一部分cad一部分cri 134 | - 18.4 Strictly就是全部cri 135 | - 18.5 cadvisor的ListPodStats代码追踪 136 | - 18.6 kubelet中的csp到底是哪种 137 | - 18.7 画kubelet中的stat-summary调用链路的puml图-1 138 | - 18.8 画kubelet中的stat-summary调用链路的puml图-2 139 | - 18.9 介绍一个好用的工具 140 | - 18.10 研究源码之工具如何做到disk的stats 141 | 142 | > 【更新内容】第19章 containerd的怎么计算WritableLayer的 143 | - 19.1 containerd的ListContainerStats接口 144 | - 19.2 追查GetSnapshot的逻辑 145 | - 19.3 查看overlayfs的usage逻辑 146 | - 19.4 walk的调用时机是否是实时的 147 | - 19.5 画containerd中的ListContainerStats中的fs逻辑的puml图 148 | 149 | 150 | - TODO 思考如何写组件暴露容器的临时存储数据 -------------------------------------------------------------------------------- /10个k8s运维开发方向.md: -------------------------------------------------------------------------------- 1 | # k8s中的运维开发的10个方向 2 | > 按照k8s的扩展点 3 | 4 | | 开发类型 | k8s的扩展点 | 效果演示或简介 | 学成后的结果 | 5 | |----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|-----------------------------------------------------------------------------| 6 | | 实战问题+源码解读+二次开发 | [01_【持续更新】从实际问题入手 k8s新源码解读 丰富的实验+开发样例 ](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3669946874917421381&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV13H4y1p7p6/) | containerd
calico源码 | 7 | | k8s主要组件源码解读 | [02_k8s全组件源码讲解和底层原理分析三合一 助力你成为k8s专家](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3595279694125268143&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1XJ4m1W7Wr/) | 组件源码 | 8 | | Daemonset开发 | [03_k8s中的网络探测吧,作为写golang的一个小的实战项目](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3594920679889365281&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1mt4y1K71G/) | Prometheus-exporter开发
golang-cs架构开发
网络探测 | 9 | | ingress集群网关 | [04_ingress_k8s流量网关 apisix 高级运维开发课程](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3624109749701883834&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1qB4y1G7Kf/) | ingress和apisix使用
ingress-nginx控制器源码
apisix二开
用go开发自己的ingress控制器 | 10 | | webhook | [05_k8s-webhook动态准入源码解读和实战运维开发课程](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3668080939218633019&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1Tx421f7Hw/) | 8个k8s-webhook开发实战案例
tls证书更新问题 | 11 | | 调度器扩展 | [06_k8s二次开发之基于真实负载的调度器](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3595143844292868583&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1qB4y1G7Kf/) | PrometheusSdk使用
k8s调度框架源码理解
真实负载和集群利用率 | 12 | | 多集群管理 故障自愈 | [07_go运维开发实战之k8s多集群自动守卫自愈组件k8s-cluster-guard](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3594937597765513838&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1QV4y1g7za/) | 多集群管理
常见k8s集群问题和自愈手段 | 13 | | operator开发 | [08_k8s-operator和crd实战开发 助你成为k8s专家](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3595280078524815572&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1cv4y1371X/) | kube-builder使用
基于informer的调谐
workQueue使用 | 14 | | 企业级实战问题开发 | [09_k8s运维大师课程](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3598135830213973305&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV11B4y1k7LB/) | k8s生产集群企业级调优方案
10个k8s中实战运维开发项目 | 15 | | web白屏操作(简单) | [10_k8s管理运维平台实战前端vue后端golang](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3596266896661552169&origin_type=604) | [效果演示或简介](https://www.bilibili.com/video/BV1QV4y1g7za/) | vue2.0
k8s-client-go使用
web平台化 | 16 | | web白屏+抽象k8s应用+整合cicd | [11_【持续更新】7模块大运维平台开发-go-vue-k8s-cicd-服务树-监控](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3641191333189820599) | [效果演示或简介](https://www.bilibili.com/video/BV1BG411B7Qr/) | vue3.0
k8s-client-go使用
抽象k8s对象
打通cicd灰度发布 | 17 | 18 | 19 | 20 | > [【小乙老师强烈推荐的 运维开发年轻人的第一个golang实战练手项目 使用cs架构编写一个k8s中的网络探测daemonset-1】](https://www.bilibili.com/video/BV1BN4y1n79o/?share_source=copy_web&vd_source=170ce3fc32e69133f1182a31ec187b98) 21 | - ![image](./pic/网络探测介绍.png) 22 | 23 | > 购买链接 24 | 25 | [【小乙老师强烈推荐的 运维开发年轻人的第一个golang实战练手项目 使用cs架构编写一个k8s中的网络探测daemonset-1】](https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3594920679889365281&origin_type=604) 26 | -------------------------------------------------------------------------------- /pic/大纲pic/7模块-工单大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 大运维平台5大模块 6 | - 01 资产管理 & cmdb & 服务树 7 | - 02 工单 & 工作流 & 审批 8 | - 03 cicd 全流程配置 9 | - 04 Prometheus管理配置 10 | - 05 k8s多集群管理 11 | 12 | ## 00 为什么是这5个模块 13 | - k8s/prometheus/cicd作为当下3大运维开发主流方向,这点大家都知道 14 | - 但是如果只做上面3个模块还少了些基础的模块 15 | - 这里的基础模块说的就是 cmdb和工单 16 | - cmdb很好理解: 17 | - 监控/cicd/k8s等内部很多资源都属于资源 18 | - 资源就需要有管理的地方 19 | - 同时资产和服务的绑定形式应该是一颗服务树 20 | - 在服务树的节点上可以配置权限和绑定其他模块资源 21 | - 比如给 data.system.dns 绑定cicd发布模板可以发布dns配置 22 | - 比如给 infra.sre.apolloy绑定监控告警配置项 23 | - 那么为什么还需要工单呢,主要原因有下面2点 24 | - 01 因为我们很多的操作需要工单审批之后才做 25 | - 比如 在页面上通过yaml编辑器编辑 k8s的deployment 会触发变更 26 | - 此时应该触发生成一张工单:经过预设的审批人审批后 再执行 27 | - 02 还有一些我们通用的运维工作需要工单支持 28 | - 比如调整安全组 29 | - 比如申请consul 服务发现token 30 | 31 | ## 树层级 总结服务树前端功能 32 | - 每个树层级操作 33 | 34 | - 展开和折叠: 35 | - 默认只展开第一层 36 | - 每次点击下一层的展开按钮再展开 :infra.k8s.prod-01.node.k8s-node-prod-01 37 | - 这个树节点内容:获取这个节点的机器列表 38 | 39 | - 加载方式 40 | - 懒加载 异步 D:\nyy_work\fe-work\a-ben-yuan\src\views\demo\tree\index.vue 41 | - 数据不是一次请求完成 42 | - 而且根据父级再去查询子集 43 | - 数据操作 :右键菜单 beforeRightClick 44 | - 在父层级添加子集 45 | - 删除 46 | - 工具栏使用 toolbar 47 | - 函数操作按钮 D:\nyy_work\fe-work\a-ben-yuan\src\views\demo\tree\ActionTree.vue 48 | - isLeaf 叶子节点:不能再有孩子了 49 | - showLine 节点连线 50 | 51 | ## 服务树 52 | - 服务树节点操作 53 | - 增加:右键添加 54 | - 父层级添加子层级 55 | - 节点属性: 56 | - 名称 name 57 | - 是否是子节点 isLeaf 58 | - 第几层级: 0,1,2,3 59 | - 父节点id: parentId 60 | - 图标: icon :选择列表,而不是五花八门的 61 | - 删除:右键删除 62 | - 是否级联删除 63 | - 删除保护:如果子节点还有,那么不让删除父节点 64 | - 更新:根据id操作 65 | - 名称是可以更新的 66 | - 挪动节点? 是否要做 :也可以通过先删除后添加 67 | - 树展示:查询 68 | - 一层一层的加载:默认全部展开是没有意义的 69 | - 数据是否异步: 70 | - 服务树特别庞大:全部数据前端渲染比较卡 71 | - 根据父层级查子层级:向下一层查询 72 | - 根据父层级展开所有层级: 73 | - 不太想拼接 id形式 0-1-3-4 74 | 75 | 【3】工单 第1章 工单系统的调研工作 76 | 【3】工单 第2章 工单系统的工作流基础 77 | 【3】工单 第3章 工单系统的工作流接口联调 78 | 【3】工单 第4章 工单系统的表单设计 79 | 【3】工单 第5章 工单系统的工单模板和工单申请 80 | 【3】工单 第6章 工单创建和工单查询 81 | 【3】工单 第7章 工单的流转逻辑 82 | 【3】工单 第8章 工单的详情进度追踪 83 | 【3】工单 第9章 购买机器等的自动执行模块 84 | 【3】工单 第10章 工单和im通知 85 | 【3】工单 第2部分 详情进度追踪 自动执行模块 im通知 86 | 87 | # 工单模块大纲 88 | - 第1章 工单系统的调研工作 89 | - 1.1 回顾服务树和cmdb未完成的事情 90 | - 1.2 为什么要有工单系统 91 | - 1.3 开源工单系统调研 92 | - 1.4 工单系统核心对象-表单设计器 93 | - 1.5 工单系统核心对象-流程管理 94 | - 1.6 工单系统核心对象-排他网关 95 | - 1.7 工单系统再调研 96 | - 1.8 工单系统实现思路 97 | 98 | - 第2章 工单系统的工作流基础 99 | - 2.1 设计工作流 100 | - 2.2 工作流节点 101 | - 2.3 工作流前端设计 102 | - 2.4 新增工单菜单 103 | - 2.5 动态增减表单项尝试01 104 | - 2.6 表格嵌套下拉列表 105 | - 2.7 新增流程的模态框 106 | - 2.8 尝试form和表格合并 107 | - 2.9 测试编辑能够带上信息 108 | - 2.10 测试编辑能够带上信息 109 | 110 | - 第3章 工单系统的工作流接口联调 111 | - 3.1 获取申请人或组的接口 112 | - 3.2 整理新增的前端请求 113 | - 3.3 用户流程节点的一对多表关系 114 | - 3.4 完成后端新增流程的接口 115 | - 3.5 表格list流程 116 | - 3.6 表格美化 117 | - 3.7 流程更新接口 118 | - 3.8 删除流程接口 119 | 120 | - 第4章 工单系统的表单设计 121 | - 4.1 大致的实现思路 122 | - 4.2 新增表单设计菜单 123 | - 4.3 表单设计打开和隐藏 124 | - 4.4 父子组件传递formConfig 125 | - 4.5 新增表单逻辑 126 | - 4.6 验证表单从json加载 127 | - 4.7 验证fApi提取表单数据 128 | - 4.8 后端创建和拉取api 129 | - 4.9 存量编辑页面展示 130 | - 4.10 formConfig和setField问题 131 | 132 | - 第5章 工单系统的工单模板和工单申请 133 | - 5.1 新建菜单准备表结构 134 | - 5.2 新增时apiSelect选择关联对象 135 | - 5.3 查询和编辑和删除保护 136 | - 5.4 思考工单申请前端样式并mock模板数据 137 | - 5.5 card的v-for遍历 138 | - 5.6 工单申请跳转工单创建 139 | - 5.7 菜单隐藏和排序问题 140 | - 5.8 创建页面解析tplId查询接口 141 | - 5.9 查询展示遇到foreach遍历错误 142 | - 5.10 解决查询展示遇到foreach遍历错误 143 | 144 | - 第6章 工单创建和工单查询 145 | - 6.1 工单创建页面 146 | - 6.2 思考工单核心对象的关系 147 | - 6.3 工单实例的字段 148 | - 6.4 工单的创建前端数据拼接 149 | - 6.5 工单的创建后端接口 150 | - 6.6 工单查询的几种模式和后续动作 151 | - 6.7 准备工单查询表格 152 | - 6.8 构造不同用户的工单 153 | - 6.9 改造所有的List接口支持分页 154 | - 6.10 前端指明查询模式 155 | 156 | - 第7章 工单的流转逻辑 157 | - 7.1 工单流转节点逻辑 158 | - 7.2 工单创建初始化状态 159 | - 7.3 工单待我审批查询的逻辑 160 | - 7.4 通过不同状态给不同的action处理按钮 161 | - 7.5 新增用户来验证审批组过滤逻辑 162 | - 7.6 审批的后端接口 163 | - 7.7 验证工单审批 164 | - 7.8 审批拒绝工单和二次确认 165 | - 7.9 执行接口遇到问题 166 | - 7.10 执行接口最后一个节点更新问题 167 | 168 | - 第8章 工单的详情进度追踪 169 | - 8.1 状态颜色 170 | - 8.2 按状态查询 171 | - 8.3 工单详情布局 172 | - 8.4 工单json数据回调表单探究01 173 | - 8.5 setFormModel-vs-fapi回填和表单禁用 174 | - 8.6 工单列表跳转工单详情 175 | - 8.7 工单列表跳转工单详情 176 | - 8.8 展示工单的时间轴 177 | - 8.9 调整时间轴显示 178 | - 8.10 进行工单完整测试 179 | - 8.11 完整测试下拉选择带搜索框 180 | - 8.12 工单评论前端组件 181 | - 8.13 工单评论后端接口 182 | - 8.14 工单评论问题解决和再次测试 183 | 184 | 185 | - 第9章 购买机器等的自动执行模块 186 | - 9.1 思考自动执行和工单怎么整合 187 | - 9.2 定义后端的自动执行模块 188 | - 9.3 扫描接管的代码 189 | - 9.4 配置和工单模板联动 190 | - 9.5 拆分mockEcsOne方法 191 | - 9.6 虚拟机购买流程 192 | - 9.7 绑定服务树叶子节点 193 | - 9.8 后台提前创建虚拟机购买工单相关对象 194 | - 9.9 处理Comment错误 195 | - 9.10 调试创建流程 196 | - 9.11 验证服务树绑定 197 | 198 | 199 | - 第10章 工单和im通知 200 | - 10.1 工单和im通知如何整合 201 | - 10.2 扫描工单找到待通知的用户 202 | - 10.3 遍历待处理的flowNode通知的逻辑 203 | - 10.4 验证通知处理人结果 204 | - 10.5 审批通知创建人的逻辑 205 | - 10.6 执行通知创建人的逻辑 206 | - 10.7 工单详情里面的动作按钮 207 | - 10.8 创建和是否关联控制按钮显示 208 | 209 | 210 | 211 | 212 | # 213 | 214 | 215 | 216 | 217 | -------------------------------------------------------------------------------- /pic/大纲pic/新源码大纲.md: -------------------------------------------------------------------------------- 1 | # 大纲 2 | - 0.1 开篇词 从问题出发的k8s新源码解读课程逻辑 3 | 4 | - 第1章 准备k8s1.29和go源码环境 5 | - 1.1 都需要准备哪些环境 6 | - 1.2 先来看k8s的最新版本 7 | - 1.3 准备ubuntu22.04的虚拟机模板 8 | - 1.4 准备k8s-1.29仓库源 9 | - 1.5 手动安装k8s-1.29-master 10 | - 1.6 整理k8s-1.29-master安装脚本 11 | - 1.7 整理k8s-1.29-node安装脚本 12 | - 1.8 安装golang最新版 13 | - 1.9 下载k8s源码 14 | 15 | - 第2章 关于k8s节点宕机 16 | - 2.1 提出问题 17 | - 2.2 熟悉一下节点资源 18 | - 2.3 做实验看下4个具体的判断条件 19 | - 2.4 NodeDiskPressure设置逻辑 20 | - 2.5 追踪磁盘Condition上层调用 21 | - 2.6 kubelet中的Condition判定 22 | - 2.7 节点压力驱逐和垃圾回收 23 | - 2.8 熟悉rbac模型 24 | - 2.9 编写只读rbac和124-secret生成问题 25 | - 2.10 用token调用k8s各种coreApi 26 | 27 | - 第3章 涉及到的apiserver的鉴权 28 | - 3.1 调用其他group的api 29 | - 3.2 查看configz的配置回答2.7的问题 30 | - 3.3 -v10打印curl命令 31 | - 3.4 level的对应关系并做实验修改kubelet的日志级别 32 | - 3.5 各个组件的configz的逻辑 33 | - 3.6 apiserver的鉴权基础知识 34 | - 3.7 分析auth的源码认识RunAccessList流程 35 | - 3.8 服务端返回SSRR的verb列表逻辑 36 | - 3.9 cani的单一check 37 | - 3.10 apiserver的RBAC鉴权 38 | 39 | - 第4章 分析一下第1个错误判断函数runtimeError 40 | - 4.1 回到disk实验的初衷 41 | - 4.2 查看readySetter中的4个错误判断函数 42 | - 4.3 分析一下第1个错误判断函数runtimeError 43 | - 4.4 对比普通pleg和基于event的pleg的准备工作 44 | - 4.5 安装kube-prometheus监控 45 | - 4.6 kp套件里面的所有镜像放到统一的仓库里面 46 | - 4.7 优化并访问kube-prometheus 47 | - 4.8 分析第1种普通pleg的源码 48 | - 4.9 分析第2种普通event的源码 49 | - 4.10 总结2种pleg并追查cri的event 50 | 51 | - 第5章 开始查看containerd的代码 52 | - 5.1 磁盘压力的污点 53 | - 5.2 分析完第1个cri错误进行notReady实验 54 | - 5.3 分析一下第2个错误判断函数Network 55 | - 5.4 containerd中的RuntimeCondition的赋值 56 | - 5.5 使用grpcurl调用containerd的接口 57 | - 5.6 学习一下grpcurl 58 | - 5.7 总结一下 59 | - 5.8 用go代码调用containerd-grpc接口样例 60 | - 5.9 测试发现问题并使用crictl 61 | - 5.10 在grpc调用containerd的时候如何传递namespace变量 62 | 63 | - 第6章 开始查看containerd的代码 64 | - 6.1 代理containerd的unix为tcp 65 | - 6.2 调用containerd的status接口遇到问题 66 | - 6.3 切换到上层的cri-api调用 67 | - 6.4 containerd中的netplugin的init逻辑前序 68 | - 6.5 学习cni规范01 69 | - 6.6 学习cni规范中的第2部分-执行协议 70 | - 6.7 学习cni规范中的第3部分 71 | - 6.8 containerd中的netplugin的初始化cni的逻辑中的5次执行 72 | - 6.9 其余init的逻辑 73 | - 6.10 看下libcni中的addNetwork的主流程 74 | 75 | - 第7章 containerd内部调用addNetwork的链条 76 | - 7.1 addNetwork的create动作 77 | - 7.2 containerd内部调用addNetwork的链条 78 | - 7.3 puml工具简介 79 | - 7.4 puml工具基础语法 80 | - 7.5 画出containerd-调用cni的图001 81 | - 7.6 完成这个puml图 82 | - 7.7 containerd调用libcni的addNetwork时的传参 83 | - 7.8 准备实验结合代码看cni支持pod设置带宽 84 | - 7.9 带宽怎么也打不上去 85 | - 7.10 进行回顾 86 | 87 | - 第8章 pod流量整形 88 | - 8.1 准备iperf环境进行实验 89 | - 8.2 实验流量 90 | - 8.3 流量限制底层是如何做的 91 | - 8.4 分析calico-cni插件代码 92 | - 8.5 cri调用各个cni插件的参数和结果 93 | - 8.6 能否在机器上查看到tc的设置的结果 94 | - 8.7 cni的插件支持和netns 95 | - 8.8 带宽限制的puml流程图 96 | - 8.9 containerd中的netplugin的status逻辑 97 | - 8.10 完成这个puml图 kubelet的4大ready判断之2的Network底层containerd-status逻辑 98 | 99 | - 第9章 cni的ipam分配ip流程查看 100 | - 9.1 IPAM的准备工作 101 | - 9.2 实验用IPAM的host-local分配ip 102 | - 9.3 host-local的代码中的参数解析 103 | - 9.4 host-local的代码之flock加锁 104 | - 9.5 host-local的代码之allocate分配 105 | - 9.6 画一个puml图:cni核心流程ipam之hostLocal类型流程 106 | - 9.7 官方dhcp流程分析 107 | - 9.8 学习dhcp流程 108 | - 9.9 学习calico的架构 109 | 110 | - 第10章 calico的ipip模式分析 111 | - 10.1 ipip模式基础知识通过linkid找网卡抓包 112 | - 10.2 ipip模式基础知识nsenter进入网络ns 113 | - 10.3 进行ipip隧道实验 114 | - 10.4 总结原理 115 | - 10.5 学习读懂ip-route路由表 116 | - 10.6 尝试解读master上的main路由表 117 | - 10.7 尝试解读master上的main路由表-2 118 | - 10.8 calico-ipip模式本机容器访问的arp代理 119 | - 10.9 画puml图 120 | - 10.10 抓calico-ipip模式遇到问题 121 | 122 | - 第11章 calico的vxlan模式分析 123 | - 11.1 解决之前的问题-失败 124 | - 11.2 解释一下为什么尝试了多种方法都是抓不到ipip包 125 | - 11.3 画puml图 126 | - 11.4 准备一个nat模式的vmware虚拟机 127 | - 11.5 给这个不同网段的节点去安装k8s129版本 128 | - 11.6 验证一下crossSubNet的vxlan 129 | - 11.7 尝试添加nat的网卡 130 | - 11.8 尝试抓crossSubNet的vxlan报文 131 | - 11.9 calico的模式改变之全vxlan 132 | - 11.10 calico的模式改变之全IPIP 133 | 134 | 135 | - TODO: 136 | - calico的模式混合使用会通吗 137 | - IP地址管理插件(IPAM插件)calico的逻辑 存储在哪里,怎么并发的 138 | - netplugin是不是calico 之间的交互 139 | - crictl的info 命令是如何调用到containerd的statusv1接口 140 | - ready到底是谁决定的 4种判断函数任意一种都会导致notReady 141 | - 文章 142 | - https://blog.51cto.com/u_2010293/2781914 143 | - https://blog.csdn.net/wanger5354/article/details/122489802 144 | 145 | # ready到底是谁决定的 4种判断函数任意一种都会导致notReady 146 | - runtimeErrorsFunc(), 147 | - networkErrorsFunc() 148 | - storageErrorsFunc() 149 | - nodeShutdownManagerErrorsFunc() 150 | 151 | 152 | # 课程卖点 153 | # 新旧k8s源码解读课程区别 154 | 155 | | 课程 | 课程逻辑 | 举例 | 好处 | 缺点 | 156 | |-----|-------------|------------------------|-----------|----------------------| 157 | | 旧课程 | 按k8s的组件逐一解读 | apiserver中各个模块的启动到内部逻辑 | 比较全 | 缺乏生产应用问题场景
周期比较长 | 158 | | 新课程 | 从问题入手 | k8s节点宕机or-kubelet不可用多久后pod会迁移 | 从问题入手便于理解 | 比较零散 | 159 | 160 | 161 | # 新课程的流程 162 | > 源码解读新形式: 源码解读和实战问题分析想结合 163 | - 发现问题(经验) --> 复现问题(做实验) --> 分析学习源码(源码) --> 能否二开,写个周边的组件来解决问题(开发) 164 | - 和之前的k8s运维大师很像 165 | - 运维大师更偏向于 开发组件 166 | - 源码解读更偏向于 分析源码 167 | 168 | 169 | > 重点提出问题相关 170 | - 问题:从问题入手 171 | - 使用k8s过程 172 | - 到查看源码 173 | - 到解决问题的运维开发项目 174 | 175 | > 已有的问题列表 176 | - k8s节点宕机or-kubelet不可用多久后pod会迁移 177 | - 关于容器存储的 178 | - 容器临时文件 容器临时存储监控用量源码追踪和过量使用危害 179 | - 开发基于kubelet的api 获取容器使用临时存储量 180 | - 镜像 181 | - 日志 182 | - 数据 183 | - pvc 184 | - volume 185 | - statefulset index版本号 186 | - containerd根下的run目录满了导致容器创建失败 187 | - 探针和日志 188 | - k8s源码解读之容器的ready和started标志位 189 | 190 | 191 | > 基础运作机制 192 | - 镜像分层机制 193 | - 原地升级的机制 194 | - -------------------------------------------------------------------------------- /pic/大纲pic/7模块-服务树大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 大运维平台5大模块 6 | - 01 资产管理 & cmdb & 服务树 7 | - 02 工单 & 工作流 & 审批 8 | - 03 cicd 全流程配置 9 | - 04 Prometheus管理配置 10 | - 05 k8s多集群管理 11 | 12 | ## 00 为什么是这5个模块 13 | - k8s/prometheus/cicd作为当下3大运维开发主流方向,这点大家都知道 14 | - 但是如果只做上面3个模块还少了些基础的模块 15 | - 这里的基础模块说的就是 cmdb和工单 16 | - cmdb很好理解: 17 | - 监控/cicd/k8s等内部很多资源都属于资源 18 | - 资源就需要有管理的地方 19 | - 同时资产和服务的绑定形式应该是一颗服务树 20 | - 在服务树的节点上可以配置权限和绑定其他模块资源 21 | - 比如给 data.system.dns 绑定cicd发布模板可以发布dns配置 22 | - 比如给 infra.sre.apolloy绑定监控告警配置项 23 | - 那么为什么还需要工单呢,主要原因有下面2点 24 | - 01 因为我们很多的操作需要工单审批之后才做 25 | - 比如 在页面上通过yaml编辑器编辑 k8s的deployment 会触发变更 26 | - 此时应该触发生成一张工单:经过预设的审批人审批后 再执行 27 | - 02 还有一些我们通用的运维工作需要工单支持 28 | - 比如调整安全组 29 | - 比如申请consul 服务发现token 30 | 31 | ## 树层级 总结服务树前端功能 32 | - 每个树层级操作 33 | 34 | - 展开和折叠: 35 | - 默认只展开第一层 36 | - 每次点击下一层的展开按钮再展开 :infra.k8s.prod-01.node.k8s-node-prod-01 37 | - 这个树节点内容:获取这个节点的机器列表 38 | 39 | - 加载方式 40 | - 懒加载 异步 D:\nyy_work\fe-work\a-ben-yuan\src\views\demo\tree\index.vue 41 | - 数据不是一次请求完成 42 | - 而且根据父级再去查询子集 43 | - 数据操作 :右键菜单 beforeRightClick 44 | - 在父层级添加子集 45 | - 删除 46 | - 工具栏使用 toolbar 47 | - 函数操作按钮 D:\nyy_work\fe-work\a-ben-yuan\src\views\demo\tree\ActionTree.vue 48 | - isLeaf 叶子节点:不能再有孩子了 49 | - showLine 节点连线 50 | 51 | ## 服务树 52 | - 服务树节点操作 53 | - 增加:右键添加 54 | - 父层级添加子层级 55 | - 节点属性: 56 | - 名称 name 57 | - 是否是子节点 isLeaf 58 | - 第几层级: 0,1,2,3 59 | - 父节点id: parentId 60 | - 图标: icon :选择列表,而不是五花八门的 61 | - 删除:右键删除 62 | - 是否级联删除 63 | - 删除保护:如果子节点还有,那么不让删除父节点 64 | - 更新:根据id操作 65 | - 名称是可以更新的 66 | - 挪动节点? 是否要做 :也可以通过先删除后添加 67 | - 树展示:查询 68 | - 一层一层的加载:默认全部展开是没有意义的 69 | - 数据是否异步: 70 | - 服务树特别庞大:全部数据前端渲染比较卡 71 | - 根据父层级查子层级:向下一层查询 72 | - 根据父层级展开所有层级: 73 | - 不太想拼接 id形式 0-1-3-4 74 | 75 | 76 | # 服务树和cmdb课程大纲 77 | - 第1章 服务树的准备工作 78 | - 1.1 vben-树形结构01 79 | - 1.2 vben-树形结构02 80 | - 1.3 antd的树形结构 81 | - 1.4 思考服务树交互流程 82 | - 1.5 服务树菜单准备 83 | - 1.6 前端demo 84 | - 1.7 树形结构父子关系的问题 85 | - 1.8 准备下样式 86 | - 1.9 tree节点替换图标 87 | - 1.10 后端api同步获取treeData渲染 88 | 89 | - 第2章 treeData类型非异步服务树接口实现 90 | - 2.1 面包屑页面缓存不再请求后端接口问题 91 | - 2.2 节点node的字段和ogpa模型 92 | - 2.3 添加顶层节点的按钮 93 | - 2.4 新增节点流程前端打通 94 | - 2.5 新增节点的后端接口 95 | - 2.6 查询节点拼接children列表 96 | - 2.7 节点唯一性原则和新增节点提示语 97 | - 2.8 删除节点的前端保护措施 98 | - 2.9 删除节点的后端保护措施 99 | 100 | - 第3章 loadData类型异步服务树接口实现 101 | - 3.1 异步服务树接口实现 102 | - 3.2 头部打印服务树节点表示a.b.c.d后端接口 103 | - 3.3 头部打印服务树节点表示a.b.c.d前端展示 104 | - 3.4 添加基本信息 105 | - 3.5 调整标签页的样式 106 | - 3.6 节点详情字段展示 107 | - 3.7 联动展示 108 | - 3.8 修改节点信息的模态框 109 | - 3.9 vue3父子组件传值的问题 110 | - 3.10 带上form的modal 111 | 112 | - 第4章 服务树节点和人员权限 113 | - 4.1 理清人员和服务节点的关系 114 | - 4.2 定义节点人员列表 115 | - 4.3 运维负责人列表编辑和请求前端 116 | - 4.4 后端级联更新逻辑 117 | - 4.5 服务树接口权限通用检查方法 118 | - 4.6 测试添加节点父子权限继承问题 119 | - 4.7 删除节点和修改节点权限 120 | - 4.8 服务树展示收尾工作 121 | 122 | - 第5章 cmdb基础信息同步 123 | - 5.1 后面内容的展望 124 | - 5.2 从sdk中寻找阿里云ecs结构体 125 | - 5.3 设计ecs表结构 126 | - 5.4 GORM存取数组 127 | - 5.5 设计资源的公共字段 128 | - 5.6 同步公有云资源架构设计 129 | - 5.7 同步模块配置文件 130 | - 5.8 goroutine编排库 131 | - 5.9 公有云ticker同步任务 132 | - 5.10 workerpool并发同步内容 133 | 134 | - 第6章 cmdb增量同步 135 | - 6.1 入口同步多种资源 136 | - 6.2 toAdd-toDel等逻辑实现 137 | - 6.3 mock构造数据 138 | - 6.4 验证随机同步 139 | - 6.5 验证字段变更 140 | - 6.6 环境公共字段 141 | 142 | - 第7章 服务树和cmdb资源绑定 143 | - 7.1 增加叶子节点逻辑 144 | - 7.2 ecs资源绑定前端穿梭框 145 | - 7.3 未绑定节点ecs列表后端接口 146 | - 7.4 穿梭框问题修复 147 | - 7.5 树节点绑定ecs列表的api接口 148 | - 7.6 验证增量更新toDel级联删除 149 | - 7.7 解绑ecs资源 150 | - 7.8 绑定和解绑穿梭框互斥 151 | - 7.9 ecs数据展示表格调研 152 | - 7.10 ecs数据表格交互 153 | 154 | - 第8章 服务树和cmdb资源展示 155 | - 8.1 查询所有树子id 156 | - 8.2 limit和offset逻辑 157 | - 8.3 排查接口panic问题 158 | - 8.4 前端表格展示尝试vben 159 | - 8.5 递归获取所有子节点 160 | - 8.6 表格展示和mock数据 161 | - 8.7 表格分页遇到问题 162 | - 8.8 非首次选中执行reload 163 | - 8.9 表格查询搜索分类 164 | - 8.10 节点详情展示ecs绑定数量 165 | 166 | - 第9章 资源统计结合echarts 167 | - 9.1 总结下服务树的TODO 168 | - 9.2 echart初步整合 169 | - 9.3 vue3父子组件如何传递参数 170 | - 9.4 后端提供按标签统计的数据 171 | - 9.5 倒排图 图例标签 172 | - 9.6 ecs区域饼图 173 | - 9.7 重新编排后端mock数据 174 | - 9.8 重写递归获取所有子节点 175 | - 9.9 table-reload问题修复 176 | - 9.10 导入仪表盘 177 | 178 | - 第10章 资源统计02 179 | - 10.1 总cpu总内存尝试失败 180 | - 10.2 echart图表随节点刷新 181 | - 10.3 子组件watch对象变化 182 | - 10.4 叶子节点数量 183 | - 10.5 总cpu-内存-磁盘 184 | - 10.6 单个vue文件3-chart图表 185 | 186 | - 第11章 扩展其他资源:elb 187 | - 11.1 负载均衡器LB的sdk字段 188 | - 11.2 LB结构体基础字段 189 | - 11.3 对比nlb-alb-clb 190 | - 11.4 gorm基础方法 191 | - 11.5 nlb的ListLoadBalancers方法 192 | - 11.6 mock nlb的数据 193 | - 11.7 整理mock公共字段和独特字段 194 | - 11.8 资源表的公共字段 195 | - 11.9 elb增量更新 196 | - 11.10 同步资源计划任务文件拆分 197 | 198 | - 第12章 扩展cmdb-elb-资源绑定-表格 199 | - 12.1 验证elb的同步 200 | - 12.2 elb删除前查找错误 201 | - 12.3 新增elb标签页 202 | - 12.4 一个页面中使用多次UseTable 203 | - 12.5 elb绑定的穿梭框 204 | - 12.6 穿梭框的打开关闭 205 | - 12.7 elb绑定的后端接口 206 | - 12.8 elb解绑的后端接口 207 | - 12.9 elb数据表格和分页 208 | - 12.10 elb数据表格查询 209 | 210 | 【2】服务树-cdmb 第12章 扩展cmdb-elb-资源绑定-表格 211 | 【2】服务树-cdmb 第13章 扩展cmdb-elb-统计图标 212 | 【2】服务树-cdmb 第14章 扩展其他资源:rds 213 | 【2】服务树-cdmb 第8-14章资源展示绑定统计ecs rds elb 214 | 215 | - 第13章 扩展cmdb-elb-统计图标 216 | - 13.1 elb-统计图标基础 217 | - 13.2 elb后端统计方法 218 | - 13.3 前端chart数据对齐 219 | - 13.4 调整服务树节点资源统计汇总 220 | 221 | - 第14章 扩展其他资源:rds 222 | - 14.1 关系型数据库的sdk字段 223 | - 14.2 gorm方法和mock数据 224 | - 14.3 增量同步并验证结果 225 | - 14.4 绑定穿梭框 226 | - 14.5 后端绑定和解绑的逻辑 227 | - 14.6 前端表格展示 228 | - 14.7 表格搜索 229 | - 14.8 rds统计chart 230 | - 14.9 调整echart坐标轴样式 231 | - 14.10 表格tags列表颜色展示 232 | 233 | 234 | 235 | -------------------------------------------------------------------------------- /pic/大纲pic/k8s平台大纲.md: -------------------------------------------------------------------------------- 1 | 2 | k8s运维大师的课程:https://ke.qq.com/course/5586848 3 | 4 | 5 | 6 | # 本课程适合哪些学员 7 | - 想去写运维平台的同学,缺乏前端的实战 8 | - 缺乏go项目实战经验 9 | - k8s 管理的代码能力 10 | 11 | 12 | # 学习本课程需要具备的技能 13 | - 前端:1点不会都可以跟我一起写,不需要提前学习vue 14 | - 后端:go得有点基础 15 | 16 | 17 | # 本课程主要卖点 18 | - k8s管理的前后端都有 19 | - 前端 vue-element-admin 20 | - 后端 go 21 | - 前后端从0开始写,一点点去完成项目,中间涉及很多问题,当场解决 22 | - 最终部署到k8s集群中 23 | - 140个小节 ,时长够,内容丰富:涵盖了k8s 管理平台的主流功能 24 | 25 | # 20个课程简介 26 | ```shell 27 | p0 零基础入门 28 | p1 高可用调优 29 | p2 kube-prom 30 | p3 prom二开 31 | p4 p监控k8 32 | k0 零基础入门 33 | k1-k3 k8s源码 34 | k4 operator开发 35 | k5 运维大师 36 | k6 二开调度器 37 | g1 零基础入门 38 | g2 运维平台 39 | g3 巡检平台 40 | c1 tekton 41 | thanos + go99 + 职业规划+直播免费 不计入统计 42 | 总结:prometheus 6个 + k8s 7个 + go3个+cicd1个 =20 个 43 | 上面是对买课同学的标记和对应的课程,方便答疑时区分 44 | 45 | ``` 46 | 47 | 48 | 49 | # 目录 50 | 51 | - 第1章 开篇词 52 | - 1.1 开篇词 53 | 54 | - 第2章 设计之前的调研工作调研市面上的k8s管理平台 55 | - 2.1 调研kubesphere并总结它的功能点 56 | - 2.2 调研rancher并总结它的功能点 57 | - 2.3 管理平台的大概功能点 58 | 59 | - 第3章 官方的dashboard控制台安装 60 | - 3.1 官方的dashboard控制台安装 61 | - 3.2 官方的dashboard控制台讲解 62 | - 3.3 使用dashboard部署nginx并扩缩容 63 | 64 | - 第4章 结合dashboard来思考我们的平台 65 | - 4.1 认证中1.24集群sa和secret问题 66 | - 4.2 要不要做rbac登录和认证 67 | - 4.3 k8s通用资源的展示 68 | - 4.4 强交互的对象 69 | 70 | - 第5章 运维兄弟正确学习前端的姿势 71 | - 5.1 运维学前端的困境 72 | 73 | - 第6章 前后端技术选型 74 | - 6.1 前端技术选型 75 | - 6.2 后端技术选型 76 | 77 | - 第7章 熟悉vue-element-admin项目 78 | - 7.1 安装nvm和nodejs 79 | - 7.2 安装vue-element-admin 80 | - 7.3 认识它的vue-element-admin基本组件 81 | - 7.4 做些简单改动看看效果 82 | 83 | - 第8章 添加一个展示节点的列表页 84 | - 8.1 如何添加一个页面 85 | - 8.2 created钩子的loading效果 86 | - 8.3 获取表格数据的请求链路 87 | 88 | - 第9章 用mock改造我们的表格数据 89 | - 9.1 复制核心链路 90 | - 9.2 根据GetList中学习mockjs的样例 91 | - 9.3 定好我们需要什么k8sNode数据 92 | - 9.4 在mock去构造k8sNode数据 93 | 94 | - 第10章 vue中改造表格展示数据 95 | - 10.1 e-tag表格改变字段颜色 96 | - 10.2 filter替换表格字段文字 97 | - 10.3 e-diag对话框展示节点上pod列表之打通链路 98 | - 10.4 describe node的pod字段 99 | 100 | - 第11章 表格中的按钮操作 101 | - 11.1 cordon节点按钮并局部刷新页面 102 | - 11.2 按钮使用filter变更颜色 103 | - 11.3 节点标签表格展示 104 | - 11.4 动态表单给节点打标签失败了 105 | - 11.5 json编辑器给节点打标签 106 | - 11.6 funcxxx后的then含义 107 | - 11.7 解决json内容不变时按钮报错 108 | 109 | - 第12章 表格中的排序搜索导出操作 110 | - 12.1 前端排序 111 | - 12.2 后端排序 112 | - 12.3 表格前端搜索 113 | - 12.4 表格后端搜索 114 | - 12.5 表格导出 115 | 116 | - 第13章 节点列表中的其他操作 117 | - 13.1 污点相关操作:需要打开对话框进行的变更操作 118 | - 13.2 驱逐节点上的pod:简单的按钮 119 | 120 | - 第14章 研究一下vue-ele的登录认证流程 121 | - 14.1 自带的账号密码登录流程 122 | - 14.2 vuex中设置k8sToken 123 | - 14.3 每次请求的时候都带上k8sToken 124 | 125 | - 第15章 准备后端的基础框架代码 126 | - 15.1 后端代码的目录结构 127 | - 15.2 设计核心的clientManger 128 | - 15.3 断点了解go-result的request对象 129 | - 15.4 根据request请求动态构造kubeClient 130 | 131 | - 第16章 打通登录认证和k8s的rbac后端接口准备 132 | - 16.1 梳理一下都要哪些后端接口 133 | - 16.2 改造后端代码实现路由和方法注册 134 | - 16.3 实现user-info-login接口遇到问题 135 | - 16.4 使用validator补足校验问题 136 | - 16.5 打通user-info-login接口的交互流程 137 | - 16.6 如何通过K8sToken获取用户信息 138 | 139 | - 第17章 登录登出前后端联调 140 | - 17.1 userLogin接口中出现的跨域问题 141 | - 17.2 实现userInfo接口 142 | - 17.3 把sa真实信息打到导航栏上 143 | - 17.4 logout实现过程中的406错误 144 | 145 | - 第18章 k8sNode-list操作联调 146 | - 18.1 listNode接口list结构体定义 147 | - 18.2 readyStatus怎么获取 148 | - 18.3 调度状态和role 149 | - 18.4 其余字段的赋值 150 | - 18.5 定义请求和相应的log中间件 151 | - 18.6 pycharm测试一下 152 | - 18.7 running-pod数量的获取 153 | - 18.8 for循环同步操作的危害和解法 154 | - 18.9 前后联调 155 | 156 | - 第19章 k8sNode中单个节点的操作 157 | - 19.1 展示节点上pod列表 158 | - 19.2 禁止打开调度 159 | - 19.3 变更标签 160 | - 19.4 变更污点 161 | - 19.5 驱逐节点上的pod 162 | 163 | - 第20章 k8sNode查询分页导出 164 | - 20.1 关键字查询和导出 165 | - 20.2 分页 166 | 167 | - 第21章 k8sNode详情页和跳转 168 | - 21.1 思考一下详情页都有什么 169 | - 21.2 详情页布局设计之基础信息 170 | - 21.3 详情页布局设计之其他信息 171 | - 21.4 列表跳转和detail详情接口 172 | - 21.5 表格展示array数组 列表展示map型的 173 | - 21.6 节点event数据接口和展示 174 | - 21.7 节点上的pod列表 175 | 176 | 177 | - 第22章 k8sNode监控图表echarts 178 | - 22.1 后端借鉴kubectl top node的数据 179 | - 22.2 vue引入echart绘制图表 180 | - 22.3 以cpu为样例打通监控数据 181 | - 22.4 mem的折线图 182 | - 22.5 pod的速度仪表盘图 183 | - 22.6 read properties of null问题解决 184 | - 22.7 临时存储数据 185 | 186 | - 第23章 切换namespace区分的资源相关事项 187 | - 23.1 切换ns的选择列表样式 188 | - 23.2 后端获取namespace列表的接口 189 | - 23.3 vuex设置k8s-ns全局store 190 | 191 | 192 | - 第24章 deployment列表和缩放 193 | - 24.1 前端准备表格 194 | - 24.2 后端准备list接口和字段 195 | - 24.3 前端后端联调表格 196 | - 24.4 scale缩放deployment的按钮和后端打通 197 | - 24.5 vuex刷新页面后store数据消失问题解决 198 | - 24.6 rollout restart deploy 199 | - 24.7 删除deploy 200 | 201 | 202 | - 第25章 deployment 编辑yaml 203 | - 25.1 前端样式js-yaml等组件 204 | - 25.2 后端返回yaml字符串并在编辑器中展示 205 | - 25.3 利用json中转yaml变更的流程 206 | - 25.4 完善dep中的表格 搜索 下载 样式等 207 | 208 | - 第26章 编辑和上传yaml文件部署应用 209 | - 26.1 前端设计样式 210 | - 26.2 yaml文件上传的跨域问题 211 | - 26.3 kubectl apply yaml_file的问题 212 | - 26.4 先本地写dynamicClient跑通 213 | - 26.5 dyc逻辑何进restful处理中 214 | - 26.6 在线编辑yaml的逻辑 215 | 216 | - 第27章 pod列表展示和操作 217 | - 27.1 前端准备表格 后端list接口 218 | - 27.2 前后端联调表格展示 219 | - 27.3 pod的动作之在线编辑yaml 220 | - 27.4 pod的动作之删除 221 | - 27.5 pod整花活儿之状态变色 222 | 223 | - 第28章 pod详情页 224 | - 28.1 后端pod-detail接口 225 | - 28.2 详情页布局设计之基础信息 226 | - 28.3 pod echarts监控 227 | - 28.4 详情页导航栏隐藏菜单 228 | 229 | - 第29章 pod日志 230 | - 29.1 pod查看日志的前端展示和控制区 231 | - 29.2 upload上传文件和websocket url地址引用环境变量 不写死 232 | - 29.3 vue前端websocket技术 233 | - 29.4 go后端websocket代码样例 234 | - 29.5 后端准备ws的session 235 | - 29.6 前端请求sessionId的流程 236 | - 29.7 ws代理读写数据流程 237 | - 29.8 梳理ws心跳和数据读写流程 238 | - 29.9 令人恶心的重连 239 | - 29.10 pod日志前端换行和总结 240 | 241 | - 第30章 exec-shell pod容器中执行命令 242 | - 30.1 web-shell的前端term 243 | - 30.2 后端准备ws的session 244 | - 30.3 测试web-shell 245 | - 30.4 总结一下websocket 246 | 247 | - 第31章 收尾工作 248 | - 31.1 导航栏清理 249 | - 31.2 后端打包镜像部署到k8s中 250 | - 31.3 前端打包镜像之尝试01 251 | - 31.4 前端打包镜像之尝试02 252 | 253 | 技术选型:前端 后端 存储选哪个 254 | 255 | 256 | -------------------------------------------------------------------------------- /prometheus免费课程/service/m3db/m3dbnode_single.yaml: -------------------------------------------------------------------------------- 1 | # Include this field if you want to enable an embedded M3Coordinator instance. 2 | coordinator: 3 | # Address for M3Coordinator to listen for traffic. 4 | listenAddress: 0.0.0.0:7201 5 | 6 | # All configured M3DB namespaces must be listed in this config if running an 7 | # embedded M3Coordinator instance. 8 | local: 9 | namespaces: 10 | - namespace: default 11 | type: unaggregated 12 | retention: 48h 13 | 14 | # Configuratino for M3Coordinator logging. 15 | logging: 16 | level: info 17 | 18 | # Configuration for emitting M3Coordinator metrics. 19 | metrics: 20 | scope: 21 | # Prefix to apply to all metrics. 22 | prefix: "coordinator" 23 | prometheus: 24 | # Path and address to expose Prometheus scrape endpoint. 25 | handlerPath: /metrics 26 | listenAddress: 0.0.0.0:7203 # until https://github.com/m3db/m3/issues/682 is resolved 27 | sanitization: prometheus 28 | # Sampling rate for metrics, use 1.0 for no sampling. 29 | samplingRate: 1.0 30 | extended: none 31 | 32 | tagOptions: 33 | # Configuration setting for generating metric IDs from tags. 34 | idScheme: quoted 35 | 36 | db: 37 | # Minimum log level which will be emitted. 38 | logging: 39 | level: info 40 | 41 | # Configuration for emitting M3DB metrics. 42 | metrics: 43 | prometheus: 44 | # Path to expose Prometheus scrape endpoint. 45 | handlerPath: /metrics 46 | sanitization: prometheus 47 | # Sampling rate for metrics, use 1.0 for no sampling. 48 | samplingRate: 1.0 49 | extended: detailed 50 | 51 | # Address to listen on for local thrift/tchannel APIs. 52 | listenAddress: 0.0.0.0:9000 53 | # Address to listen on for cluster thrift/tchannel APIs. 54 | clusterListenAddress: 0.0.0.0:9001 55 | # Address to listen on for local json/http APIs (used for debugging primarily). 56 | httpNodeListenAddress: 0.0.0.0:9002 57 | # Address to listen on for cluster json/http APIs (used for debugging primarily). 58 | httpClusterListenAddress: 0.0.0.0:9003 59 | # Address to listen on for debug APIs (pprof, etc). 60 | debugListenAddress: 0.0.0.0:9004 61 | 62 | # Configuration for resolving the instances host ID. 63 | hostID: 64 | # "Config" resolver states that the host ID will be resolved from this file. 65 | resolver: config 66 | value: m3db_local 67 | 68 | client: 69 | # Consistency level for writes. 70 | writeConsistencyLevel: majority 71 | # Consistency level for reads. 72 | readConsistencyLevel: unstrict_majority 73 | # Timeout for writes. 74 | writeTimeout: 10s 75 | # Timeout for reads. 76 | fetchTimeout: 15s 77 | # Timeout for establishing a connection to the cluster. 78 | connectTimeout: 20s 79 | # Configuration for retrying writes. 80 | writeRetry: 81 | initialBackoff: 500ms 82 | backoffFactor: 3 83 | maxRetries: 2 84 | jitter: true 85 | # Configuration for retrying reads. 86 | fetchRetry: 87 | initialBackoff: 500ms 88 | backoffFactor: 2 89 | maxRetries: 3 90 | jitter: true 91 | # Number of times we background health check for a node can fail before 92 | # considering the node unhealthy. 93 | backgroundHealthCheckFailLimit: 4 94 | backgroundHealthCheckFailThrottleFactor: 0.5 95 | 96 | # Sets GOGC value. 97 | gcPercentage: 100 98 | 99 | # Whether new series should be created asynchronously (recommended value 100 | # of true for high throughput.) 101 | writeNewSeriesAsync: true 102 | writeNewSeriesBackoffDuration: 2ms 103 | 104 | bootstrap: 105 | commitlog: 106 | # Whether tail end of corrupted commit logs cause an error on bootstrap. 107 | returnUnfulfilledForCorruptCommitLogFiles: false 108 | 109 | cache: 110 | # Caching policy for database blocks. 111 | series: 112 | policy: lru 113 | 114 | commitlog: 115 | # Maximum number of bytes that will be buffered before flushing the commitlog. 116 | flushMaxBytes: 524288 117 | # Maximum amount of time data can remain buffered before flushing the commitlog. 118 | flushEvery: 1s 119 | # Configuration for the commitlog queue. High throughput setups may require higher 120 | # values. Higher values will use more memory. 121 | queue: 122 | calculationType: fixed 123 | size: 2097152 124 | 125 | filesystem: 126 | # Directory to store M3DB data in. 127 | filePathPrefix: /opt/app/m3db/data 128 | # Various fixed-sized buffers used for M3DB I/O. 129 | writeBufferSize: 65536 130 | dataReadBufferSize: 65536 131 | infoReadBufferSize: 128 132 | seekReadBufferSize: 4096 133 | # Maximum Mib/s that can be written to disk by background operations like flushing 134 | # and snapshotting to prevent them from interfering with the commitlog. Increasing 135 | # this value can make node adds significantly faster if the underlyign disk can 136 | # support the throughput. 137 | throughputLimitMbps: 1000.0 138 | throughputCheckEvery: 128 139 | 140 | # This feature is currently not working, do not enable. 141 | repair: 142 | enabled: false 143 | throttle: 2m 144 | checkInterval: 1m 145 | 146 | # etcd configuration. 147 | discovery: 148 | config: 149 | service: 150 | # KV environment, zone, and service from which to write/read KV data (placement 151 | # and configuration). Leave these as the default values unless you know what 152 | # you're doing. 153 | env: default_env 154 | zone: embedded 155 | service: m3db 156 | # Directory to store cached etcd data in. 157 | cacheDir: /opt/app/m3db/m3kv 158 | # Configuration to identify the etcd hosts this node should connect to. 159 | etcdClusters: 160 | - zone: embedded 161 | endpoints: 162 | - 127.0.0.1:2379 163 | # Should only be present if running an M3DB cluster with embedded etcd. 164 | seedNodes: 165 | initialCluster: 166 | - hostID: m3db_local 167 | endpoint: http://127.0.0.1:2380 168 | 169 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prome_k8s_all_pod/prometheus_config.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: prometheus-config 5 | namespace: kube-system 6 | data: 7 | prometheus.yml: | 8 | global: 9 | scrape_interval: 30s 10 | evaluation_interval: 30s 11 | external_labels: 12 | cluster: "01" 13 | scrape_configs: 14 | - job_name: kube-etcd 15 | kubernetes_sd_configs: 16 | - role: endpoints 17 | scheme: https 18 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 19 | relabel_configs: 20 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] 21 | action: keep 22 | regex: kube-system;kube-etcd 23 | tls_config: 24 | ca_file: /etc/prometheus/secrets/etcd-certs/ca.crt 25 | cert_file: /etc/prometheus/secrets/etcd-certs/healthcheck-client.crt 26 | key_file: /etc/prometheus/secrets/etcd-certs/healthcheck-client.key 27 | insecure_skip_verify: true 28 | - job_name: 'kube-scheduler' 29 | kubernetes_sd_configs: 30 | - role: endpoints 31 | scheme: https 32 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 33 | tls_config: 34 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 35 | insecure_skip_verify: true 36 | relabel_configs: 37 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] 38 | action: keep 39 | regex: kube-system;kube-scheduler 40 | - job_name: 'kube-controller-manager' 41 | kubernetes_sd_configs: 42 | - role: endpoints 43 | scheme: https 44 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 45 | tls_config: 46 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 47 | insecure_skip_verify: true 48 | relabel_configs: 49 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] 50 | action: keep 51 | regex: kube-system;kube-controller-manager 52 | - job_name: 'kubernetes-apiservers' 53 | kubernetes_sd_configs: 54 | - role: endpoints 55 | scheme: https 56 | tls_config: 57 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 58 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 59 | relabel_configs: 60 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] 61 | action: keep 62 | regex: default;kubernetes;https 63 | - job_name: kube-state-metrics 64 | metrics_path: /metrics 65 | scheme: http 66 | static_configs: 67 | - targets: 68 | - kube-state-metrics:8080 69 | 70 | - job_name: kubernetes-nodes-kubelet 71 | kubernetes_sd_configs: 72 | - role: node 73 | relabel_configs: 74 | - action: labelmap 75 | regex: __meta_kubernetes_node_label_(.+) 76 | scheme: https 77 | tls_config: 78 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 79 | insecure_skip_verify: true 80 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 81 | - job_name: kubernetes-nodes-cadvisor 82 | metrics_path: /metrics 83 | scheme: https 84 | kubernetes_sd_configs: 85 | - role: node 86 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 87 | tls_config: 88 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 89 | insecure_skip_verify: true 90 | relabel_configs: 91 | - action: replace 92 | regex: (.+) 93 | source_labels: 94 | - __meta_kubernetes_node_label_kubernetes_io_hostname 95 | target_label: node 96 | - separator: ; 97 | regex: __meta_kubernetes_node_label_(.+) 98 | replacement: $1 99 | action: labelmap 100 | - separator: ; 101 | regex: (.*) 102 | target_label: __metrics_path__ 103 | replacement: /metrics/cadvisor 104 | action: replace 105 | - job_name: kubernetes-pods 106 | scheme: https 107 | tls_config: 108 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 109 | insecure_skip_verify: true 110 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 111 | kubernetes_sd_configs: 112 | - role: pod 113 | relabel_configs: 114 | - action: keep 115 | regex: true 116 | source_labels: 117 | - __meta_kubernetes_pod_annotation_prometheus_io_scrape 118 | - action: replace 119 | regex: (.+) 120 | source_labels: 121 | - __meta_kubernetes_pod_annotation_prometheus_io_path 122 | target_label: __metrics_path__ 123 | - action: replace 124 | regex: ([^:]+)(?::\d+)?;(\d+) 125 | replacement: $1:$2 126 | source_labels: 127 | - __address__ 128 | - __meta_kubernetes_pod_annotation_prometheus_io_port 129 | target_label: __address__ 130 | - action: labelmap 131 | regex: __meta_kubernetes_pod_label_(.+) 132 | - action: replace 133 | source_labels: 134 | - __meta_kubernetes_namespace 135 | target_label: kubernetes_namespace 136 | - action: replace 137 | source_labels: 138 | - __meta_kubernetes_pod_name 139 | target_label: kubernetes_pod_name 140 | - job_name: 'kubernetes-service-endpoints' 141 | kubernetes_sd_configs: 142 | - role: endpoints 143 | relabel_configs: 144 | - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] 145 | action: keep 146 | regex: true 147 | - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] 148 | action: replace 149 | target_label: __scheme__ 150 | regex: (https?) 151 | - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] 152 | action: replace 153 | target_label: __metrics_path__ 154 | regex: (.+) 155 | - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] 156 | action: replace 157 | target_label: __address__ 158 | regex: ([^:]+)(?::\d+)?;(\d+) 159 | replacement: $1:$2 160 | - action: labelmap 161 | regex: __meta_kubernetes_service_label_(.+) 162 | - source_labels: [__meta_kubernetes_namespace] 163 | action: replace 164 | target_label: kubernetes_namespace 165 | - source_labels: [__meta_kubernetes_service_name] 166 | action: replace 167 | target_label: kubernetes_name 168 | - source_labels: [__address__] 169 | action: replace 170 | target_label: instance 171 | regex: (.+):(.+) 172 | replacement: $1 173 | -------------------------------------------------------------------------------- /pic/大纲pic/1v1新课程的头脑风暴.md: -------------------------------------------------------------------------------- 1 | 【VIP1对1视频直播连麦】解决你真实工作问题 带你开发并提供源码 自由提问 2 | 3 | # 2.11 进行总结: 4 | - 长达1年的1对1直播视频连麦 5 | - 自由提任何k8s/监控/cicd/golang问题 6 | - 带你分析并解决你搞不定的问题 7 | - 帮助你开发代码并给你源码 8 | - 系统的由运维专家带你提升 9 | 10 | # 再来认识一下小乙老师 和之前的课程风格 11 | > 风格:录播课程,各个方向专精 12 | - k8s 13 | - 网关有需求:apisix 和ingress运维开发课程 14 | - 调度:调度开发 15 | - 资源利用率:在离混部,潮汐调度 16 | - 源码:三合一和新源码 17 | - Prometheus 18 | - cicd 19 | - golang 20 | - 运维对于前端vue+后端golang的运维平台:8模块运维平台 21 | > 不再列举了: 总结来说:我发现某一方向集中需求: 22 | - 抽象这个方向所需要的技能,知识点,总结形成一门课程 23 | 24 | 25 | # 可能还有哪些需求 26 | 27 | > 对于工作的具体问题:解决的能力 28 | - 但是很多兄弟不具备从 抽象,公共的课程到具体独特实际问题的能力 29 | 30 | > 学习过程中即使反馈的需求 31 | - 录播:只能总结问题,提问后面再解答 32 | - 肯定不如当面 直播连线具体解答的 33 | 34 | > 遇到复杂的问题:不知道应用什么组件,开发什么功能 35 | - 解决方案工程师 36 | 37 | # 新课程就是 根据你的实际问题,直播连麦 个性化的出解决方案 38 | 39 | 40 | 41 | # 适合哪些人群? 42 | 1. 手里有实际运维/开发的项目,但是不知道怎么解决 (运维相关岗位)
43 | - 之前咨询实际的问题: 44 | - 监控系统的瓶颈,怎么打通 45 | - k8s集群中的问题 46 | - 开发一个小平台 47 | 48 | 2. 更高层次,能找到TOB,小公司找解决方案 49 | 3. 跟这个类似 50 | 4. 更多的是公司 负责人,相比与个人来说更高层次 51 | 5. 解决方案 52 | 6. 没有项目,只是想1v1的接受我的指导,学习 53 | 7. 想跟着我系统被培训,提升能力 54 | 8. 不满足1vn的通用课程,小灶,类似孩子的课外私教,专属的 55 | 56 | # 1.4 技术组件的范围 57 | - 虽然我现在比较自信 :覆盖比较广 58 | - 但是运维还是太杂,我也有短处,限定一下范围 59 | 60 | ## 限定范围 k8s、Prometheus、cicd、golang 61 | - k8s、Prometheus、cicd、golang 62 | - 具体的case 63 | - 组件搭建 64 | - 架构设计 65 | - 性能调优 66 | - 轻代码 小组件的开发 67 | - 大部分的问题:最终的解决 代码可能并不多 68 | - 源码解读 69 | 70 | ## 我不擅长的东西 71 | - 网络不太行:物理网络,交换机 72 | - k8s中的网络我这里OK 73 | - 安全组件:不行 74 | - 非golang代码的:java 组件 75 | - 特别流行的除外:gitlab ,必备的技能 76 | - 采购的商业产品:jira wiki,闭源的 77 | 78 | # 1.5 你和小乙老师的交互的形式 79 | > 区别录播的,直播类型 1v1的 80 | - 让我持续的帮你解决工作中的实际问题 81 | > 周末进行1-2天的视频连麦 82 | - 视频直播 83 | - 连麦:实时语音的交流 84 | - 你可以提前准备好你的问题 85 | - 适当的时候可以vpn演示一下:让我明白你的问题 86 | > 录播的问题 87 | - 视频还要被录制下:抽象做一种录播课程: 88 | - eg:你的需求是让我帮你解决监控系统组件问题 89 | - 大概率是别人也会遇到 90 | - 做解决方案的案例 91 | - 信息脱敏:肯定会做的 92 | - 最后这个全量的视频也会给你:复盘:看我遇到问题是怎么分析,解决的 93 | 94 | # 1.6 解决问题的有效期 95 | - 你拍了这个课程 ,可以持续多久 96 | > 到这里 有2个思路: 项目制 vs 时长制 97 | - 项目制的意思就是只解决这个项目:下个项目再拍了 98 | - 时长制:假设是1年,1年内可以解决任意的项目 99 | 100 | > 还是时长靠谱: 101 | - 项目如果没有时间的限制,可能会拖的很长: 102 | - eg,比如提升k8s集群利用率的项目,短可以1天,长就没边了: 103 | 104 | > 时长的制: 105 | - 有效期内:可以提出问题,解决 106 | - 过了有效期:不是说立马就不能再问问题,解决了 107 | - 可能从原来的直播连麦 降级成了 过几天给你一个语音解决方案,给你一个文档等等 108 | 109 | > 时长到底多长? 110 | - 1年的方案:1年很长的,足够你成长了,足够帮你解决几个真实的问题了 111 | 112 | 113 | # 1.7 你购买课程的收益和潜在的交付物 114 | > 收益还要从潜在客户来说 115 | - 希望小乙帮你解决工作问题: 116 | - 现在有个棘手的问题,项目,你1个月 1个Q做出成果,那么升职加薪 117 | - 或者有奖金,更重要是你跟着小乙老师学会了如果 分析问题,解决问题 118 | - 1对1的辅导 119 | - 更好的学习培训效果 120 | - 找工作,面试指导,简历的修改 121 | - 总结面试题,模拟面试 122 | 123 | > 交付物 124 | - 解决方案: 125 | - 架构图 126 | - puml流程图 127 | - 技术文档 128 | - 开发组件源代码 129 | - 部署方案 130 | - 等等 131 | - 面试题。。 132 | - 直播连麦的指导 133 | - 录播的视频 134 | 135 | # 1.8 涉及已有录播课程的解决方式 136 | - 在给你出解决方案的时候:开发一些组件 137 | - 这些组件大概率不是从0开始的 138 | - 之前的录播课程也都覆盖的比较全了 139 | - 很有可能是基于我现有录播课程代码的二次开发 140 | - 如果是一个小的课程:录播可以直接送给你 141 | - 如果是8模块的话:录播可能不能完全给你 142 | 143 | # 1.9 二次开发的问题 144 | - 大概率是要二次开发的:本课程主打点: 145 | - 有能力的兄弟,看了通用录播课程,就具备自己变通更改应用到他自身环境的能力 146 | - 大部分人不具备:由我来做这个对接,二开,更深 147 | - 二次开发的程度:我理解不需要特别深挖 148 | - 大部分需求 还是没有那么复杂的 149 | - 偏架构的层面: 150 | - 应该应用什么组件 151 | - 什么形式 152 | - 怎么交互 153 | 154 | 155 | # 1.10 web平台开发的问题 156 | > 开发大概分成2类: 157 | - 纯后端的: 158 | - k8s中写个Daemonset 159 | - k8s的webhook 160 | - 调度器 161 | - 监控thanos 集群组件交互 162 | - 告警发送等等 163 | - vue+golang前后端 :web平台 164 | - 8模块:耗时费力,最好不要开发大的多模块的运维平台 165 | - 需要考量的东西特别多:cicd灰度发布就需要服务树支持 166 | - 对接你公司内部的一些系统:oa。。。等等 167 | - 如果涉及平台: 168 | - 单一功能:监控相关、 169 | - 鉴权,人员简单一点 170 | - 为什么要避开大运维平台开发 171 | - 很容易就变成一种真正的TOB定制开发的 长项目制 172 | - 你拍这个课程的钱根本不够TOB定制 173 | - 如果有的话:建议去拍8模块,自行琢磨 174 | 175 | # 2.1 购买方式等问题 176 | - 这个课程不是录播:找一个平台做订单的留档 177 | - 从哪里拍都差不多 178 | - B站抽成30%,成本要加给你 179 | - 应该还是抖音+学浪 180 | - 拍课程的形式:咱们提前沟通好了之后:去抖音拍课程 181 | - 我会把介绍的这20期视频作为录播放到这个课程里面 182 | - 你花钱明面上拍的是这个介绍的视频:录播形式 购买这个订单 183 | - 实际上交付物:是- 按照拍日期开始算:往后的N 的服务周期 直播连麦 解决方案 184 | 185 | # 2.2 关于退款的问题 186 | - 因为最终这个价格:相比于录播要高 187 | - 可能就会有退款的问题:丑话说在前面 188 | - 我希望这样的: 189 | - 你拍之前咱们进行沟通注意事项 190 | - 最好你有 项目 学习需求再来拍 191 | - 避免当时脑子一热拍了,之后发现需求没有了 192 | - 如果已经服务了几个月了,还想退款怎么办 193 | - 订单肯定退不了:按同等价格给你折算成我的录播课程 194 | 195 | # 2.3 关于服务周期和价格的问题 196 | - 周期和价格肯定是正比关系:周期长价格高 197 | - 我个人收费标准,基线 198 | - 按最低标准:我1个周末1天 1千 199 | - 一个月8个周末,平均下来4K一个月 200 | - 一年就是 12*4K=4.8w 201 | - 一年5w你肯定不乐意,确实贵了 202 | - 我会分2个班(现在说的价格只是初步定的,可能后续会变化,调整) 203 | - 1个是1个月周期的,体验课:1个月5K 204 | - 1个是1年周期的,长期课程:1年1.2w-1.3w 205 | 206 | # 2.4 关于周末直播视频连麦的问题 207 | - 一个月8个周末,平均下来是4天: 208 | - 之前给培训班代课的时候:他们一般是1个周末只上1天 209 | - 目的是给一定休息,消化吸收的时间:合理的 210 | - 我这边肯定是周末2天连轴转是没问题的: 211 | - 看你的时间了 212 | - 每天的小时安排:延续之前培训班的时间 213 | - 早9到中午12点 214 | - 午休到2点 215 | - 2点到下午6点 216 | - 所以1天就是7小时:大概率是用不到的 217 | 218 | # 2.5 多个学员时间冲突的问题 219 | - 接上回:这周六有2个学员都要直播怎么办 220 | - 之前咱们承诺是 1对1,所以咱们这边就得错开 221 | - 周六是辅导A,周日辅导B 222 | - 你周末连轴转2天,你大概率是坚持不下来的:跟我差的远 223 | - 很有可能你们冲突不到一起: 224 | - 这一周正在吸收我的上一周给你的方案,这一周正在休息,不需要直播连麦 225 | - 按1周的间隔错开: 226 | - 如果小乙老师周末有事情怎么办: 227 | - 顺延到下一周:因为这个是个长期的事情,不在乎1天 228 | 229 | # 2.6 高频的项目问题 230 | > prometheus监控系统 231 | - 设计或者改造你们当前的监控系统 232 | - thanos、vm、服务发现等等 233 | - 监控系统性能问题:慢查询、oom 234 | - 成本太高了 235 | - 不会飞书IM卡片告警通知 236 | - 监控指标,大盘图,业务监控从0到1 237 | - promql 告警指标 238 | - 值班系统 239 | - 采集、查询、存储、告警等等 240 | - 开发自定义的exporter 241 | 242 | # 2.7 高频的项目问题之K8s集群 243 | - k8s中基础组件的合理使用 244 | - 监控、控制面、业务 245 | - 日志采集 246 | - 存储使用 247 | - 节点参数、各个目录磁盘存储 248 | - ingress网关 249 | - 多集群管控 250 | - 多集群守卫 251 | - web平台 252 | - 问题解决及开发的 253 | - 提升集群资源利用率 254 | - 控制面的调优 255 | - webhook 256 | - 在离混部,潮汐调度 257 | - 真实负载 258 | - 临时存储使用 259 | - operator开发 260 | - 容器的发布 261 | - 灰度 262 | - 自动发布 263 | 264 | # 2.8 高频的项目问题之cicd系统 265 | - 通用 266 | - ci gitlab ci 267 | - 静态代码扫描:lint 268 | - 主语言的类型:java golang 269 | - 虚拟机环境 270 | - 服务树的开发支持: 271 | - 人员权限校验 272 | - 机器资源绑定 273 | - cs任务执行开发:cicd 推送 274 | - k8s环境 275 | - k8s灰度发布 276 | - dev集群发布 277 | - 发布工单 278 | - 开源组件的支持 279 | - argocd 280 | - tekton 281 | - cd自研 282 | 283 | # 2.9 高频的项目问题之golang运维平台 284 | - 生命周期管理 285 | - 巡检 286 | - 对接公有云,购买资源,服务树cmdb资源同步 287 | - 任务执行 cs ,grpc的开发 288 | - 工单 289 | - 特定运维模块的开发 290 | - k8s平台 291 | - Prometheus 292 | - cicd平台 293 | 294 | # 2.10 可能涉及的开源组件 295 | - k8s 296 | - calico 297 | - kube-builder 298 | - fluentbit 299 | - ilogtail 300 | - certmanager 301 | - openkruise 302 | - etcd 303 | - containerd 304 | - cri-tools 305 | - scheduler-framework 306 | - devices-plugin 307 | - csi-相关的external-privasioner 308 | - xxx-operatorer 309 | - apisix 310 | - ingress-nginx 311 | - prometheus 312 | - thanos 313 | - prometheus-operator 314 | - xxx-exporter 315 | - vm 316 | - m3db 317 | - grafana 318 | - cicd 319 | - argocd 320 | - argorollout 321 | - tekton 322 | - gitlab-ci 323 | - kaniko 324 | 325 | 326 | # 2.11 进行总结: 327 | - 长达1年的1对1直播视频连麦 328 | - 自由提任何k8s/监控/cicd/golang问题 329 | - 带你分析并解决你搞不定的问题 330 | - 帮助你开发代码并给你源码 331 | - 系统的由运维专家带你提升 -------------------------------------------------------------------------------- /pic/大纲pic/7模块-底座大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 购买课程后 推荐的最佳学习模式 4 | - 多思考,多质疑,多提问 5 | - 跟着敲代码:不要只看视频 6 | - 举一反三 7 | 8 | # 决心 坚持下去 9 | 10 | 11 | 12 | 13 | # 大运维平台7大模块 14 | - 01 资产管理 & cmdb & 服务树 15 | - 02 工单 & 工作流 & 审批 16 | - 03 cicd 全流程配置 17 | - 04 Prometheus管理配置 18 | - 05 k8s多集群管理 19 | 20 | ## 00 为什么是这7个模块 21 | - k8s/prometheus/cicd作为当下3大运维开发主流方向,这点大家都知道 22 | - 但是如果只做上面3个模块还少了些基础的模块 23 | - 这里的基础模块说的就是 cmdb和工单 24 | - cmdb很好理解: 25 | - 监控/cicd/k8s等内部很多资源都属于资源 26 | - 资源就需要有管理的地方 27 | - 同时资产和服务的绑定形式应该是一颗服务树 28 | - 在服务树的节点上可以配置权限和绑定其他模块资源 29 | - 比如给 data.system.dns 绑定cicd发布模板可以发布dns配置 30 | - 比如给 infra.sre.apolloy绑定监控告警配置项 31 | - 那么为什么还需要工单呢,主要原因有下面2点 32 | - 01 因为我们很多的操作需要工单审批之后才做 33 | - 比如 在页面上通过yaml编辑器编辑 k8s的deployment 会触发变更 34 | - 此时应该触发生成一张工单:经过预设的审批人审批后 再执行 35 | - 02 还有一些我们通用的运维工作需要工单支持 36 | - 比如调整安全组 37 | - 比如申请consul 服务发现token 38 | 39 | # 各个实现细节上面: 40 | - 一定程度的追新: 41 | 42 | 43 | # 调研目的 44 | - 热门模块有哪些: 45 | - 9个 都实现了 k8s 46 | - 每个模块的核心功能 47 | - 对于权限 、人员的管理 48 | - 角色,用户,菜单权限 49 | - 你可以控制哪些人能看到那些菜单 http://119.91.78.168:8090/wecmdb/#/wecmdb/admin/permission-management 50 | - 51 | - 前后端的技术选型: 52 | - 用go的多不多 53 | - vue 还是react 54 | - 页面布局之类 55 | 56 | 57 | # 调研结果 58 | - 用户权限: 59 | - 前端菜单权限 60 | - 也可以由后端提供接口 getMenu 这个人可以看到哪些菜单 61 | - 62 | - 后端接口权限 63 | - 登陆 64 | - logout http://localhost:3100/basic-api/logout?_t=1690080936282 65 | - login http://localhost:3100/basic-api/login 66 | - getUserInfo http://localhost:3100/basic-api/getUserInfo?_t=1690080986576 67 | - 数据权限:对于数据端点 增删改查 执行的权限 68 | - cicd https://walle-web.io/docs 69 | - 可以配置流水线 发布项:都有哪些步骤,哪些主机 70 | - 调研_cicd发布项配置-复杂表单.png ![image](pic研_cicd发布项配置-复杂表单.png) 71 | - 执行过程,可视化输出--> 流程图 72 | - 执行到哪一步了,每一步的执行结果 73 | - 上线 cd 是需要工单的 74 | - 资产管理 75 | - 堡垒机 76 | - webssh操作记录回放 77 | - 工单系统 78 | - 工单进度 ![image](pic研_工单进度.png) 79 | 80 | 81 | 【1】底座基础 第1章 第1章 课程形式和注意事项 82 | 【1】底座基础 第2章 开盲盒调研成品级别运维平台 83 | 【1】底座基础 第3章 从后台管理模板来调研运维平台 84 | 【1】底座基础 第4章 设计用户权限模块并熟悉体验vben 85 | 【1】底座基础 第5章 开发用户权限模块 86 | 【1】底座基础 第6章 菜单管理打通 87 | 【1】底座基础 第7章 用户和角色管理 88 | 89 | 【1】底座基础 第8章 用户管理剩余的逻辑 90 | 【1】底座基础 第9章 新增用户 分配角色 菜单管理串起来 91 | 【1】底座基础 第10章 golang后端软件准备工作 92 | 【1】底座基础 第11章 go准备之gin和日志 93 | 【1】底座基础 第12章 gin的中间件 94 | 【1】底座基础 第13章 gorm和登陆接口联调 95 | 【1】底座基础 第14章 gorm和菜单接口联调 96 | 【1】底座基础 第15章 gorm和用户角色接口联调01 97 | 【1】底座基础 第16章 gorm和用户角色接口联调02 98 | 【1】底座基础 第17章 rbac权限模型casbin和gorm 99 | 【1】底座基础 第18章 前端给角色绑定api接口树形结构 100 | 101 | 102 | # 第一部分底座 课程大纲 103 | - 第1章 课程形式和注意事项 104 | - 1.1 课程定位和注意事项 105 | - 1.2 学习所需要的软件 106 | 107 | 108 | - 第2章 开盲盒调研成品级别运维平台 109 | - 2.1 调研用户角色多对多模型 110 | - 2.2 调研数据权限 111 | - 2.3 开盲盒 调研cicd部署过程 112 | - 2.4 开盲盒 用户权限前后端 113 | - 2.5 开盲盒 cicd可视化 114 | 115 | 116 | - 第3章 从后台管理模板来调研运维平台 117 | - 3.1 搜索关键字 vue 后台管理系统 118 | - 3.2 vue3的后台管理系统 119 | - 3.3 全面的了解一下vben 120 | 121 | 122 | - 第4章 设计用户权限模块并熟悉体验vben 123 | - 4.1 用户权限我们都需要什么 124 | - 4.2 安装vben 125 | - 4.3 熟悉一下vben目录 126 | - 4.4 熟悉一下vben基础配置 127 | - 4.5 熟悉一下vben路由 128 | - 4.6 熟悉一下vben菜单 129 | - 4.7 熟悉一下vben权限 130 | - 4.8 熟悉一下vben的mock 131 | - 4.9 熟悉一下vben的组件 132 | - 4.10 vben用户权限代码查看 133 | 134 | 135 | - 第5章 开发用户权限模块 136 | - 5.1 查看角色路由权限代码 137 | - 5.2 角色切换和权限 138 | - 5.3 规划一下用户角色 139 | - 5.4 角色管理页面只有super可见 140 | - 5.5 设置角色状态和mock 141 | - 5.6 删除角色 142 | - 5.7 分析一下后端权限模式的代码 143 | - 5.8 getPermCode逻辑 144 | - 5.9 菜单编辑所有的字段含义1 145 | - 5.10 菜单编辑所有的字段含义2 146 | 147 | 第6章 go大运维平台开发之菜单管理打通6.5 补全新增菜单的逻辑 148 | 第6章 go大运维平台开发之菜单管理打通 父子关系菜单 149 | 150 | - 第6章 菜单管理打通 151 | - 6.1 新增和编辑共用drawer 152 | - 6.2 表单字段定义和validate校验 153 | - 6.3 新增菜单的请求 154 | - 6.4 树形父子关系菜单最终效果 155 | - 6.5 补全新增菜单的逻辑 156 | - 6.6 菜单渲染和菜单数据一致 157 | - 6.7 解决菜单不断叠加的问题 158 | - 6.8 是否显示和菜单排序 159 | - 6.9 初始化的管理菜单和缺乏编辑-新增如何共享逻辑 160 | - 6.9 初始化的管理菜单 161 | - 6.10 菜单更新和删除 162 | 163 | - 第7章 用户和角色管理 164 | - 7.1 角色管理菜单分配树形选中 165 | - 7.2 角色修改 166 | - 7.3 角色查询 167 | - 7.4 用户管理列表字段对齐 168 | - 7.5 根据条件设置样式 169 | - 7.6 用户信息表单防抖尝试 170 | - 7.7 使用登陆用到的用户信息数据 171 | - 7.8 用户角色列表ApiSelect 172 | - 7.9 角色列表前后端格式转化 173 | - 7.10 用户密码和用户信息编辑 174 | 175 | - 第8章 用户管理剩余的逻辑 176 | - 8.1 新增和修改共用模态框的问题 177 | - 8.2 删除用户和收尾工作 178 | - 8.3 修改当前用户密码 179 | - 8.4 退出登录和token重复问题 180 | - 8.5 跳转登出和默认首页 181 | 182 | 183 | 184 | - 第9章 新增用户 分配角色 菜单管理串起来 185 | - 9.1 划分菜单角色权限 186 | - 9.2 根据用户信息获取菜单列表 187 | - 9.3 给角色分配菜单的时候获取全量菜单列表 188 | - 9.4 新增角色登陆dbAcc列表不全的问题 189 | - 9.5 在mock中使用persistent存储失败 190 | - 9.6 验证低权限的用户登陆菜单并由admin修改 191 | - 9.7 发现部分子菜单显示不正常问题 192 | - 9.8 解决子菜单重复和父级不显示问题 193 | - 9.9 解决用户多角色菜单继承问题 194 | - 9.10 最后的验证和代码提交 195 | 196 | - 第10章 golang后端软件准备工作 197 | - 10.1 后端技术选型和gin各个中间件 198 | - 10.2 必备软件的列表 199 | - 10.3 搭建ubuntu22.04模板机 200 | - 10.4 搭建k8s1.27最新版本集群 201 | - 10.5 部署mysql到k8s中 202 | - 10.6 部署redis到k8s中并做重启数据消失验证 203 | - 10.7 安装golang 204 | 205 | - 第11章 go准备之gin和日志 206 | - 11.1 规划目录结构 207 | - 11.2 开始gin的准备工作 208 | - 11.3 命令行传参和配置文件解析 209 | - 11.4 把gin单独启动 210 | - 11.5 json日志格式和控制台输出 211 | - 11.6 日志输出到文件和rotate 212 | 213 | - 第12章 gin的中间件 214 | - 12.1 传递变量和打印耗时的gin中间件 215 | - 12.2 request-id日志和zap整合 216 | - 12.3 Prometheus记录qps 217 | - 12.4 认识jwt中间件 218 | - 12.5 定义通用响应结构体 219 | - 12.6 validator校验字段 220 | - 12.7 中文字典错误翻译器 221 | - 12.8 用户登陆生成jwt逻辑 222 | - 12.9 验证用户登陆生成jwt 223 | - 12.10 jwt临期刷新问题 224 | 225 | - 第13章 gorm和登陆接口联调 226 | - 13.1 熟悉gorm 227 | - 13.2 schema和automigrate 228 | - 13.3 user和role多对多关系 229 | - 13.4 加盐hash生成密码 230 | - 13.5 登陆接口和关联preload 231 | - 13.6 getUserInfo接口 232 | - 13.7 菜单数据结构尝试联调 233 | - 13.8 前后端接口联调问题 234 | - 13.9 login和getUserInfo 235 | - 13.10 实现getMenulist接口 236 | 237 | - 第14章 gorm和菜单接口联调 238 | - 14.1 menus多对多创建问题 239 | - 14.2 gorm预加载a引用b引用c 240 | - 14.3 根据用户获取菜单getMenulist接口 241 | - 14.4 菜单编辑接口对接 242 | - 14.5 新增菜单接口对接 243 | - 14.6 获取全量菜单接口 244 | 245 | 【1】底座基础 第15章 gorm和用户角色接口联调01 246 | 【1】底座基础 第16章 gorm和用户角色接口联调02 247 | 【1】底座基础 第17章 rbac权限模型casbin和gorm 248 | 【1】底座基础 第18章 前端给角色绑定api接口树形结构 249 | 250 | - 第15章 gorm和用户角色接口联调01 251 | - 15.1 用户操作时的获取全量角色接口对接 252 | - 15.2 log中间件不打印body问题 253 | - 15.3 新增用户接口对接 254 | - 15.4 获取用户列表 255 | - 15.5 编辑用户资料 256 | - 15.6 用户角色ApiSelect问题 257 | - 15.7 删除用户和更新用户 258 | - 15.8 获取角色列表 259 | - 15.9 树形结构treeDataSimpleMode 260 | - 15.10 使用原生的TreeSelect 261 | 262 | - 第16章 gorm和用户角色接口联调02 263 | - 16.1 更新角色 264 | - 16.2 新增角色 265 | - 16.3 删除角色 266 | - 16.4 菜单管理的上级菜单问题 267 | - 16.5 菜单管理的上级菜单问题 268 | - 16.6 setRoleStatus接口-局部更新 269 | - 16.7 角色状态和菜单 新增用户密码 270 | - 16.8 修改密码 271 | - 16.9 在角色table中展示关联的用户 272 | 273 | - 第17章 rbac权限模型casbin和gorm 274 | - 17.1 casbin基础知识 275 | - 17.2 casbin和gorm 276 | - 17.3 KeyMatch自定义模糊匹配 277 | - 17.4 casbin和gin整合梳理准备工作 278 | - 17.5 后端代码定义表结构mock数据 279 | - 17.6 gin和casbin整合 280 | - 17.7 进行测试 281 | - 17.8 前端api管理列表 282 | - 17.9 前端api新增编辑删除 283 | 284 | - 第18章 前端给角色绑定api接口树形结构 285 | - 18.1 尝试用原生的drawer 286 | - 18.2 复用编辑角色drawer增加apis的树 -------------------------------------------------------------------------------- /pic/大纲pic/7模块-任务执行grpc大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 大运维平台5大模块 6 | - 01 资产管理 & cmdb & 服务树 7 | - 02 工单 & 工作流 & 审批 8 | - 03 cicd 全流程配置 9 | - 04 Prometheus管理配置 10 | - 05 k8s多集群管理 11 | 12 | ## 00 为什么是这5个模块 13 | - k8s/prometheus/cicd作为当下3大运维开发主流方向,这点大家都知道 14 | - 但是如果只做上面3个模块还少了些基础的模块 15 | - 这里的基础模块说的就是 cmdb和工单 16 | - cmdb很好理解: 17 | - 监控/cicd/k8s等内部很多资源都属于资源 18 | - 资源就需要有管理的地方 19 | - 同时资产和服务的绑定形式应该是一颗服务树 20 | - 在服务树的节点上可以配置权限和绑定其他模块资源 21 | - 比如给 data.system.dns 绑定cicd发布模板可以发布dns配置 22 | - 比如给 infra.sre.apolloy绑定监控告警配置项 23 | - 那么为什么还需要工单呢,主要原因有下面2点 24 | - 01 因为我们很多的操作需要工单审批之后才做 25 | - 比如 在页面上通过yaml编辑器编辑 k8s的deployment 会触发变更 26 | - 此时应该触发生成一张工单:经过预设的审批人审批后 再执行 27 | - 02 还有一些我们通用的运维工作需要工单支持 28 | - 比如调整安全组 29 | - 比如申请consul 服务发现token 30 | 31 | ## 树层级 总结服务树前端功能 32 | - 每个树层级操作 33 | 34 | - 展开和折叠: 35 | - 默认只展开第一层 36 | - 每次点击下一层的展开按钮再展开 :infra.k8s.prod-01.node.k8s-node-prod-01 37 | - 这个树节点内容:获取这个节点的机器列表 38 | 39 | - 加载方式 40 | - 懒加载 异步 D:\nyy_work\fe-work\a-ben-yuan\src\views\demo\tree\index.vue 41 | - 数据不是一次请求完成 42 | - 而且根据父级再去查询子集 43 | - 数据操作 :右键菜单 beforeRightClick 44 | - 在父层级添加子集 45 | - 删除 46 | - 工具栏使用 toolbar 47 | - 函数操作按钮 D:\nyy_work\fe-work\a-ben-yuan\src\views\demo\tree\ActionTree.vue 48 | - isLeaf 叶子节点:不能再有孩子了 49 | - showLine 节点连线 50 | 51 | ## 服务树 52 | - 服务树节点操作 53 | - 增加:右键添加 54 | - 父层级添加子层级 55 | - 节点属性: 56 | - 名称 name 57 | - 是否是子节点 isLeaf 58 | - 第几层级: 0,1,2,3 59 | - 父节点id: parentId 60 | - 图标: icon :选择列表,而不是五花八门的 61 | - 删除:右键删除 62 | - 是否级联删除 63 | - 删除保护:如果子节点还有,那么不让删除父节点 64 | - 更新:根据id操作 65 | - 名称是可以更新的 66 | - 挪动节点? 是否要做 :也可以通过先删除后添加 67 | - 树展示:查询 68 | - 一层一层的加载:默认全部展开是没有意义的 69 | - 数据是否异步: 70 | - 服务树特别庞大:全部数据前端渲染比较卡 71 | - 根据父层级查子层级:向下一层查询 72 | - 根据父层级展开所有层级: 73 | - 不太想拼接 id形式 0-1-3-4 74 | 75 | 【4】grpc任务执行 第1章 任务执行中心和agent基本运维经验 76 | 【4】grpc任务执行 第2章 grpc-server和client代码 77 | 【4】grpc任务执行 第3章 agent信息采集上报 78 | 【4】grpc任务执行 第4章 设计任务执行中心和agent本地执行 79 | 【4】grpc任务执行 第5章 agent-linux测试 80 | 【4】grpc任务执行 第6章 agent多task本地manager 81 | 【4】grpc任务执行 第7章 server端任务几张数据表和调度逻辑 82 | 【4】grpc任务执行 第8章 任务执行错误策略-任务暂停-任务并发 83 | 【4】grpc任务执行 第9章 任务执行的前端页面 84 | 【4】grpc任务执行 第10章 发现重大bug 85 | 【4】grpc任务执行 第11章 任务执行的脚本管理和任务模板 86 | 【4】grpc任务执行 第12章 新增任务的模板中的机器选择 87 | 【4】grpc任务执行 第13章 任务动作逻辑 88 | 【4】grpc任务执行 第14章 单机任务结果查询 89 | 【4】grpc任务执行 第15章 收尾 90 | 91 | 92 | # grpc-agent和任务执行中心大纲 93 | - 第1章 任务执行中心和agent基本运维经验 94 | - 1.1 任务执行和agent 95 | - 1.2 调研任务执行中心平台 96 | - 1.3 grpc的基础知识 97 | - 1.4 准备环境安装依赖包 98 | - 1.5 gen-go和gen-grpc插件 99 | - 1.6 学习grpc-go样例 100 | - 1.7 从proto文件生成go和grpc代码 101 | - 1.8 json-rpc的好处和grpc-gorm共享结构问题 102 | - 1.9 准备pb目录和pb文件了 103 | 104 | - 第2章 grpc-server和client代码 105 | - 2.1 agent基础代码 106 | - 2.2 agent日志添加主机名和ip地址的标识 107 | - 2.3 grpc 连接池调研 108 | - 2.4 使用连接池初始化agent 109 | - 2.5 封装cronManger共享grpcClient 110 | - 2.6 编译测试agent 111 | - 2.7 准备server端的grpc代码 112 | - 2.8 各个manager添加开关 113 | - 2.9 测试grpc-call 114 | 115 | - 第3章 agent信息采集上报 116 | - 3.1 思考核心功能定义上报字段 117 | - 3.2 agent如何采集 118 | - 3.3 agent信息上报字段 119 | - 3.4 grpc-server处理sn逻辑 120 | - 3.5 检查实例是否为新增的 121 | - 3.6 模拟disk触发genHash的增量更新 122 | - 3.7 公有云同步模块排除agent上报记录 123 | 124 | - 第4章 设计任务执行中心和agent本地执行 125 | - 4.1 架构设计 126 | - 4.2 go-exec基础样例 127 | - 4.3 agent本地执行依赖项目 128 | - 4.4 prepare做task执行前准备 129 | - 4.5 exec超时时间ctx的问题 130 | - 4.6 kill进程组实现超时kill 131 | - 4.7 拼接start的外层 132 | - 4.8 wait设置任务状态 133 | - 4.9 任务结果落盘保存 134 | - 4.10 处理用户的参数 135 | 136 | - 第5章 agent-linux测试 137 | - 5.1 准备编译脚本放到linux上执行 138 | - 5.2 解决刚开始就被kill的问题 139 | - 5.3 进行多种情况的测试 140 | - 5.4 bash-c传参问题 141 | - 5.5 长任务不kill和win编译折中方案 142 | - 5.6 非root用户执行测试 143 | - 5.7 测试python脚本能否被kill 144 | - 5.8 任务中支持python 145 | - 5.9 python脚本位置空格问题 146 | - 5.10 无论python还是shell脚本中指定解析器 147 | - 5.11 其他用户尝试python脚本 148 | 149 | - 第6章 agent多task本地manager 150 | - 6.1 准备manager基础结构 151 | - 6.2 定义grpc下发任务和结果的字段 152 | - 6.3 grpc上报结果的请求 153 | - 6.4 本地收集结果的逻辑 154 | - 6.5 grpc结果分配新任务 155 | - 6.6 如何确保下发和上报一定成功 156 | - 6.7 server端任务grpc基础逻辑 157 | - 6.8 server和agent的grpc联调 158 | - 6.9 本地磁盘中是否存在 159 | - 6.10 client中的too_many_pings问题 160 | - 6.11 kill-task的问题 161 | - 6.12 agent挂掉了重启接管存量的任务 162 | 163 | - 第7章 server端任务几张数据表和调度逻辑 164 | - 7.1 思考都需要哪些表 165 | - 7.2 脚本表和任务元信息 166 | - 7.3 任务结果表 167 | - 7.4 mock几个task数据 168 | - 7.5 定义任务元信息本地cache 169 | - 7.6 定时刷新这个map-01 170 | - 7.7 计算task中未调度的机器 171 | - 7.8 grpc下发任务时初始化结果记录 172 | - 7.9 联调测试观察突变 173 | - 7.10 grpc更新任务结果 174 | 175 | - 第8章 任务执行错误策略-任务暂停-任务并发 176 | - 8.1 任务并发的逻辑 177 | - 8.2 任务并发的测试 178 | - 8.3 解决并发下发顺序随机问题 179 | - 8.4 任务暂停和继续 180 | - 8.5 任务执行错误策略 -- 在grpc中 遇到单个机器错误设置? 181 | - 8.6 OnErrorStrategy的逻辑 182 | - 8.7 grpc触发cache-renew 183 | - 8.8 测试任务执行错误 184 | 185 | - 第9章 任务执行的前端页面 186 | - 9.1 后端拆分menu等基础数据并新建脚本管理菜单 187 | - 9.2 脚本模板查询列表 188 | - 9.3 调研脚本shell和python编辑器 189 | - 9.4 安装的问题 190 | - 9.5 再次安装 191 | 192 | - 第10章 发现重大bug 193 | - 10.1 诉说并复现这个起因 194 | - 10.2 全局引入antd组件问题 195 | - 10.3 vben安装外部依赖包 196 | - 10.4 切换语言的高亮 197 | - 10.5 梳理一下代码编辑器的需求 198 | - 10.6 参考样例实现的问题 199 | - 10.7 实现这个编辑器的准备工作 200 | - 10.8 解读样例代码 201 | - 10.9 实现shell和python编辑器 202 | - 10.10 json和yaml 203 | 204 | - 第11章 任务执行的脚本管理和任务模板 205 | - 11.1 脚本管理基础列表 206 | - 11.2 拆分codemirror尝试1 207 | - 11.3 拆分codemirror尝试2 208 | - 11.4 合并code到drawer里面 209 | - 11.5 后端接口实现 210 | - 11.6 任务管理的表格 211 | - 11.7 新增和编辑任务的form 212 | - 11.8 按钮控制表格和form 213 | - 11.9 后端mock表按模块拆分 214 | - 11.10 任务详情展示脚本并添加编辑 215 | 216 | - 第12章 新增任务的模板中的机器选择 217 | - 12.1 选择脚本联动显示code 218 | - 12.2 完成select逻辑 219 | - 12.3 机器选择的逻辑 220 | - 12.4 尝试树节点选择tree 221 | - 12.5 不考虑权限的树节点选择 222 | - 12.6 选择树节点后拉取机器 223 | - 12.7 mock中去给13号节点绑定机器 224 | - 12.8 选择树节点后拉取机器 225 | - 12.9 解决穿梭框的问题并拼接数据 226 | - 12.10 创建任务的后端代码 227 | - 12.11 hostIpRaw的逻辑 228 | 229 | - 第13章 任务动作逻辑 230 | - 13.1 detail菜单和跳转 231 | - 13.2 detail逻辑01 232 | - 13.3 detail逻辑02 233 | - 13.4 时间轴进度追踪 234 | - 13.5 任务的动作按钮和后端逻辑 235 | - 13.6 每次任务动作完成后更新时间轴 236 | - 13.7 任务按钮根据状态变化 237 | 238 | - 第14章 单机任务结果查询 239 | - 14.1 单机任务结果查询列表 240 | - 14.2 根据jobId查询结果 241 | - 14.3 分页支持和为开始机器填充数据 242 | - 14.4 第一轮验证完整的流程:真实机器 下发执行 看结果 243 | - 14.5 修复机器结果表格高度 agent本地目录问题 244 | - 14.6 状态过滤和ip模糊查询 245 | - 14.7 测试kill发现下发问题 246 | - 14.8 添加killing中间状态 247 | - 14.9 stdout和stderr展示 248 | - 14.10 完整的测试添加finished状态管理 249 | - 14.11 模块04-grpc-agent和任务执行中心演示01 250 | - 14.12 结束任务没有更新进度条 251 | 252 | - 第15章 收尾 253 | - 15.1 formDesign引用codemirror包问题 254 | - 15.2 解决多个版本codemirror包问题 255 | - 15.3 留几个作业给你们 256 | 257 | 258 | 259 | "codemirror5": "^5.65.12", 260 | pnpm add codemirror5@npm:codemirror@5.65.12 --ignore-workspace-root-check 261 | 262 | 263 | 264 | 265 | pnpm add codemirror6@npm:codemirror@6.0.1 --ignore-workspace-root-check 266 | 267 | 268 | pnpm add codemirror-editor-vue3 codemirror@5.x @types/codemirror --ignore-workspace-root-check 269 | 270 | pnpm add codemirror6/lang-javascript@npm:codemirror/lang-javascript@6.2.1 --ignore-workspace-root-check 271 | 272 | 273 | @codemirror/lang-javascript": "^6.2.1", 274 | 275 | 276 | 277 | npm install codemirror vue-codemirror --save 278 | 279 | 280 | pnpm add codemirror vue-codemirror \ 281 | @codemirror/lang-html \ 282 | @codemirror/lang-python \ 283 | @codemirror/theme-one-dark \ 284 | @codemirror/lang-javascript \ 285 | @codemirror/language \ 286 | @codemirror/legacy-modes --ignore-workspace-root-check 287 | 288 | 289 | 290 | pnpm add @codemirror/lang-python --ignore-workspace-root-check 291 | 292 | 293 | # 存量 grpc-agent 信息上报:命令执行中心 294 | - 基于服务树和机器可以做 批量任务执行功能 295 | - 权限:在树节点上选择:是运维负责人即可 296 | 297 | # 任务执行中心 298 | 299 | 300 | -------------------------------------------------------------------------------- /prometheus免费课程/service/prometheus_in_k8s.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 30s 3 | scrape_timeout: 10s 4 | evaluation_interval: 30s 5 | external_labels: 6 | cluster: "01" 7 | scrape_configs: 8 | - job_name: kube-etcd 9 | honor_timestamps: true 10 | scrape_interval: 30s 11 | scrape_timeout: 10s 12 | metrics_path: /metrics 13 | scheme: https 14 | authorization: 15 | type: Bearer 16 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 17 | tls_config: 18 | ca_file: /etc/prometheus/secrets/etcd-certs/ca.crt 19 | cert_file: /etc/prometheus/secrets/etcd-certs/healthcheck-client.crt 20 | key_file: /etc/prometheus/secrets/etcd-certs/healthcheck-client.key 21 | insecure_skip_verify: true 22 | follow_redirects: true 23 | relabel_configs: 24 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] 25 | separator: ; 26 | regex: kube-system;kube-etcd 27 | replacement: $1 28 | action: keep 29 | kubernetes_sd_configs: 30 | - role: endpoints 31 | follow_redirects: true 32 | - job_name: kube-scheduler 33 | honor_timestamps: true 34 | scrape_interval: 30s 35 | scrape_timeout: 10s 36 | metrics_path: /metrics 37 | scheme: https 38 | authorization: 39 | type: Bearer 40 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 41 | tls_config: 42 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 43 | insecure_skip_verify: true 44 | follow_redirects: true 45 | relabel_configs: 46 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] 47 | separator: ; 48 | regex: kube-system;kube-scheduler 49 | replacement: $1 50 | action: keep 51 | kubernetes_sd_configs: 52 | - role: endpoints 53 | follow_redirects: true 54 | - job_name: kube-controller-manager 55 | honor_timestamps: true 56 | scrape_interval: 30s 57 | scrape_timeout: 10s 58 | metrics_path: /metrics 59 | scheme: https 60 | authorization: 61 | type: Bearer 62 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 63 | tls_config: 64 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 65 | insecure_skip_verify: true 66 | follow_redirects: true 67 | relabel_configs: 68 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name] 69 | separator: ; 70 | regex: kube-system;kube-controller-manager 71 | replacement: $1 72 | action: keep 73 | kubernetes_sd_configs: 74 | - role: endpoints 75 | follow_redirects: true 76 | - job_name: kubernetes-apiservers 77 | honor_timestamps: true 78 | scrape_interval: 30s 79 | scrape_timeout: 10s 80 | metrics_path: /metrics 81 | scheme: https 82 | authorization: 83 | type: Bearer 84 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 85 | tls_config: 86 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 87 | insecure_skip_verify: false 88 | follow_redirects: true 89 | relabel_configs: 90 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] 91 | separator: ; 92 | regex: default;kubernetes;https 93 | replacement: $1 94 | action: keep 95 | kubernetes_sd_configs: 96 | - role: endpoints 97 | follow_redirects: true 98 | - job_name: kube-state-metrics 99 | honor_timestamps: true 100 | scrape_interval: 30s 101 | scrape_timeout: 10s 102 | metrics_path: /metrics 103 | scheme: http 104 | follow_redirects: true 105 | static_configs: 106 | - targets: 107 | - kube-state-metrics:8080 108 | - job_name: kubernetes-nodes-kubelet 109 | honor_timestamps: true 110 | scrape_interval: 30s 111 | scrape_timeout: 10s 112 | metrics_path: /metrics 113 | scheme: https 114 | authorization: 115 | type: Bearer 116 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 117 | tls_config: 118 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 119 | insecure_skip_verify: true 120 | follow_redirects: true 121 | relabel_configs: 122 | - separator: ; 123 | regex: __meta_kubernetes_node_label_(.+) 124 | replacement: $1 125 | action: labelmap 126 | kubernetes_sd_configs: 127 | - role: node 128 | follow_redirects: true 129 | - job_name: kubernetes-nodes-cadvisor 130 | honor_timestamps: true 131 | scrape_interval: 30s 132 | scrape_timeout: 10s 133 | metrics_path: /metrics 134 | scheme: https 135 | authorization: 136 | type: Bearer 137 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 138 | tls_config: 139 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 140 | insecure_skip_verify: true 141 | follow_redirects: true 142 | relabel_configs: 143 | - separator: ; 144 | regex: __meta_kubernetes_node_label_(.+) 145 | replacement: $1 146 | action: labelmap 147 | - separator: ; 148 | regex: (.*) 149 | target_label: __metrics_path__ 150 | replacement: /metrics/cadvisor 151 | action: replace 152 | kubernetes_sd_configs: 153 | - role: node 154 | follow_redirects: true 155 | - job_name: kubernetes-pods 156 | honor_timestamps: true 157 | scrape_interval: 30s 158 | scrape_timeout: 10s 159 | metrics_path: /metrics 160 | scheme: https 161 | authorization: 162 | type: Bearer 163 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 164 | tls_config: 165 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 166 | insecure_skip_verify: true 167 | follow_redirects: true 168 | relabel_configs: 169 | - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] 170 | separator: ; 171 | regex: "true" 172 | replacement: $1 173 | action: keep 174 | - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] 175 | separator: ; 176 | regex: (.+) 177 | target_label: __metrics_path__ 178 | replacement: $1 179 | action: replace 180 | - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] 181 | separator: ; 182 | regex: ([^:]+)(?::\d+)?;(\d+) 183 | target_label: __address__ 184 | replacement: $1:$2 185 | action: replace 186 | - separator: ; 187 | regex: __meta_kubernetes_pod_label_(.+) 188 | replacement: $1 189 | action: labelmap 190 | - source_labels: [__meta_kubernetes_namespace] 191 | separator: ; 192 | regex: (.*) 193 | target_label: kubernetes_namespace 194 | replacement: $1 195 | action: replace 196 | - source_labels: [__meta_kubernetes_pod_name] 197 | separator: ; 198 | regex: (.*) 199 | target_label: kubernetes_pod_name 200 | replacement: $1 201 | action: replace 202 | kubernetes_sd_configs: 203 | - role: pod 204 | follow_redirects: true 205 | - job_name: kubernetes-service-endpoints 206 | honor_timestamps: true 207 | scrape_interval: 30s 208 | scrape_timeout: 10s 209 | metrics_path: /metrics 210 | scheme: http 211 | follow_redirects: true 212 | relabel_configs: 213 | - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] 214 | separator: ; 215 | regex: "true" 216 | replacement: $1 217 | action: keep 218 | - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] 219 | separator: ; 220 | regex: (https?) 221 | target_label: __scheme__ 222 | replacement: $1 223 | action: replace 224 | - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] 225 | separator: ; 226 | regex: (.+) 227 | target_label: __metrics_path__ 228 | replacement: $1 229 | action: replace 230 | - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] 231 | separator: ; 232 | regex: ([^:]+)(?::\d+)?;(\d+) 233 | target_label: __address__ 234 | replacement: $1:$2 235 | action: replace 236 | - separator: ; 237 | regex: __meta_kubernetes_service_label_(.+) 238 | replacement: $1 239 | action: labelmap 240 | - source_labels: [__meta_kubernetes_namespace] 241 | separator: ; 242 | regex: (.*) 243 | target_label: kubernetes_namespace 244 | replacement: $1 245 | action: replace 246 | - source_labels: [__meta_kubernetes_service_name] 247 | separator: ; 248 | regex: (.*) 249 | target_label: kubernetes_name 250 | replacement: $1 251 | action: replace 252 | - source_labels: [__address__] 253 | separator: ; 254 | regex: (.+):(.+) 255 | target_label: instance 256 | replacement: $1 257 | action: replace 258 | kubernetes_sd_configs: 259 | - role: endpoints 260 | follow_redirects: true -------------------------------------------------------------------------------- /pic/大纲pic/prometheus源码大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 学习本课程的收益和目标 4 | 5 | - 第1章 收益分析:学习优秀的go项目进大厂 or 实战调优进大厂 : 40 min 6 | - 1.1 为什么学透prometheus可以进大厂 7 | - 监控系统在基础架构中的重要位置,如何为其他系统提供决策数据 8 | - 互联网有大厂专门的监控开发团队,2-10人 9 | - 为何大厂监控开发招聘要求熟悉prometheus 10 | - 大厂搞不定的prometheus问题有哪些 11 | - prometheus作为CNCF顶级项目,是学习go语言的标杆 12 | - 1.2 运维和运维开发同学在prometheus上的学习重点 13 | - 运维同学学习一线大厂监控调优实战,升职加薪 14 | - 运维开发同学深入了解prometheus源码,力争进入大厂监控开发岗位 15 | - 1.3 为什么本节课的老师最专业 16 | - 多年一线互联公司监控系统架构经验,原字节跳动基础监控核心开发人员 17 | - 对OpenFalcon有深度二次开发经验,滴滴夜莺核心开发人员之一 18 | - 熟读Prometheus源码、贡献多个周边开源项目 19 | - 第2章 学习目标:达到进大厂监控开发岗位的要求 :20 min 20 | - 2.1 目标 21 | - 熟悉prometheus 及其生态圈内的组件架构 22 | - 有prometheus及其生态圈内组件高并发调优方案 23 | - 熟悉prometheus核心源码,借鉴设计模式和优秀代码 24 | - 监控环节上的单点问题和实战高可用解决方案 25 | 26 | 27 | # prometheus基础篇 28 | 29 | - 第3章 安装prometheus和上手使用 :30min 30 | - 3.1 prometheus二进制安装 31 | - 3.2 ui功能讲解之graph页面 32 | - 3.3 ui其他页面讲解 33 | - 3.4 prometheus配置文件和6大模块讲解 34 | - 3.5 static_configs采集配置源码解读 35 | - 3.6 prometheus命令行参数讲解 36 | - 3.7 热更新源码解读 37 | 38 | - 第4章 prometheus 基本概念介绍 :50 min 39 | - 4.1 sample 数据点 40 | - 4.2 Label 标签 41 | - 4.3 Labels 标签组 42 | - 4.2 prometheus四种查询类型 43 | - 4.3 四种标签匹配模式 44 | - 4.6 四种数据类型 45 | - 4.7 时间范围选择器 46 | - 4.8 promql简介 47 | - 第5章 node_exporter安装和使用:30 min 48 | - 5.1编写ansibleplaybook批量安装二进制 49 | - 5.2 黑白名单配置 50 | - 5.3 sdk指标和配置本地采集目录 51 | - 5.4 配置prometheus采集通过http请求参数过滤采集器 52 | - 5.5 node_exporter采集原理简介.md 53 | - 5.6 node_exporter二开新增自定义模块 54 | - 第6章 grafana安装和使用:60 min 55 | - 6.1 rpm安装 和 文件目录讲解 56 | - 6.2 基础功能 57 | - 数据源操作 58 | - dashboard操作 59 | - folder操作 60 | - alerting操作 61 | - 用户和组操作 62 | - 6.3 panel中操作 63 | - 设置单位 64 | - panel改名 65 | - 曲线别名 66 | - 曲线sort 67 | - 曲线复制 68 | - 曲线静默 69 | - panel复制 70 | - 设置告警线 71 | - 6.4 设置表格tables 72 | - 6.5 使用变量查询 73 | - 6.6 使用dashboard商城搜索导入模板 74 | 75 | - 第7章 黑盒探针blackbox_exporter安装和使用 :30min 76 | - 7.1 使用ansible部署 blackbox_exporter 77 | - 7.2 页面访问http探测,模块和探针介绍 78 | - 7.3 多实例采集的说明relabel配置 79 | - 7.4 ssh探测和ping探测使用 80 | - 7.5 grafana上导入模板看图并讲解告警 81 | - 7.6 blackbox框架源码和http探测源码解读 82 | - 7.7 prometheus relabel address替换源码解析 83 | 84 | - 第8章 mysqld_exporter安装和使用 :30min 85 | - 8.1 使用ansible部署mysql_exporter,注入dsn环境变量 86 | - 8.2 grafana上导入模板看图并讲解告警 87 | - 8.3 修改mysqld_exporter源码 ,改造成类似blackbox的探针型,实现一对多探测 88 | 89 | - 第9章 process-exporter安装和使用 :20min 90 | - 9.1 使用ansible部署 process-exporter 91 | - 9.2 grafana 上导入模板看图并讲解告警 92 | - 9.3 查看源码,讲解采集原理,对比和atop的输出 93 | 94 | - 第10章 redis-exporter安装和使用 :20min 95 | - 10.1 使用ansible部署 redis-exporter 96 | - 10.2 grafana上导入模板看图并讲解告警 97 | - 10.3 查看源码,讲解采集原理 98 | 99 | - 第11章 java应用监控jvm实例 :30min 100 | - 11.1 监控kafka和zookeeper的jvm 101 | - 11.2 导入grafana大盘和指标讲解 102 | 103 | - 第12章 pushgateway使用 : 40min 104 | - 12.1 应用场景和部署 105 | - 12.2 使用prometheus-sdk向pushgateway打点 106 | 107 | - 第13章 告警和alertmanager简单使用 :30 min 108 | - 13.1 alertmanager核心功能点介绍和安装部署 109 | - 13.2 编写go程序充当告警触发端和接收端 110 | - 13.3 alertmanager分组功能 111 | - 13.4 告警抑制实例 112 | - 13.5 告警静默 113 | - 13.6 编写go代码接收webhook的告警发送钉钉 114 | 115 | 116 | # 进阶篇 117 | ## k8s监控原理解析 118 | > 分析问题和环境搭建 119 | - 第14章 k8s监控难点分析 : 30 min 120 | - 14.1 为什么说k8s中监控更复杂了 121 | - 14.2 k8s中我们都需要监控哪些组件 122 | 123 | 124 | - 第15章 k8s监控环境搭建,yaml讲解:50 min 125 | - 15.1 使用kubeadm 10分钟部署k8集群 126 | - 15.2 定义一个prometheus数据存储使用的pv 127 | - 15.3 StorageClass和volumeClaimTemplates 128 | - 15.4 prometheus使用的ClusterRole等RBAC对象 129 | - 15.5 创建监控控制平面的service 130 | - 15.6 创建prometheus使用的配置configmap 131 | - 15.7 创建prometheus的statsfulset配置 132 | - 15.8 在k8s部署prometheus statefulset 133 | - 15.9 grafana-deployment-yaml讲解 134 | - 15.10 在k8s部署grafana-deployment并导入k8s大盘 135 | 136 | > 从k8s关注的4大指标入手,分析监控的原理 137 | 138 | - 第16章 k8s容器基础资源指标 采集原理和指标讲解 : 40min 139 | - 16.1 k8s容器基础资源指标采集原理讲解 140 | - 16.2 k8s容器基础资源指标讲解 141 | - 16.3 k8s容器cpu内存告警指标与资源request和limit 142 | 143 | - 第17章 k8s对象资源指标 :40min 144 | - 17.1 ksm关注指标讲解 pod和node状态的统计 145 | - 17.2 ksm源码讲解 146 | 147 | - 第18章 k8s服务组件指标: 40min 148 | - 18.1 k8s服务组件之4大黄金指标讲解 149 | - 18.2 k8s-apiserver监控源码解读 150 | 151 | - 第19章 k8s部署在pod中业务埋点指标:40min 152 | - 19.1 使用k8s的sdk编写一个项目获取pod和node信息 153 | - 19.2 编写dockerfile和k8s yaml 154 | - 19.3 打镜像部署到k8s中,prometheus配置采集并在grafana看图 155 | 156 | > 分析prometheus为k8s做的4大适配工作 157 | 158 | - 第20章 分析pull模型在k8s中的应用,对比push模型 :30 min 159 | - 20.1 分析pull模型在k8s中的应用,对比push模型 160 | 161 | - 第21章 k8s接口鉴权、认证和在监控中的实现 :60min 162 | - 21.1 k8s接口鉴权token认证和prometheus的实现 163 | - 21.2 k8s中etcd的tls双向认证原理解析 164 | 165 | - 第22章 k8s服务发现原理解析: 60min 166 | - 22.1 k8s不同role级别的服务发现 167 | - 22.2 k8s中ksm采集的使用的dns解析 168 | - 22.3 解读k8s服务发现源码 169 | 170 | - 第23章 k8s监控中标签relabel的应用和k8s监控总结: 60min 171 | - 23.1 k8s监控中标签relabel的应用和原理 172 | - 23.2 prometheus为k8s做的4大适配工作 173 | 174 | 175 | 176 | 177 | ## 高可用 高性能采集相关 178 | 179 | - 第24章 主流服务发现类型介绍,监控系统和服务树/CMDB如何打通: 30min 180 | - 24.1 prometheus-exporter管理 181 | - 24.2 prometheus target管理 182 | - 24.3 基于文件的服务发现模式 183 | - 24.4 基于consul服务发现模式 184 | - 24.5 基于http服务发现模式 185 | - 24.6 监控系统在采集侧对接运维平台 186 | 187 | 188 | - 第25章 如何降低采集资源消耗:30min 189 | - 25.1 降低采集资源消耗的收益和无用监控指标的判定依据 190 | - 25.2 采集端高基数的现象和原因 191 | - 25.3 使用relabel中的drop将对应的无用指标丢弃 192 | 193 | - 第26章 分位值作用和原理:30min 194 | - 26.1 分位值summary和histogram对比 195 | - 26.2 histogram线性插值法源码解读 196 | - 26.3 summary源码解读 197 | 198 | - 第27章 采集端高可用实战:60min 199 | - 27.1 采集端单点问题原因和危害,静态分片方案的弊端 200 | - 27.2 动态分片方案和它要解决的问题 201 | - 27.3 一致性哈希算法介绍 202 | - 27.4 一致性哈希算法的golang实现和迁移率测试 203 | - 27.5 go实战项目prome-shard的代码准备工作 204 | - 27.6 consul注册服务、抽象获取target的方法 205 | - 27.7 开启一致性哈希环变更监听处理和consul-watch服务 206 | - 27.8 把target做一致性哈希进行分发 207 | - 27.9 调用go-ansible执行playbook拷贝json文件重载采集器 208 | 209 | - 第28章 go实战项目 动态分片解决pushgateway高可用: 30min 210 | - 28.1 pushgateway单点问题和动态分片方案介绍 211 | - 28.2 go实战项目dynamic-sharding的代码准备工作 212 | - 28.3 一致性哈希和推送数据的redirect流程 213 | - 28.4 编译运行测试效果 214 | 215 | - 第29章 如何使用非侵入式形式如日志接入prometheus: 40min 216 | - 29.1 时序监控和日志监控的对比,分析日志监控的核心诉求 217 | - 29.2 golang实战项目log2metrics架构说明 218 | - 29.3 准备工作,编写配置文件,解析配置,校验正则,设置log 219 | - 29.4 日志任务增量更新管理器和具体的日志job对象 220 | - 29.5 日志消费组和日志正则处理对象AnalysPoint 221 | - 29.6 时序统计的结构体对象和metrics结果打点方法 222 | - 29.7 编译运行,读取日志配置看图 223 | 224 | 225 | ## 存储模块 226 | - 第30章 时序数据库存储模型:30min 227 | - 30.1 时序数据库TSDB的典型特点 228 | - 30.2 不得不谈的lsm:分层结构和lsm数据结构 229 | 230 | - 第31章 facebook-gorilla压缩算法原理 :30min 231 | - 31.1 时序数据压缩的必要和facebook-gorilla压缩算法简介 232 | - 31.2 DOD压缩和相关的prometheus源码解读 233 | - 31.3 XOR压缩和相关的prometheus源码解读 234 | 235 | - 第32章 prometheus自研tsdb底层原理 :30min 236 | - 32.1 prometheus倒排索引源码解析 237 | - 32.2 prometheus倒排索引统计功能 238 | - 32.3 mmap的在io提速上的应用和prometheus的应用 239 | - 32.4 prometheus存储磁盘数据结构和存储参数 240 | - 32.5 compact目的和源码解读 241 | 242 | - 第33章 集群tsdb原理和实战(一): 30min 243 | - 33.1 prometheus本地存储单点问题和remote解决方案 244 | - 33.2 prometheus联邦功能源码解读和它的问题 245 | - 33.3 prometheus 低成本存储multi_remote_read方案说明 246 | - 33.4 为什么remote_read查询series比直接查询要慢很多和源码解读 247 | - 33.5 remote实战项目之设计prometheus数据源的结构 248 | - 33.6 read的代码,查询series方法和QueryEngine的RangeQuery方法 249 | - 33.7 write的代码编写和测试 250 | 251 | - 第34章 m3db原理和实战:30min 252 | - 34.1 uber开源的m3db简介 253 | - 34.2 m3db上手搭建 254 | - 34.3 m3db-oom的内存火焰图和内存分配器加油模型源码解读 255 | - 34.4 m3db调优踩坑问题总结 256 | 257 | - 第35章 thanos项目和组件源码解读 258 | - 35.1 thanos项目介绍和二进制部署 259 | - 35.2 thanos-sidecar源码阅读 260 | - 35.3 thanos-store 源码阅读 261 | - 35.4 thanos-query 源码阅读 262 | - 35.5 thanos-compactor 源码阅读 263 | - 35.6 thanos-rule 源码阅读 264 | 265 | - 第36章 kube-prometheus和prometheus-operator原理和实战 : 30min 266 | - 36.1 kube-prometheus项目讲解和安装部署 267 | - 36.2 内置的k8s采集任务分析 268 | - 36.3 grafana-dashboard看图分析 269 | - 36.4 prometheus告警和预聚合分析 270 | - 36.5 自定义指标接入prometheus-operator 271 | 272 | ## 查询模块 273 | - 第37章 prometheus核心接口源码解析 : 30min 274 | - 37.1 prometheus管理接口源码讲解 275 | - 37.2 prometheus分析接口源码讲解 276 | - 37.3 prometheus5大数据查询接口 277 | 278 | - 第38章 范围查询分阶段原理 : 30min 279 | - 38.1 range_query和querylog源码解读 280 | 281 | - 第39章 prometheus接口开发实战: 30min 282 | - 39.1 用最近1天的内存平均使用率等出业务资源利用率报表 283 | 284 | - 第40章 高基数查询和prometheus预聚合原理和源码解读 : 30min 285 | - 40.1 高基数查询原因总结和判定高基数的依据 286 | - 40.2 预聚合和prometheus-record使用 287 | - 40.3 prometheus预聚合源码解读 288 | 289 | - 第41章 查询提速实战提升查询速度30-100倍: 30min 290 | - 41.1 预聚合提速实战项目之需求分析和架构设计 291 | - 41.2 ansible拷贝日志文件,解析日志并判断重查询 292 | - 41.3 将重查询记录增量更新到consul和redis中 293 | - 41.4 修改confd源码增加静态分片功能 294 | - 41.5 nginx拦截prometheus查询请求使用lua脚本做promql的检查替换 295 | - 41.6 安装部署,效果测试,架构回顾 296 | 297 | ## 告警模块 298 | - 第42章 告警触发prometheus源码解读和 告警触发模块高可用方案 :40min 299 | - 42.1 从一条告警的触发分析prometheus alert告警源码 300 | - 42.2 告警触发trigger模块单点问题和高可用解决方案 301 | 302 | - 第43章 alertmanager源码解读和实战: 40min 303 | - 43.1 配置alertmanager高可用并测试 304 | - 43.2 gossip协议解读 305 | - 43.3 alertmanager流水线处理源码解读 306 | - 第44章 告警回调实战: 40min 307 | - 44.1 告警自愈之回调重启服务实战 308 | 309 | # 课程卖点 310 | ## 1. 课程中go开发实战项目 311 | - 5.6 node_exporter二开新增自定义模块 312 | - 8.3 修改mysqld_exporter源码 ,改造成类似blackbox的探针型,实现一对多探测 313 | - 13.2 编写go程序充当告警触发端和接收端 314 | - 13.6 编写go代码接收webhook的告警发送钉钉 315 | - 19.1 使用k8s的sdk编写一个项目获取pod和node信息,打镜像部署到k8s中,prometheus配置采集并在grafana看图 316 | - 27.1 go实战项目prome-shard动态分片实现采集端高可用 317 | - 28.1 go实战项目dynamic-sharding 实现pushgateway高可用 318 | - 29.1 log2metrics使用非侵入式形式如日志接入prometheus 319 | - 33.5 prom-remote项目remote读写prometheus存储 320 | - 41.1 pre_query查询提速实战提升查询速度30-100倍 321 | 322 | ## 2. 全组件源码解读 323 | ## 3. k8s监控原理解析 324 | -------------------------------------------------------------------------------- /prometheus免费课程/03_时序监控集群存储m3db.md: -------------------------------------------------------------------------------- 1 | # prometheus本地存储问题 2 | - 参考文档 https://prometheus.io/docs/prometheus/latest/storage/ 3 | > Prometheus的本地存储仅限于单个节点的可伸缩性和持久性。Prometheus并没有尝试解决Prometheus本身中的集群存储,而是提供了一组允许与远程存储系统集成的接口。 4 | 5 | # 集成方法 6 | ![image](../pic/prome_remote01.png) 7 | > Prometheus通过以下三种方式与远程存储系统集成: 8 | 9 | - Prometheus可以将其提取的样本以标准格式写入远程URL。 10 | - Prometheus可以以标准格式从其他Prometheus服务器接收样本。 11 | - Prometheus可以以标准化格式从远程URL读取(返回)样本数据。 12 | 13 | > 读取和写入协议都使用基于HTTP的快速压缩协议缓冲区编码 14 | - 该协议尚未被认为是稳定的API,当可以安全地假定Prometheus和远程存储之间的所有跃点都支持HTTP / 2时,该协议将来可能会更改为在HTTP / 2上使用gRPC。 15 | 16 | 17 | # m3db 18 | ## 为什么选它 19 | - 开源免费 20 | - 集群版 21 | 22 | ## 单机版安装教程 23 | > 过程 24 | - 依赖文件 `m3dbnode` `m3dbnode.service` `m3dbnode_single.yaml` 25 | - 执行 `m3db_single_install.sh` 26 | 27 | > 注意事项 28 | - 单机版内嵌了etcd进程,如果测试机上有etcd的需要注意下端口冲突 29 | - `m3dbnode`可以选择是否开启内嵌的`m3coordinator` 30 | 31 | > 配置文件解读 32 | ```yaml 33 | 34 | 35 | # 是否开启内嵌的 M3Coordinator 36 | coordinator: 37 | # Address for M3Coordinator to listen for traffic. 38 | listenAddress: 0.0.0.0:7201 39 | # 所有m3db namespace(理解为表)都必须列在这里, 40 | # 如果少了则读写丢数据 41 | # All configured M3DB namespaces must be listed in this config if running an 42 | # embedded M3Coordinator instance. 43 | local: 44 | namespaces: 45 | - namespace: default 46 | type: unaggregated 47 | retention: 48h 48 | 49 | # M3Coordinator 日志 50 | logging: 51 | level: info 52 | 53 | # M3Coordinator metric 54 | metrics: 55 | scope: 56 | # Prefix to apply to all metrics. 57 | prefix: "coordinator" 58 | prometheus: 59 | # Path and address to expose Prometheus scrape endpoint. 60 | handlerPath: /metrics 61 | listenAddress: 0.0.0.0:7203 # until https://github.com/m3db/m3/issues/682 is resolved 62 | sanitization: prometheus 63 | # Sampling rate for metrics, use 1.0 for no sampling. 64 | samplingRate: 1.0 65 | extended: none 66 | 67 | tagOptions: 68 | # Configuration setting for generating metric IDs from tags. 69 | idScheme: quoted 70 | 71 | db: 72 | # Minimum log level which will be emitted. 73 | logging: 74 | level: info 75 | 76 | # Configuration for emitting M3DB metrics. 77 | metrics: 78 | prometheus: 79 | # Path to expose Prometheus scrape endpoint. 80 | handlerPath: /metrics 81 | sanitization: prometheus 82 | # Sampling rate for metrics, use 1.0 for no sampling. 83 | samplingRate: 1.0 84 | extended: detailed 85 | 86 | # 9000 是本实例的 thrift/tchannel接收数据接口 87 | # Address to listen on for local thrift/tchannel APIs. 88 | listenAddress: 0.0.0.0:9000 89 | # 9001 是集群间实例的 thrift/tchannel接收数据接口 90 | # Address to listen on for cluster thrift/tchannel APIs. 91 | clusterListenAddress: 0.0.0.0:9001 92 | # 9002 是本实例的json/http接口 (主要用来debug) 93 | # Address to listen on for local json/http APIs (used for debugging primarily). 94 | httpNodeListenAddress: 0.0.0.0:9002 95 | # Address to listen on for cluster json/http APIs (used for debugging primarily). 96 | httpClusterListenAddress: 0.0.0.0:9003 97 | # Address to listen on for debug APIs (pprof, etc). 98 | debugListenAddress: 0.0.0.0:9004 99 | 100 | # Configuration for resolving the instances host ID. 101 | hostID: 102 | # "Config" resolver states that the host ID will be resolved from this file. 103 | resolver: config 104 | value: m3db_local 105 | 106 | client: 107 | # Consistency level for writes. 108 | writeConsistencyLevel: majority 109 | # Consistency level for reads. 110 | readConsistencyLevel: unstrict_majority 111 | # Timeout for writes. 112 | writeTimeout: 10s 113 | # Timeout for reads. 114 | fetchTimeout: 15s 115 | # Timeout for establishing a connection to the cluster. 116 | connectTimeout: 20s 117 | # Configuration for retrying writes. 118 | writeRetry: 119 | initialBackoff: 500ms 120 | backoffFactor: 3 121 | maxRetries: 2 122 | jitter: true 123 | # Configuration for retrying reads. 124 | fetchRetry: 125 | initialBackoff: 500ms 126 | backoffFactor: 2 127 | maxRetries: 3 128 | jitter: true 129 | # Number of times we background health check for a node can fail before 130 | # considering the node unhealthy. 131 | backgroundHealthCheckFailLimit: 4 132 | backgroundHealthCheckFailThrottleFactor: 0.5 133 | 134 | # Sets GOGC value. 135 | gcPercentage: 100 136 | 137 | # Whether new series should be created asynchronously (recommended value 138 | # of true for high throughput.) 139 | writeNewSeriesAsync: true 140 | writeNewSeriesBackoffDuration: 2ms 141 | 142 | bootstrap: 143 | commitlog: 144 | # Whether tail end of corrupted commit logs cause an error on bootstrap. 145 | returnUnfulfilledForCorruptCommitLogFiles: false 146 | 147 | cache: 148 | # Caching policy for database blocks. 149 | series: 150 | policy: lru 151 | 152 | commitlog: 153 | # Maximum number of bytes that will be buffered before flushing the commitlog. 154 | flushMaxBytes: 524288 155 | # Maximum amount of time data can remain buffered before flushing the commitlog. 156 | flushEvery: 1s 157 | # Configuration for the commitlog queue. High throughput setups may require higher 158 | # values. Higher values will use more memory. 159 | queue: 160 | calculationType: fixed 161 | size: 2097152 162 | 163 | filesystem: 164 | # Directory to store M3DB data in. 165 | filePathPrefix: /opt/app/m3db/data 166 | # Various fixed-sized buffers used for M3DB I/O. 167 | writeBufferSize: 65536 168 | dataReadBufferSize: 65536 169 | infoReadBufferSize: 128 170 | seekReadBufferSize: 4096 171 | # Maximum Mib/s that can be written to disk by background operations like flushing 172 | # and snapshotting to prevent them from interfering with the commitlog. Increasing 173 | # this value can make node adds significantly faster if the underlyign disk can 174 | # support the throughput. 175 | throughputLimitMbps: 1000.0 176 | throughputCheckEvery: 128 177 | 178 | # This feature is currently not working, do not enable. 179 | repair: 180 | enabled: false 181 | throttle: 2m 182 | checkInterval: 1m 183 | 184 | # etcd configuration. 185 | discovery: 186 | config: 187 | service: 188 | # KV environment, zone, and service from which to write/read KV data (placement 189 | # and configuration). Leave these as the default values unless you know what 190 | # you're doing. 191 | env: default_env 192 | zone: embedded 193 | service: m3db 194 | # Directory to store cached etcd data in. 195 | cacheDir: /opt/app/m3db/m3kv 196 | # Configuration to identify the etcd hosts this node should connect to. 197 | etcdClusters: 198 | - zone: embedded 199 | endpoints: 200 | - 127.0.0.1:2379 201 | # Should only be present if running an M3DB cluster with embedded etcd. 202 | seedNodes: 203 | initialCluster: 204 | - hostID: m3db_local 205 | endpoint: http://127.0.0.1:2380 206 | 207 | 208 | ``` 209 | 210 | 211 | ## 集群版安装教程 212 | > 过程 213 | - https://m3db.io/docs/cluster/binaries_cluster/ 214 | 215 | ## 和prometheus整合 216 | ```shell script 217 | # 在prometheus.yml 添加remote_read/write 段即可 218 | remote_write: 219 | - url: "http://192.168.0.110:7201/api/v1/prom/remote/write" 220 | remote_read: 221 | - url: "http://192.168.0.107:7201/api/v1/prom/remote/read" 222 | read_recent: true 223 | 224 | # 在m3dnode上抓包查看 225 | tcpdump -i any tcp dst port 9000 -nn -vv -p -A 226 | 227 | 228 | ``` 229 | 230 | ## 找一个prometheus只做 query ,remote_read m3coor 231 | ```shell script 232 | remote_read: 233 | - url: "http://192.168.0.107:7201/api/v1/prom/remote/read" 234 | read_recent: true 235 | ``` 236 | 237 | # m3db问题总结 238 | ## oom 239 | 240 | 241 | - 可以参考我写的文章:https://zhuanlan.zhihu.com/p/183815841 242 | 243 | ### oom时排查 244 | - 内存火焰图: 80G内存 245 | ![image.png](../pic/mo01.png) 246 | - bytes_pool_get_on_empty qps 很高 247 | ![image.png](../pic/mo02.png) 248 | - db read qps增长 80% 249 | ![image.png](../pic/mo03.png) 250 | - node cpu kernel 暴涨 251 | ![image.png](../pic/mo04.png) 252 | 253 | **看图结论** 254 | - m3dbnode 内存oom过程很短,很剧烈:总时间不超过7分钟 255 | - 内存从27G增长到250G 256 | - 节点sys态cpu暴涨:因为大量的mem_alloca sys_call 257 | - 内存增长曲线和db_read_qps曲线和bytes_pool_get_on_empty曲线高度吻合 258 | - 内存火焰图: 27G的rpc 40G的pool.(*objectPool).tryFill 259 | 260 | ### 临时解决办法:限制query资源消耗保护db 261 | - 首先要明确的几点,因为remote_read是链式的调用 262 | - 所以限制m3db前面的组件`prometheus` `m3coordinator`是**没用的** 263 | - 只能限制m3db中关于query的参数,但是这个方法不根治 264 | ![image.png](../pic/mo05.png) 265 | ### 上面的方法治标不治本,重要的是解决高基数/重查询的问题 266 | 267 | ## 其他问题 268 | - 可以参考我写的文章:https://zhuanlan.zhihu.com/p/359551116 269 | 270 | ### 正常情况下m3db 对io要求不高 271 | - 因为和prometheus一样设计时采用了`mmap`等技术,所以没必要采用ssd 272 | - 和open-falcon/夜莺等采用rrd不同,rrd 单指标单文件,很耗io 273 | 274 | ### cpu和内存开销 275 | - 写峰很危险,原因很简单 276 | - 一条新的数据写入的时候,需要申请block,索引等一系列内存,伴随着cpu开销 277 | - 但是如果没有新的数据,只是不断的写入点,那么只涉及到点的append追加,则开销较小 278 | - 所以在突发的写峰对于tsdb来说就是危险,比如auto_scaling 279 | - 最理想的情况就是100w条数据,都是平稳的没有变化的持续追加点写入 280 | - 但是在容器中不现实,因为每次pod滚动都涉及 id等唯一值的变化 281 | 282 | - 读峰也很危险,原因如下 283 | - m3db默认内置lru会缓存查询的block等,这个为了一个典型的场景 284 | - 就是一个dashboard查出来后点刷新时间,除了时间其他查询tag没变化,这种lru能应付的很好 285 | - 但是对于高基数的查询来说,lru的意义就不大了 286 | - 而且会涉及到读取放大的问题,假设1w基数需要100M内存,则100w基数需要10G内存 287 | 288 | ### m3db bootstrap速度问题 289 | - 在节点oom或其他原因导致的重启中,bootstrap速度决定了节点多久能提供服务 290 | - bootstrap速度和`namespace 数量正相关`,和`数据量大小正相关` 291 | - 而且会优先提供写服务,避免长时间不能写入数据造成断点 292 | - 而且再重启时 会有大量读盘操作,基本能把io打满(*因为需要将磁盘中的部分数据缓存到内存中*) 293 | 294 | 295 | ### 不要直接在m3coordinator 中开启聚合 296 | - 我们知道直接在m3coordinator中配置 `type: aggregated`的namespace是可以直接开启聚合的 297 | - 但是[官方文档](https://m3db.io/docs/how_to/aggregator) 说的很清楚了 298 | ```shell script 299 | The M3 Coordinator also performs this role but is not cluster aware. 300 | This means metrics will not get aggregated properly if you send metrics in round robin fashion to multiple M3 Coordinators for the same metrics ingestion source (e.g. Prometheus server). 301 | ``` 302 | - 因为数据按照轮询模式打过来到m3coordinator上,导致同一个指标的不同时刻数据可能出现在多个m3coordinator上,聚合出来的结果就是错的 303 | 304 | -------------------------------------------------------------------------------- /pic/大纲pic/7模块-k8s大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 【模块6】k8s多集群管理平台和cmdb 4 | - 第1章 前置准备工作 5 | - 1.1 准备工作 6 | - 1.2 官方的dashboard控制台安装 7 | - 1.3 解决登陆问题 8 | - 1.4 官方的dashboard控制台使用并总结特点 9 | - 1.5 k8s平台都要做哪些模块 10 | - 1.6 使用client-go操作集群 11 | 12 | - 第2章 多集群操作之准备工作 13 | - 2.1 incluster连接集群源码解读 14 | - 2.2 设计连接集群的表 15 | - 2.3 多集群操作菜单 16 | - 2.4 k8s-icon 17 | - 2.5 mock-cluster数据 18 | - 2.6 构造k8s多集群的cache 19 | - 2.7 如何通过kconfig内容生产client 20 | - 2.8 测试list-node 21 | - 2.9 用快速搭建脚本搭建1.27新集群-1 22 | - 2.10 用快速搭建脚本搭建1.27新集群-2 23 | - 2.11 再搭建一个master 24 | 25 | - 第3章 多集群管理权限限制 26 | - 3.1 准备多个集群的kubeconfigs 27 | - 3.2 遍历读取kc目录 28 | - 3.3 抽象公共超时ctx方法 29 | - 3.4 menu按模块进行分类的思路 30 | - 3.5 按角色分类menu 31 | - 3.6 测试效果 32 | - 3.7 解决id乱序问题 33 | - 3.8 按角色拆分api 34 | - 3.9 k8s集群管理限定集群管理员角色访问 35 | - 3.10 定义k8s集群管理role 36 | 37 | - 第4章 多集群管理前端 38 | - 4.1 k8s管理平台存储方式2种流派 39 | - 4.2 解决子菜单问题 40 | - 4.3 k8s集群列表和接口 41 | - 4.4 运行环境特殊展示 42 | - 4.5 设计表单 43 | - 4.6 创建和更新接口 44 | - 4.7 设计探活方式 45 | - 4.8 给集群添加一些信息字段 46 | - 4.9 进行测试 47 | - 4.10 展示集群最近一次探活结果 48 | 49 | - 第5章 集群节点操作准备 50 | - 5.1 展示集群探活失败原因 51 | - 5.2 查看之前的平台代码中node部分 52 | - 5.3 关于node都需要做什么功能 53 | - 5.4 获取指定集群节点原始列表的接口 54 | - 5.5 节点列表菜单和测试 55 | - 5.6 设计one-node结构体 56 | - 5.7 下载k8s源码 57 | - 5.8 构造节点封装公共kc方法 58 | - 5.9 解决临时文件删除错误的问题 59 | - 5.10 手动给version接口添加超时控制 60 | 61 | - 第6章 模仿k8s源码获取节点基础信息 62 | - 6.1 测试version超时控制 63 | - 6.2 status状态取值 64 | - 6.3 mock-data的时候模拟创建node 65 | - 6.4 终于在k8s源码中找到了get-node源码 66 | - 6.5 仿照k8s源码进行node状态编写 67 | - 6.6 node-role的获取 68 | - 6.7 Age处理并测试 69 | - 6.8 获取节点上的pod方法 70 | - 6.9 标签和污点 71 | 72 | 73 | - 第7章 获取节点上的资源信息 74 | - 7.1 allocatable和capacity 75 | - 7.2 request值如何获取 76 | - 7.3 计算百分比时request很大问题 77 | - 7.4 搜索k8s源码describe node中的资源计算 78 | - 7.5 再次计算百分比 79 | - 7.6 format的时候使用string替换value 80 | - 7.7 安装metrics-server 81 | - 7.8 使用metrics-client-set 82 | - 7.9 获取机器的使用率 83 | - 7.10 format使用率 84 | 85 | 86 | - 第8章 前端展示节点列表 87 | - 8.1 前端集群下拉列表选择器 88 | - 8.2 后端获取集群列表的接口 89 | - 8.3 遇到问题table的beforeFetch获取数据为空 90 | - 8.4 切换下拉集群重载表格 91 | - 8.5 下拉列表进行美化失败 92 | - 8.6 下载dashboard源码学习分页 93 | - 8.7 手动分页后端代码 94 | - 8.8 测试并优化速度 95 | - 8.9 表格字段展示 96 | - 8.10 调度状态Switch展示和开关调度 97 | 98 | - 第9章 集群节点操作之调度标签污点 99 | - 9.1 调度状态切换的公共方法 100 | - 9.2 测试单个按钮和批量操作 101 | - 9.3 按pod数量排序 102 | - 9.4 打标签操作的batch后端接口 103 | - 9.5 前端将labels进行预处理 104 | - 9.6 修复label-nil-map问题 105 | - 9.7 标签tooltip展示 106 | - 9.8 污点配置的yaml解析 107 | - 9.9 污点配置的后端接口 108 | - 9.10 如何在index中导入多个drawer 109 | 110 | - 第10章 集群节点操作之驱逐 111 | - 10.1 污点drawer配置并测试校验 112 | - 10.2 污点配置缩进问题 113 | - 10.3 污点配置后端去重 114 | - 10.4 去掉污点的前后端操作 115 | - 10.5 展示污点 116 | - 10.6 驱逐节点的后端接口 117 | - 10.7 单个操作和batch操作 118 | - 10.8 收尾和TODO 119 | 120 | - 第11章 集群节点详情展示 121 | - 11.1 详情的菜单和跳转 122 | - 11.2 考虑布局和detail接口 123 | - 11.3 通过query去查询节点详情 124 | - 11.4 详情拼接 125 | - 11.5 详情采用desc组件 126 | - 11.6 pod列表表格 127 | - 11.7 convertPod方法 128 | - 11.8 getPodsListByNodeName接口 129 | - 11.9 解决pod表格不显示问题 130 | - 11.10 调整样式和位置 131 | - 11.11 进行美化 132 | - 11.12 节点condition列表 133 | - 11.13 节点event转换方法 134 | - 11.14 节点event列表 135 | - 11.15 list加速和搜索 136 | - 11.16 总结 137 | 138 | 【模块6】k8s多集群管理 第12-16 集群管理员yaml和pod日志 139 | 140 | - 第12章 集群管理员yaml操作 141 | - 12.1 总结集群管理员的操作 142 | - 12.2 调研helm-web 143 | - 12.3 helm 使用client-go操作 144 | - 12.4 设计yaml-apply的web化 145 | - 12.5 设计模板和task表 146 | - 12.6 模板和task的mock 147 | - 12.7 applyTask的变量替换 148 | - 12.8 DynamicClient的使用 149 | - 12.9 apply-yaml的后半段 150 | - 12.10 模板的3个api方法 151 | - 12.11 任务的3个api方法 152 | - 12.12 菜单和前端列表 153 | - 12.13 模板操作的前端 154 | - 12.14 任务操作的表单 155 | - 12.15 完成任务操作功能 156 | - 12.16 修复DynamicClient的bug 157 | - 12.17 进行测试 158 | - 12.18 taskYaml文件下载 159 | 160 | - 第13章 集群管理员pod列表 161 | - 13.1 pod操作预期exec-logtail-websocket 162 | - 13.2 集群和命名空间联动的前端组件 163 | - 13.3 cache中获取集群的ns列表 164 | - 13.4 ns联动后端数据接口 165 | - 13.5 进行测试 166 | - 13.6 pod后端列表接口 167 | - 13.7 处理选择所有namespace的情况 168 | - 13.8 ns切换重新请求pod列表 169 | 170 | - 第14章 集群管理员pod操作 171 | - 14.1 非tail型查看pod日志的样例 172 | - 14.2 route-link跳转传参 173 | - 14.3 获取pod容器列表的接口 174 | - 14.4 查看容器日志的后端方法 175 | - 14.5 选择容器后再查看日志 176 | - 14.6 支持选择日志行数 177 | - 14.7 总结容器日志和14个没声音视频的总结 178 | - 14.8 日志文件下载 179 | 180 | - 第15章 基于websocket的工作 181 | - 15.1 调研vben的websocket 182 | - 15.2 gorilla-websocket使用-1 183 | - 15.3 gorilla-websocket使用-2 184 | - 15.4 编写ws对接logtail日志的demo 185 | - 15.5 ws测试 186 | - 15.6 小结 187 | - 15.7 对比之前写法 188 | 189 | - 第16章 实现logtail效果 190 | - 16.1 先写前端日志跳转和select准备 191 | - 16.2 完成ws的准备 192 | - 16.3 调研实现日志滚动 193 | - 16.4 解决前端容器日志滚动 194 | - 16.5 清屏操作按钮 195 | - 16.6 研究日志换行 196 | - 16.7 模仿k8s源码中换行的处理 197 | - 16.8 podTailLog后端接口 198 | - 16.9 前端对接出现ws初始化问题 199 | - 16.10 固定容器访问tailLog 200 | - TODO 日志换行 ws地址 podLog后端接口 201 | 202 | 203 | 【模块6】k8s多集群管理 第17-21 webshell-dep-Configmap管理 204 | 205 | - 第17章 pod的webshell 206 | - 17.1 进行调研webscoket-xterm 207 | - 17.2 vue3使用xterm之安装 208 | - 17.3 摸索xterm的使用 209 | - 17.4 解决status-地址-ws初始化 210 | - 17.5 xterm和websocket整合 211 | - 17.6 学习k8s源码中exec的操作 212 | - 17.7 后端模拟一个exec服务端 213 | - 17.8 进行联调 214 | - 17.9 调整窗口大小和颜色 215 | - 17.10 实现后端接口 216 | - 17.11 进行测试 217 | - 17.12 解决sh-bash-dash选择的问题 218 | - 17.13 整理排序问题 219 | - 17.14 总结pod的webshell 220 | 221 | 222 | - 第18章 pod-yaml和deployment列表 223 | - 18.1 完成后端接口先转json再转yaml 224 | - 18.2 对接前端 225 | - 18.3 补全apiVersion和kind 226 | - 18.4 去掉managedFields和yaml文件下载 227 | - 18.5 思考后面3个对象的操作 228 | - 18.6 deployment列表 229 | - 18.7 定义convert之后的对象 230 | - 18.8 执行转化动作 231 | - 18.9 完成接口 232 | - 18.10 动作之set-image更新某个容器镜像准备 233 | - 18.11 动作之set-image之前端准备 234 | 235 | - 第19章 deployment动作 236 | - 19.1 动作之set-image-表单 237 | - 19.2 动作之set-image-后端接口 238 | - 19.3 测试多容器的set-image 239 | - 19.4 scale扩缩容的模态框 240 | - 19.5 scale扩缩容的表单 241 | - 19.6 scale扩缩容接口和联调 242 | - 19.7 单个删除 243 | - 19.8 跨namespace批量删除 244 | - 19.9 学习k8s源码中重启的逻辑 245 | - 19.10 完成rollout-restart后端的接口 246 | - 19.11 展示和下载yaml 247 | 248 | - 第20章 configmap管理 249 | - 20.1 了解configmap的基础知识 250 | - 20.2 准备列表和转化方法 251 | - 20.3 编辑内容的li列表 252 | - 20.4 解决for遍历bind-value错误 253 | - 20.5 研究增删key的按钮 254 | - 20.6 单独一个展示内容的按钮 255 | - 20.7 模拟工单中的流程管理动态表格做 256 | - 20.8 完成动态表单 257 | - 20.9 后端更新cm的接口 258 | - 20.10 yaml文件展示和下载 259 | 260 | - 第21章 svc管理 261 | - 21.1 研究antd原生的动态嵌套表单 262 | - 21.2 把嵌套表单改造成vue3的写法 263 | - 21.3 后端接口获取svc列表 264 | - 21.4 学习k8s源码中svclist方法 265 | - 21.5 前端对接表格 266 | - 21.6 把原生form嵌入drawer之宽度设置 267 | - 21.7 把原生form嵌入drawer之布局 268 | - 21.8 标签选择器组 269 | - 21.9 namespace配置 270 | - 21.10 编辑模式传参之ports 271 | - 21.11 模拟请求 272 | - 21.12 美化页面 273 | - 21.13 创建和更新何必到一个后端接口里面 274 | - 21.14 编辑时禁止name-ns-type变更 275 | - 21.15 端口name必填 276 | - 21.16 ns的下拉列表 277 | - 21.17 批量删除svc和cm 278 | - 21.18 展示和下载svc的yaml 279 | 280 | 【模块6】k8s多集群管理 第22-25 面向运维平台的项目应用实例设计 281 | - 第22章 面向运维和研发k8s管理平台内容 282 | - 22.1 运维和研发在使用k8s时关心什么 283 | - 22.2 设计的核心对象-应用和实例的关系 284 | - 22.3 项目表设计 285 | - 22.4 应用表设计和mock数据 286 | - 22.5 实例表设计 287 | 288 | - 第23章 app表字段设计 289 | - 23.1 目的是简化用户配置Deployment的过程 290 | - 23.2 dep的核心字段和非必填字段 291 | - 23.3 抽取容器核心字段的单独结构体 292 | - 23.4 容器卷配置 293 | - 23.5 容器和svc端口配置 294 | - 23.6 创建实例并操作Deployment的时机 295 | - 23.7 多集群分配问题 296 | - 23.8 mock-project-app 297 | - 23.9 最深范围创建instance的接口 298 | - 23.10 在实例中处理env继承自app的问题 299 | 300 | - 第24章 instance创建过程中的Deployment和svc生成 301 | - 24.1 覆盖策略command-args 302 | - 24.2 resource处理 303 | - 24.3 多重处理集群级别默认的resource配置 304 | - 24.4 合并处理volume和mounts 305 | - 24.5 测试创建Deployment 306 | - 24.6 解决args和command问题 307 | - 24.7 volumeMounts依赖的数据fullfill 308 | - 24.8 解决kset缓存生成慢导致panic 309 | - 24.9 验证configmap挂载 310 | - 24.10 验证环境变量和标签 311 | 312 | - 第25章 验证Deployment和svc生成 313 | - 25.1 验证resource资源的多级继承和优先覆盖 314 | - 25.2 通过断点排查pod端口不设置的问题 315 | - 25.3 拼接svc的元数据 316 | - 25.4 Deployment创建和更新合并在一起 317 | - 25.5 验证svc的创建结果 318 | - 25.6 权限限制复用服务树节点校验的逻辑 319 | - 25.7 验证instance更新带动Deployment更新 320 | - 25.8 1个app下面多个实例共存为多分支用提供能力 321 | - 25.9 给svc和dep添加标签选择指向app维度 322 | 323 | 【模块6】k8s多集群管理 第26-29 实例重启和Deployment调优配置 324 | - 第26章 实例重启和删除-app维度操作 325 | - 26.1 删除instance级联删除Deployment逻辑 326 | - 26.2 批量重启动作 327 | - 26.3 查询app下属的实例列表返回dep的状态 328 | - 26.4 app创建和更新的基础操作 329 | - 26.5 app更新时需要级联更新Deployment和svc 330 | - 26.6 进行测试发现labels更新有问题 331 | - 26.7 解决dep的标签选择器不可变更的问题 332 | - 26.8 测试svc更新和删除app级联svc 333 | 334 | - 第27章 Deployment调优配置(这里的内容是统一配置,不放开给用户的) 335 | - 27.1 pod的探针设置 336 | - 27.2 进行测试并解决cmd和args首元素为空的问题 337 | - 27.3 反亲和(多副本打散在多节点)代码 338 | - 27.4 解决没打散的问题 339 | - 27.5 内部私有镜像仓库问题 340 | 341 | - 第28章 前端之项目project操作 342 | - 28.1 准备菜单 343 | - 28.2 准备列表 344 | - 28.3 绑定服务树层级过滤 345 | - 28.4 权限校验不在拉取服务树节点时而在创建或更新时校验 346 | - 28.5 验证非super角色的权限问题 347 | - 28.6 修复服务树子节点不显示运维负责人列表的问题 348 | - 28.7 删除接口 349 | - 28.8 从项目名称跳转至应用列表的准备 350 | 351 | 352 | - 第29章 前端之应用application操作 353 | - 29.1 准备菜单和列表-1 354 | - 29.2 准备菜单和列表-2 355 | - 29.3 准备2个项目和4个应用 356 | - 29.4 支持跳转根据项目id查询所属的应用列表 357 | - 29.5 新增和编辑表单的基础字段 358 | - 29.6 准备复杂的表单 359 | - 29.7 从属项目和绑定服务树的下拉列表 360 | - 29.8 填充好非嵌套字段 361 | - 29.9 嵌套字段envs 362 | - 29.10 解决commands字符串数组的问题 363 | 364 | 【模块6】k8s多集群管理 第30-32 最复杂的表单之应用application表单 365 | - 第30章 应用application表单 366 | - 30.1 同理的args和端口设置 367 | - 30.2 复杂的volume挂载配置 368 | - 30.3 编辑直接使用这个表单 369 | - 30.4 解决前端数组类型编辑的问题-后转前 370 | - 30.5 解决后端数组类型编辑的问题-前转后 371 | - 30.6 表单请求的问题 372 | - 30.7 validate校验 373 | - 30.8 解决这个问题 374 | - 30.9 创建的接口 375 | - 30.10 更新的接口 376 | - 30.11 解决dep的探针和svc为空的情况 377 | - 30.12 从创建应用到pod的完整测试 378 | - 30.13 排查app更新的标签错误问题 379 | - 30.14 生成Deployment只走instance不要在app再维护一份 380 | - 30.15 进行测试发现标签更新的问题 381 | - 30.16 解决方法是将选择的标签固定即可 382 | - 30.17 创建后跳转编辑按钮 383 | - 30.18 字段多的时候一键复制已有表单 384 | - 30.19 app删除 385 | 386 | - 第31章 实例instance的表单和操作 387 | - 31.1 菜单和列表 388 | - 31.2 几个和Deployment关联特殊字段 389 | - 31.3 指定appId查询 390 | - 31.4 instance创建和更新的表单 391 | - 31.5 和app一样的stringArray字段处理 392 | - 31.6 新增和更新的接口 393 | - 31.7 解决更新错误的问题 394 | - 31.8 把Deployment和svc的生成拆开一下之svc的创建 395 | - 31.9 把Deployment和svc的生成拆开一下之dep创建 396 | 397 | - 第32章 实例instance的删除-重启-和pod日志 398 | - 32.1 批量删除操作 399 | - 32.2 批量重启操作 400 | - 32.3 规范一下后端生成yaml文件的目录 401 | - 32.4 规范一下日志的目录 402 | - 32.5 能否复用我们之前写好的容器日志 403 | - 32.6 准备根据Deployment获取pod的表格 404 | - 32.7 复用之前exec和log页面 405 | - 32.8 非k8s管理员的exec和log菜单是否可见的问题 406 | - 32.9 api权限的问题 407 | - 32.10 处理casbin=All的鉴权问题 408 | 409 | 【模块6】k8s多集群管理 第33-34 cronjob和收尾 410 | - 第33章 cronjob 411 | - 33.1 修复创建instance的问题 412 | - 33.2 确定instance重名的范围和它的反亲和性配置 413 | - 33.3 思考cronjob的配置项 414 | - 33.4 设置表结构 415 | - 33.5 过滤状态字段和表单字段 416 | - 33.6 生成cronjob的方法 417 | - 33.7 新增和更新的接口 418 | - 33.8 进行测试 419 | - 33.9 cronjob字段优化添加标签 420 | - 33.10 批量删除 421 | - 33.11 获取cj最近调度的pod 422 | - 33.12 查看最近调度pod的日志 423 | - 33.13 解决复制cj创建后报错的问题 424 | - 33.14 项目跳转cronjob查询 425 | - 33.15 给job添加污点和容忍 426 | 427 | - 第34章 总结k8s模块 428 | - 34.1 总结需求 回归功能 429 | 430 | 431 | -------------------------------------------------------------------------------- /prometheus免费课程/01_prometheus适配k8s采集.md: -------------------------------------------------------------------------------- 1 | # k8s架构图 2 | ![image](../pic/k8s.png) 3 | 4 | # 准备工作 5 | ## 使用kubeadm 部署k8集群 6 | - 文档可以参考这个 https://kuboard.cn/install/install-k8s.html 7 | - 出问题可以使用 `kubeadm reset -f` 重置 8 | 9 | 10 | ## 在k8s中部署prometheus 11 | 12 | ```shell script 13 | # 1.修改pv.yaml中的节点选择器标签 k8s-node01改为你自己的节点 14 | # 在节点上创建数据目录 15 | mkdir -pv /data/prometheus 16 | # 2.监控etcd需要创建 secret 17 | kubectl create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=/etc/kubernetes/pki/etcd/ca.crt -n kube-system 18 | 19 | # 3.部署ksm服务 20 | kubectl apply -f prome_k8s_all_pod/kube-stats-metrics 21 | # 4.部署prometheus 22 | kubectl apply -f prome_k8s_all_pod/ 23 | # 5. 访问测试 24 | 访问node节点的8091端口 如 http://192.168.0.110:8091/targets 25 | 出现下面的target页面并且大部分up为正常 26 | ``` 27 | ![image](../pic/p_target.png) 28 | 29 | 30 | ## 在k8s中部署grafana 31 | ```shell script 32 | # 1. 修改yaml中的节点选择器标签 k8s-node01改为你自己的节点 33 | # 在节点上创建数据目录 34 | mkdir -pv /data/grafana 35 | 36 | 37 | # 2. 部署grafana 38 | kubectl apply -f grafana/ 39 | 40 | # 3. 访问测试 访问 node节点的 :30000端口 账户密码 : admin/admin 41 | 如 http://192.168.0.110:30000/?orgId=1 42 | # 4. 添加prometheus数据源,如果prometheus是 hostnetwork的,直接写node的ip:port即可 43 | 44 | ``` 45 | 46 | 47 | 48 | 49 | # k8s关注指标分析 50 | k8s中组件复杂,我们主要专注的无外乎四大块指标:容器基础资源指标、k8s资源指标、k8s服务组件指标、部署在pod中业务埋点指标 51 | 52 | 53 | 指标类型 | 采集源 | 应用举例 |发现类型| grafana截图 54 | | ---- | ---- | ---- | ---- | ---- | 55 | 容器基础资源指标 | kubelet 内置cadvisor metrics接口 | 查看容器cpu、mem利用率等 |k8s_sd node级别直接访问node_ip| ![image](../pic/k8s_node.png) | 56 | k8s资源指标 | [kube-stats-metrics](https://github.com/kubernetes/kube-state-metrics) (简称ksm) | 具体可以看
看pod状态如pod waiting状态的原因
数个数如:查看node pod按namespace分布情况 |通过coredns访问域名| ![image](../pic/k8s_obj.png) | 57 | k8s服务组件指标| 服务组件 metrics接口 | 查看apiserver 、scheduler、etc、coredns请求延迟等 | k8s_sd endpoint级别 | ![image](../pic/k8s_server.png) | 58 | 部署在pod中业务埋点指标| pod 的metrics接口 | 依据业务指标场景 | k8s_sd pod级别,访问pod ip的metricspath | 59 | 60 | 61 | # prometheus为k8s监控做的适配工作 62 | 63 | 那么prometheus有别于其他时序监控系统在设计之初肯定做了很多适配k8s的工作,我总结一下四点:kubernetes的服务发现、各个组件metrics自暴露+pull采集、采集鉴权的支持、标签relabel能力。下面的表格列举了一下他们的特点。下面我们会详细的分析一下相关配置。 64 | 65 | | 适配名字 | 说明 | 举例 | 66 | | ---- | ---- | ---- | 67 | | k8s服务发现 | 通过watch即时发现资源变化 | ` kubernetes_sd_configs:- role: node` | 68 | | 各个组件metrics自暴露 | 所有组件将自身指标暴露在各自的服务端口上,prometheus通过pull过来拉取指标 | apiserver:6443/metrics | 69 | | 鉴权 | k8s的组件接口都是要鉴权的,所以k8s的采集器要支持配置鉴权 | 支持配置token和tls证书 | 70 | | 标签relabel能力 | 过滤服务发现标的 | `labelmap`去掉服务发现标签的长前缀 | 71 | 72 | 73 | # 采集分析 74 | 75 | ## 手动curl访问 76 | ```shell script 77 | TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get serviceaccount prometheus -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode ) 78 | curl https://localhost:6443/metrics --header "Authorization: Bearer $TOKEN" --insecure 79 | 80 | ``` 81 | 82 | ## k8s组件访问鉴权问题 83 | - prometheus通过 sa,clusterrolebinding来解决token、证书挂载问题 84 | > sa等配置: prometheus yaml中需要配置对应的saserviceAccountName 85 | ```yaml 86 | apiVersion: rbac.authorization.k8s.io/v1 # api的version 87 | kind: ClusterRole # 类型 88 | metadata: 89 | name: prometheus 90 | rules: 91 | - apiGroups: [""] 92 | resources: # 资源 93 | - nodes 94 | - nodes/proxy 95 | - services 96 | - endpoints 97 | - pods 98 | verbs: ["get", "list", "watch"] 99 | - apiGroups: 100 | - extensions 101 | resources: 102 | - ingresses 103 | verbs: ["get", "list", "watch"] 104 | - nonResourceURLs: ["/metrics"] 105 | verbs: ["get"] 106 | --- 107 | apiVersion: v1 108 | kind: ServiceAccount 109 | metadata: 110 | name: prometheus # 自定义名字 111 | namespace: kube-system # 命名空间 112 | --- 113 | apiVersion: rbac.authorization.k8s.io/v1 114 | kind: ClusterRoleBinding 115 | metadata: 116 | name: prometheus 117 | roleRef: # 选择需要绑定的Role 118 | apiGroup: rbac.authorization.k8s.io 119 | kind: ClusterRole 120 | name: cluster-admin 121 | subjects: # 对象 122 | - kind: ServiceAccount 123 | name: prometheus 124 | namespace: kube-system 125 | 126 | ``` 127 | > 配置好之后 k8s会将对应文件挂载到pod中 128 | ```shell script 129 | / # ls /var/run/secrets/kubernetes.io/serviceaccount/ -l 130 | total 0 131 | lrwxrwxrwx 1 root root 13 Jan 7 20:54 ca.crt -> ..data/ca.crt 132 | lrwxrwxrwx 1 root root 16 Jan 7 20:54 namespace -> ..data/namespace 133 | lrwxrwxrwx 1 root root 12 Jan 7 20:54 token -> ..data/token 134 | / # df -h |grep service 135 | tmpfs 7.8G 12.0K 7.8G 0% /var/run/secrets/kubernetes.io/serviceaccount 136 | / # 137 | 138 | ``` 139 | ### 手动curl访问 140 | - 配置TOKEN 141 | ```shell 142 | TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get serviceaccount prometheus -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode ) 143 | ``` 144 | - 访问对应接口,如apiserver 145 | ```shell 146 | curl https://localhost:6443/metrics --header "Authorization: Bearer $TOKEN" --insecure |head 147 | % Total % Received % Xferd Average Speed Time Time Time Current 148 | Dload Upload Total Spent Left Speed 149 | 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend. 150 | # TYPE apiserver_audit_event_total counter 151 | apiserver_audit_event_total 0 152 | # HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend. 153 | # TYPE apiserver_audit_requests_rejected_total counter 154 | apiserver_audit_requests_rejected_total 0 155 | # HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request. 156 | # TYPE apiserver_client_certificate_expiration_seconds histogram 157 | apiserver_client_certificate_expiration_seconds_bucket{le="0"} 0 158 | apiserver_client_certificate_expiration_seconds_bucket{le="1800"} 0 159 | 100 36590 0 36590 0 0 194k 0 --:--:-- --:--:-- --:--:-- 195k 160 | 161 | ``` 162 | 163 | 164 | ## 容器基础资源指标 165 | - 大盘模板 https://grafana.com/grafana/dashboards/13105 166 | 167 | 168 | ```yaml 169 | - job_name: kubernetes-nodes-cadvisor 170 | honor_timestamps: true 171 | scrape_interval: 30s 172 | scrape_timeout: 10s 173 | metrics_path: /metrics 174 | kubernetes_sd_configs: 175 | - role: node 176 | follow_redirects: true 177 | scheme: https 178 | authorization: 179 | type: Bearer 180 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 181 | tls_config: 182 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 183 | insecure_skip_verify: true 184 | follow_redirects: true 185 | relabel_configs: 186 | - separator: ; 187 | regex: __meta_kubernetes_node_label_(.+) 188 | replacement: $1 189 | action: labelmap 190 | - separator: ; 191 | regex: (.*) 192 | target_label: __metrics_path__ 193 | replacement: /metrics/cadvisor 194 | action: replace 195 | ``` 196 | 197 | 198 | > 下面来解读下 199 | - 代表采用k8s服务发现 node 200 | ```yaml 201 | kubernetes_sd_configs: 202 | - role: node 203 | ``` 204 | - 表示服务发现后的node中标签以_meta_kubernetes_node_label_开头的key,替换为后面的字符串,举例`__meta_kubernetes_node_label_kubernetes_io_arch="amd64"` 这组keyv将被替换为 `kubernetes_io_arch="amd64"` 205 | ```yaml 206 | relabel_configs: 207 | - separator: ; 208 | regex: __meta_kubernetes_node_label_(.+) 209 | replacement: $1 210 | action: labelmap 211 | ``` 212 | 213 | 214 | - 表示采集url /metrics 被替换为/metrics/cadvisor 215 | ```yaml 216 | - separator: ; 217 | regex: (.*) 218 | target_label: __metrics_path__ 219 | replacement: /metrics/cadvisor 220 | action: replace 221 | ``` 222 | 223 | 224 | 225 | ## k8s对象资源指标 226 | - grafana 大盘 https://grafana.com/grafana/dashboards/13332 227 | 228 | > prometheus 采集配置 229 | 230 | ```yaml 231 | - job_name: kube-state-metrics 232 | honor_timestamps: true 233 | scrape_interval: 30s 234 | scrape_timeout: 10s 235 | metrics_path: /metrics 236 | scheme: http 237 | static_configs: 238 | - targets: 239 | - kube-state-metrics:8080 240 | ``` 241 | 242 | > 下面来解读下 243 | 244 | - 接口是http的而且没有鉴权,所以无需配置token和cert 245 | - target这里配置的是 kube-state-metrics:8080 246 | 247 | ```yaml 248 | - targets: 249 | - kube-state-metrics:8080 250 | ``` 251 | 252 | - 因为kube-state-metrics部署好之后有个service 253 | 254 | ```yaml 255 | apiVersion: v1 256 | kind: Service 257 | metadata: 258 | labels: 259 | app.kubernetes.io/name: kube-state-metrics 260 | app.kubernetes.io/version: v1.9.7 261 | name: kube-state-metrics 262 | namespace: kube-system 263 | spec: 264 | clusterIP: None 265 | ports: 266 | - name: http-metrics 267 | port: 8080 268 | targetPort: http-metrics 269 | - name: telemetry 270 | port: 8081 271 | targetPort: telemetry 272 | selector: 273 | app.kubernetes.io/name: kube-state-metrics 274 | 275 | ``` 276 | 277 | - k8s 会为service创建[cordns解析](https://kubernetes.io/zh/docs/concepts/services-networking/dns-pod-service/),解析域名为 `${service_name}.${namespace}.svc.cluster.local` ,ksm的域名fqdn为 `kube-state-metrics.kube-system.svc.cluster.local` 278 | - pod中的dns配置为search 3个域,所以配置成`kube-state-metrics-kube-system:8080`是可以的,当然也可以配置成`kube-state-metrics.kube-system.svc:8080` `kube-state-metrics.kube-system.svc.cluster.local:8080` 279 | 280 | ```shell 281 | / # cat /etc/resolv.conf 282 | nameserver 10.96.0.10 283 | search kube-system.svc.cluster.local svc.cluster.local cluster.local 284 | options ndots:5 285 | 286 | ``` 287 | 288 | 289 | 290 | ## k8s服务组件指标 291 | - apiserver大盘 https://grafana.com/grafana/dashboards/12006 292 | 293 | > apiserver prometheus 采集配置其中 etcd集成在apiserver中了 294 | > kube-controler coredns kube-scheduler等同理 295 | 296 | ```yaml 297 | - job_name: kubernetes-apiservers 298 | honor_timestamps: true 299 | scrape_interval: 30s 300 | scrape_timeout: 10s 301 | metrics_path: /metrics 302 | scheme: https 303 | kubernetes_sd_configs: 304 | - role: endpoints 305 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 306 | tls_config: 307 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 308 | insecure_skip_verify: false 309 | relabel_configs: 310 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] 311 | separator: ; 312 | regex: default;kubernetes;https 313 | replacement: $1 314 | action: keep 315 | ``` 316 | 317 | 318 | > 下面来解读下 319 | 320 | - endpoint资源是暴露**一个服务的ip地址和port的列表** 321 | - 代表采用k8s服务发现 endpoint,endpoint会非常多,所以需要过滤apiserver的 322 | 323 | ```yaml 324 | kubernetes_sd_configs: 325 | - role: endpoints 326 | ``` 327 | 328 | - 过滤手段为 标签 __meta_kubernetes_namespace匹配default并且 __meta_kubernetes_service_name 匹配kubernetes 并且 __meta_kubernetes_endpoint_port_name 匹配https,咋样呢 : `keep` 329 | 330 | ```yaml 331 | relabel_configs: 332 | - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] 333 | separator: ; 334 | regex: default;kubernetes;https 335 | replacement: $1 336 | action: keep 337 | 338 | ``` 339 | 340 | - k8s 会在default namespace中创建apiserver的 service 341 | ```shell 342 | $ kubectl get svc -A |grep 443 343 | default kubernetes ClusterIP 10.96.0.1 443/TCP 9d 344 | ``` 345 | 346 | - 最后获取到的endpoint转换为采集路径为: `https://masterip:6443/metrics` 347 | 348 | 349 | ## pod业务埋点指标 -------------------------------------------------------------------------------- /pic/大纲pic/7模块-cicd大纲.md: -------------------------------------------------------------------------------- 1 | 【模块7】cicd平台 第1-3 调研cicd和熟悉gitlab-ci 2 | 【模块7】cicd平台 第4-6 go项目ci流程和makefile 3 | 【模块7】cicd平台 第7-9 gomod使用ci的cache并安装harbor 4 | 5 | # 【模块7】cicd平台 6 | 7 | - 第1章 前置准备和调研工作 8 | - 1.1 从用户角度说一下cicd的需求 9 | - 1.2 直接部署的反面教材 10 | - 1.3 流程图调研 11 | - 1.4 我们设计流程和关键词 12 | - 1.5 组件选型 13 | 14 | - 第2章 部署gitlab社区版本 15 | - 2.1 部署前置准备工作 16 | - 2.2 docker安装gitlab 研究了3小时 17 | - 2.3 访问验证测试ssh下载和提交 18 | - 2.4 简单学习gitlab-auto-devops 自动帮你写了个gitlab-ci-yml 依赖runner 19 | - 2.5 解释gitlab-ci流行原因 20 | - 2.6 熟悉一下gitlab-ci和runner 21 | 22 | - 第3章 gitlab-runner安装和使用 23 | - 3.1 在ubuntu上apt安装runner 24 | - 3.2 尝试一个gitlab-ci-yml 25 | - 3.3 gitlab-ci文件中配置runner的tag 26 | - 3.4 学习gitlab-ci配置的目标 27 | - 3.5 学习gitlab-ci的关键字之default-image 28 | - 3.6 学习gitlab-ci的关键字之default-前后脚本-制品 29 | - 3.7 学习gitlab-ci的关键字之default-前后脚本-timeout 30 | - 3.8 学习gitlab-ci的关键字之include-stage 31 | - 3.9 学习gitlab-ci的关键字之自定义stage顺序 32 | - 3.10 学习gitlab-ci的关键字之environments 33 | 34 | - 第4章 gitlab-ci-yaml使用 35 | - 4.1 学习gitlab-ci的关键字之need 36 | - 4.2 学习gitlab-ci的关键字之release 37 | - 4.3 学习gitlab-ci的关键字之rules-if 38 | - 4.4 Variable和when 39 | - 4.5 内置的变量 40 | - 4.6 简单了解对于go服务应该怎么弄流水线 41 | - 4.7 调研golang-ci流水线 42 | 43 | 44 | - 第5章 准备golang项目并完成ci的项目 45 | - 5.1 准备待自定义logger的gin项目 46 | - 5.2 学习makeFile 47 | - 5.3 编写makeFile 48 | - 5.4 学习goVet 49 | - 5.5 学习Gofmt并改造项目为多目录的 50 | - 5.6 使用gofmt 51 | - 5.7 学习单元测试 52 | - 5.8 准备gin的单元测试 53 | - 5.9 带覆盖率的单测make命令 54 | - 5.10 构建image拼接命令 55 | - 5.11 dockerFile模板和makeFile传参 56 | 57 | - 第6章 根据ci项目完成gitlab-ci-yaml 58 | - 6.1 基础的yaml定义stage 59 | - 6.2 调研go项目使用ci的cache 60 | - 6.3 准备项目和yaml 61 | - 6.4 改造go项目添加构建耗时并加k8s包 62 | - 6.5 遇到docker-ipv6的问题 63 | - 6.6 实验对比带不带缓存的速度 64 | - 6.7 为了独立测试再准备一个新的runner机器 65 | - 6.8 测试vet也需要缓存 66 | - 6.9 封装自己的golang-121的构建镜像 67 | - 6.10 解决问题开启ipv6 68 | 69 | - 第7章 打包镜像 70 | - 7.1 尝试golangci_lint 71 | - 7.2 自己制作基于ubuntu22的go121镜像 72 | - 7.3 自制goproxy代理解决dns和连接问题 73 | - 7.4 goproxy使用window上的ssd-volume 74 | - 7.5 做proxy重启文件是否存在的验证 75 | - 7.6 补全静态代码检测 76 | - 7.7 构建拆成2部分二进制加镜像 77 | - 7.8 在golang镜像里面安装docker 78 | - 7.9 尝试dind后改用kaniko 79 | 80 | - 第8章 安装私有harbor 81 | - 8.1 安装nfs-动态pv 82 | - 8.2 准备harbor的helm-chart-value 83 | - 8.3 解决pod报错 84 | - 8.4 使用harbor测试推送镜像 85 | - 8.5 harbor新建项目并测试用户权限 86 | - 8.6 镜像保留策略的测试 87 | - 8.7 尝试机器人账户 88 | 89 | - 第9章 私有harbor和gitlab打通 90 | - 9.1 研究gitlab-ci配置推送凭证 91 | - 9.2 本地跑kanikobuild挂载docker-config-json 92 | - 9.3 分析镜像层的结果 93 | - 9.4 传参BIN_PATH再按层分析 94 | - 9.5 运行一下这个镜像的容器 95 | - 9.6 配置runner打通构建完成推送 96 | - 9.7 规范镜像的tag命名 97 | - 9.8 harbor的项目和gitlab-group对齐 98 | - 9.9 拼接git-tag 99 | - 9.10 添加job实现拼接tag 100 | - 9.11 镜像地址变量的覆盖问题 101 | - 9.12 整体的测试 102 | - 9.13 打tag触发并应用镜像清理策略 103 | 104 | 105 | - 第10章 gitlab-ci-k8s-agent 106 | - 10.1 调研gitlab-ci怎么apply到k8s集群 107 | - 10.2 再调研 108 | - 10.3 安装一下gitlab-k8s-agent 109 | - 10.4 解决鉴权的问题 110 | - 10.5 k8s-agent权限问题 111 | - 10.6 把docker安装的gitlab改造成https的 112 | - 10.7 再来安装一下k8s-agent试试-果断放弃 113 | 114 | - 第11章 kubeconfig挂载上去 115 | - 11.1 准备kubeconfig文件挂掉runner上面 116 | - 11.2 准备Deployment的模板并替换变量 117 | - 11.3 进行测试符合预期 118 | - 11.4 k8s的containerd支持私有harbor拉取镜像 119 | 120 | - 第12章 代码cd到k8s-dev集群的正确步骤之改造后端 121 | - 12.1 思考正确用法 122 | - 12.2 模拟打通k8s模块-后端代码改造服务树校验-ci调用这个接口 123 | - 12.3 后端增加基于集群和app名称的查询接口 124 | - 12.4 思考改造服务树校验 125 | - 12.5 改造用户表支持服务账号 126 | - 12.6 jwt鉴权中间件改造支持服务账号跳过 127 | - 12.7 casbin鉴权中间件改造 128 | - 12.8 服务树校验改造 129 | 130 | - 第13章 代码cd到k8s-dev集群之gitlab-ci适配 131 | - 13.1 先去获取k8sApp的id 132 | - 13.2 完成Deploy中拼接的逻辑 133 | - 13.3 进行测试发现shell不好调整变量 134 | - 13.4 shell写json文件再post 135 | - 13.5 调整一下传参 136 | - 13.6 建一个go-app的k8s应用 137 | - 13.7 测试多分支的泳道的思路 138 | - 13.8 测试image_url变量的传递 139 | - 13.9 Deploy中需要判断新增或更新 140 | - 13.10 新建分支修改代码重跑流水线 141 | - 13.11 pod携带新的分支标签 142 | 143 | - 第14章 公共ci-yaml的仓库,实现业务传参 144 | - 14.1 为什么要做公共的 145 | - 14.2 新建公共模板仓库 146 | - 14.3 测试什么变量都不传-只是把yaml挪到了公共仓库中 147 | - 14.4 测试传入不存在的k8sApp 148 | - 14.5 解决curl接口没结果要failed流水线 149 | - 14.6 测试job的覆盖 150 | - 14.7 添加一个job来检测必备的变量是否传入了 151 | - 14.8 全流水线测试 152 | - 14.9 新建项目 153 | - 14.10 修复goproxy问题 154 | - 14.11 完整的cicd流水线go代码-ci检测-harbor镜像-k8s-app 155 | - 14.12 下一步的计划 156 | 157 | - 第15章 cd服务发布项 158 | - 15.1 思考一下如果发布到k8s集群需要什么 159 | - 15.2 build+构建镜像的流水线 160 | - 15.3 改造镜像拼接逻辑-tag的时候直接用tag 161 | - 15.4 服务发布项表设计 162 | - 15.5 发布工单表设计 163 | - 15.6 mock发布项数据 164 | - 15.7 服务树节点添加研发负责人和工程师人员列表 165 | - 15.8 构造发布工单数据 166 | - 15.9 获取审批人列表 167 | 168 | 【模块7】cicd平台 第16-18 后端走通发布一个stage流程 169 | 170 | - 第16章 后端走通发布一个stage流程 171 | - 16.1 定义发布阶段表 172 | - 16.2 改造发布项的发布阶段 173 | - 16.3 gorm事务创建工单联动创建发布阶段状态 174 | - 16.4 解决k8s-mock耗时高的问题 175 | - 16.5 测试事务创建的结果 176 | - 16.6 审批发布工单的逻辑 177 | - 16.7 检查操作人是否有这个工单对应服务树节点权限 178 | - 16.8 执行发布阶段的接口准备 179 | - 16.9 发布阶段的接口联动k8s实例 180 | - 16.10 测试审批接口 181 | - 16.11 测试发布阶段接口 182 | 183 | - 第17章 stage的轮转 184 | - 17.1 统一更新stage的状态 185 | - 17.2 总结stage状态的切换 186 | - 17.3 stage的测试结果更新 187 | - 17.4 准备菜单 188 | - 17.5 list表格 189 | - 17.6 form表单准备绑定服务发布项的树节点 190 | - 17.7 测试 191 | - 17.8 gitlab获取版本号的接口 192 | - 17.9 调研gitlab-go的sdk并使用 193 | - 17.10 后端接口中支持gitlab接口 194 | - 17.11 测试并完成获取项目的tag列表 195 | 196 | - 第18章 发布工单的前端 197 | - 18.1 工单中用服务发布项替换服务树 198 | - 18.2 尝试服务发布项下拉列表变化联动环境 199 | - 18.3 再通过发布项id去获取gitlab标签列表 200 | - 18.4 表单中展示gitlab仓库地址 201 | - 18.5 完成联动 202 | - 18.6 创建发布工单的接口 203 | - 18.7 调整表格 204 | - 18.8 跳转工单详情和查询one的接口 205 | - 18.9 思考前端布局 206 | 207 | - 第19章 服务树前端绑定服务发布项 208 | - 19.1 回顾一下服务树页面开发 209 | - 19.2 根据树节点id获取服务发布项 210 | - 19.3 展示服务发布项的基本信息 211 | - 19.4 stage列表的展示 212 | - 19.5 换成表格展示 213 | - 19.6 编辑的模态框 214 | - 19.7 测试编辑传参 215 | - 19.8 一键添加多个字段 216 | - 19.9 集群和k8s应用id的选择 217 | - 19.10 修复id选择大小写问题 218 | - 19.11 解决动态表单编辑的问题 219 | 220 | - 第20章 服务发布项的后端接口 221 | - 20.1 创建服务发布项的接口 222 | - 20.2 前端进行测试 223 | - 20.3 解决treeNodeId传参问题 224 | - 20.4 解决没有发布项节点报错 225 | - 20.5 编辑树节点后刷新问题 226 | - 20.6 更新的接口前端复用按钮 227 | - 20.7 后端限制服务发布项操作权限 228 | - 20.8 前端限制权限的做法添加canAdmin的字段 229 | - 20.9 前端判断按钮 230 | - 20.10 删除服务发布项的逻辑 231 | 232 | - 第21章 继续发布工单工作 233 | - 21.1 回顾工单的开发进度 234 | - 21.2 基础详情信息和布局 235 | - 21.3 用Description组件展示详情 236 | - 21.4 可选审批人获取的逻辑 237 | - 21.5 后端服务树节点编辑研发负责人 238 | - 21.6 前端测试 239 | - 21.7 解决preload的问题 240 | - 21.8 同理编写研发工程师功能 241 | - 21.9 递归查找工单可审批人 242 | - 21.10 子级覆盖父级的逻辑 243 | 244 | - 第22章 工单审批的 245 | - 22.1 前端展示审批人 246 | - 22.2 审批按钮的逻辑 247 | - 22.3 审批的接口 248 | - 22.4 测试正常 249 | - 22.5 页面刷新的问题和重复审批 250 | - 22.6 工单的时间轴数据准备 251 | - 22.7 时间轴添加审批结果 252 | - 22.8 添加审批时间的字段固化审批流程 253 | 254 | - 第23章 工单执行的逻辑 255 | - 23.1 展示发布阶段的准备 256 | - 23.2 发布阶段的表格准备 257 | - 23.3 测试表格 258 | - 23.4 字段调整 259 | - 23.5 时间轴展示所有stage 260 | - 23.6 调整审批通过的节点状态 261 | - 23.7 解决stage填充调用工单再调用stage递归fill的问题 262 | - 23.8 测试发布按钮 263 | - 23.9 是否可以显示发布的按钮 264 | - 23.10 完成逻辑按钮判断的逻辑 265 | - 23.11 进行测试发现问题 266 | - 23.12 更换id计数逻辑 267 | 268 | - 第24章 工单stage的发布 269 | - 24.1 前端测试 270 | - 24.2 测试按钮的显示逻辑 271 | - 24.3 测试按钮的接口联调 272 | - 24.4 stage添加detail字段 273 | - 24.5 联调展示结果 274 | - 24.6 single集群发布结果检查 275 | - 24.7 执行工单状态变化 276 | - 24.8 textArea展示详情能否美化 277 | 278 | - 第25章 工单stage的回滚 279 | - 25.1 回滚的调研:就找到这个Deployment 回滚它上一个版本 280 | - 25.2 查看k8s源码回滚Deployment的逻辑 281 | - 25.3 我们写回滚能否直接用接口而不是自己写逻辑 282 | - 25.4 写回滚方法 283 | - 25.5 测试回滚同时修复了imagePullSecret的bug 284 | - 25.6 回滚的前端设计 没发布不能回滚 285 | - 25.7 获取上一个版本 286 | - 25.8 上一张工单没结束不能创建新的工单 287 | 288 | - 第26章 灰度发布之OpenKruise 289 | - 26.1 进行调研:stage到prod的灰度vs单一集群多副本之间的灰度 290 | - 26.2 k8s灰度发布调研 291 | - 26.3 OpenKruise简介和安装 292 | - 26.4 原地升级的介绍 293 | - 26.5 准备nginx定制首页 294 | - 26.6 测试原地升级 295 | 296 | - 第27章 OpenKruise的rollout 297 | - 27.1 Deployment的滚动升级 298 | - 27.2 Deployment的暂停准备 299 | - 27.3 举例说明pause的问题 300 | - 27.4 按比例暂停调研 301 | - 27.5 安装并准备环境 302 | - 27.6 实验rollout的canary遇到不兼容的问题 303 | - 27.7 发现版本问题 304 | - 27.8 重新弄原来的版本 305 | - 27.9 再实验 306 | 307 | - 第28章 解读rollout的细节 308 | - 28.1 rollout的配置 309 | - 28.2 安装ingress-nginx控制器 310 | - 28.3 测试ingress访问 311 | - 28.4 发布策略之金丝雀:访小范围的新版本,直接观察新版本的效果:拿真实的流量进行测试 312 | - 28.5 改造index程序打印版本 313 | - 28.6 ab测试之header访问:原有访问不受限制:加个特殊的header才能访问:给研发人员测试用的 314 | - 28.7 准备ingress-nginx 灰度环境 315 | - 28.8 完成测试 316 | - 28.9 研究ab的原理 317 | 318 | - 第29章 cicd模块如何整合rollout之准备工作 319 | - 29.1 我们的灰度发布需求 320 | - 29.2 灰度配置位置工单or发布项 321 | - 29.3 发布项添加灰度选项 322 | - 29.4 yaml配置项的检查 323 | - 29.5 修改更新时的配置 324 | - 29.6 在发布阶段中支持副本数 325 | - 29.7 发现发布dep名称不能带tag 326 | - 29.8 进行改造 327 | - 29.9 测试正常 328 | - 29.10 准备k8s应用之go-app-01 329 | 330 | 331 | - 第30章 cicd模块如何整合rollout 332 | - 30.1 准备镜像把Deployment调整为running 333 | - 30.2 发现stage关闭工单的bug 334 | - 30.3 新增关闭按钮 335 | - 30.4 回滚拼接Deployment名称修改 336 | - 30.5 先来拼接一下rollout对象 337 | - 30.6 rollout-api创建 338 | - 30.7 先写demo 339 | - 30.8 在stage-api中添加创建rollout对象 340 | - 30.9 测试 341 | 342 | - 第31章 cicd模块如何整合rollout 343 | - 31.1 测试rollout暂停 344 | - 31.2 stage添加rollout-message 345 | - 31.3 展示灰度信息 346 | - 31.4 展示rollout状态 347 | - 31.5 研究tools中是如何approve的 348 | - 31.6 完成approve的接口 349 | - 31.7 增加rollout审批的按钮发现patch的问题 350 | - 31.8 解决更新status的问题 351 | - 31.9 灰度按钮的show 352 | - 31.10 准备测试数据 353 | 354 | - 第32章 灰度发布收尾 355 | - 32.1 进行灰度测试 356 | - 32.2 展示新旧pod的状态的接口 357 | - 32.3 准备podList的drawer 358 | - 32.4 联调接口发现表格问题 359 | - 32.5 解决表格问题 360 | - 32.6 展示版本颜色 361 | - 32.7 展示pod-hash和日志 362 | - 32.8 进行调整 363 | - 32.9 进行一个完整的测试 364 | 365 | - 第33章 灰度发布结合ingress进行header测试 366 | - 33.1 确定ingress和svc 367 | - 33.2 修改一下后端代码区分版本 368 | - 33.3 测试2.0和3.0的效果 369 | - 33.4 修改king的服务发布项添加ingress灰度 370 | - 33.5 解决match-header带不上的问题 371 | - 33.6 升级rollout到0.5.0 372 | 373 | - 第34章 前端bigdevops-fe打包部署到k8s中 374 | - 34.1 vben打包问题01 375 | - 34.2 尝试解决rollup报错失败 376 | - 34.3 经对比原版后定位问题 377 | - 34.4 env环境变量导入的问题 378 | - 34.5 websocket地址配置正确姿势 379 | - 34.6 viteproxy总结 380 | - 34.7 打包并解决Preview的报错 381 | - 34.8 构建镜像尝试遇到问题 382 | - 34.9 修改nginx配置文件 383 | - 34.10 总结前端打包问题 384 | - 34.11 部署前端项目到k8s中 385 | - 34.12 试一下nginx.conf配置configmap 386 | - 34.13 解决subpath挂载的问题 387 | - 34.14 改变一下后端地址重新加载configmap 388 | 389 | - 第35章 后端bigdevops-be打包部署到k8s中 390 | - 35.1 后端server打包并准备Deployment-yaml 391 | - 35.2 server部署到k8s中测试 392 | - 35.3 webhook的编译和部署k8s 393 | - 35.4 整理一下文件 394 | - 35.5 整理一下镜像推送阿里云 395 | - 35.6 写个ingress测试一下前后端 396 | - 35.7 grpc-agent部署到k8s的ds中 397 | - 35.8 ds调整为hostNetwork 398 | - TODO 35.9 把ds中调通 399 | 400 | 401 | 402 | kubectl patch rollout rollout-k8s-app-go01 --type=merge --subresource status --patch 'status: {canaryStatus: {currentStepState:StepReady}}' 403 | 404 | 405 | 406 | - TODO 执行的时间轴 stage的发布 测试 流程流转前后端 回滚 407 | - 灰度发布 408 | 409 | 410 | - 18.9 先展示一些详情信息 411 | 412 | 服务发布项 创建时要添加git仓库的id和名称 413 | glpat-YrnVSW9ahzhnK5q_mBYi 414 | 415 | PART01:ci完整流程:测试类、构建镜像(harbor) DONE 416 | PART02:打通部署到k8s测试集群:快速 频繁 没有工单 DONE 417 | PART03:cd服务发布项 服务发布工单 418 | PART04:灰度发布 419 | 420 | TODO:公共ciyaml的仓库业务传参 421 | TODO:cd服务发布项 服务发布工单 422 | TODO:灰度发布 423 | 424 | 7模块go大运维平台cicd模块开发前置调研 425 | 7模块go大运维平台之 cicd模块之 gitlab-ci的基础课程之after-scripts 426 | -------------------------------------------------------------------------------- /pic/大纲pic/7模块-监控大纲.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 大运维平台5大模块 6 | - 01 资产管理 & cmdb & 服务树 7 | - 02 工单 & 工作流 & 审批 8 | - 03 cicd 全流程配置 : 比较发怵, 9 | - 04 Prometheus管理配置 :没写过平台:想法 10 | - 05 k8s多集群管理 :vue2 课程,有丰富的经验: 11 | 12 | 13 | 【5】Prometheus 第1章 前置准备工作和Prometheus基础使用 14 | 【5】Prometheus 第2章 监控采集模块的开发规划 15 | 【5】Prometheus 第3章 监控采集模块之采集池 16 | 【5】Prometheus 第4章 监控采集模块之采集job设计和后端代码 17 | 【5】Prometheus 第5章 监控采集模块缓存生成分片配置 18 | 【5】Prometheus 第6章 监控采集模块支持k8s集群外采集 19 | 【5】Prometheus 第7章 监控采集模块前端采集池 20 | 【5】Prometheus 第8章 监控采集模块前端采集任务 21 | 【5】Prometheus 第9章 测试联调 22 | 【5】Prometheus 第10章 告警模块alertmanager基础 23 | 【5】Prometheus 第11章 告警模块分组的后端逻辑 24 | 【5】Prometheus 第12章 告警规则触发和sendgroup的关联 25 | 【5】Prometheus 第13章 本地mock从采集-告警-分组-webhook 26 | 【5】Prometheus 第14章 值班表逻辑 27 | 【5】Prometheus 第15章 值班表历史和换班记录 28 | 【5】Prometheus 第16章 webhook后端处理程序基础 29 | 【5】Prometheus 第17章 webhook后端处理程序 30 | 【5】Prometheus 第18章 im的机器人 31 | 【5】Prometheus 第19章 交互式卡片消息 32 | 【5】Prometheus 第20章 webhook根据卡片模板生成消息01 33 | 【5】Prometheus 第21章 webhook根据卡片模板生成消息02 34 | 【5】Prometheus 第22章 屏蔽和认领接口 35 | 【5】Prometheus 第23章 私聊和群聊token获取 36 | 【5】Prometheus 第24章 前端编写之值班组 37 | 【5】Prometheus 第25章 前端编写之值班组排班 38 | 【5】Prometheus 第26章 换班逻辑 39 | 【5】Prometheus 第27章 alertmanager集群管理 40 | 【5】Prometheus 第28章 发送组配置管理 41 | 【5】Prometheus 第29章 告警规则前端配置 42 | 【5】Prometheus 第30章 告警规则配置后端接口 43 | 【5】Prometheus 第31章 告警规则annotation默认添加description_value 44 | 【5】Prometheus 第32章 告警事件管理 45 | 46 | 47 | # 【模块5】Prometheus监控管理平台 48 | - 第1章 前置准备工作和Prometheus基础使用 49 | - 1.1 为什么先开发Prometheus 50 | - 1.2 普罗平台都要做哪些模块 51 | - 1.3 梳理一下每个模块平台侧功能 52 | - 1.4 初始化ansible做准备 53 | - 1.5 playbook批量部署node-exporter 54 | - 1.6 部署Prometheus后介绍基础功能 55 | - 1.7 部署grafana 56 | - 1.8 配置采集node-exporter 57 | 58 | - 第2章 监控采集模块的开发规划 59 | - 2.1 采集之exporter管理规划 60 | - 2.2 采集job通用配置规划 61 | - 2.3 采集配置和Prometheus文件的管理 62 | - 2.4 采集完的传输规划 63 | - 2.5 安装VictoriaMetrics 64 | - 2.6 remote-write到vm并查询 65 | - 2.7 采集器高可用问题 66 | - 2.8 hashmod和服务发现配置 67 | - 2.9 动态分片和静态分片 68 | - 2.10 总结一下采集模块开发规划 69 | 70 | - 第3章 监控采集模块之采集池 71 | - 3.1 准备prometheus代码 72 | - 3.2 实验scrape_config_files 73 | - 3.3 后端go文件tbl和view加模块前缀 74 | - 3.4 采集池的字段 75 | - 3.5 采集池和Prometheus节点的关系 76 | - 3.6 mock采集池数据 77 | - 3.7 构建采集池生缓存 78 | - 3.8 根据采集池生成Prometheus主配置文件-01 79 | - 3.9 组装主配置逻辑 80 | - 3.10 进行测试 81 | 82 | - 第4章 监控采集模块之采集job设计和后端代码 83 | - 4.1 生成主配置文件和http合并一起 84 | - 4.2 编写download脚本测试api接口 85 | - 4.3 http类型的服务发现 86 | - 4.4 采集job表结构适配http类型的服务发现 87 | - 4.5 服务树http类型sd接口数据准备 88 | - 4.6 服务树http类型sd接口拼接targetGroup 89 | - 4.7 测试服务树http-sd接口 90 | - 4.8 http-sd和采集联调成功 91 | - 4.9 添加获取所有叶子节点fullPath和Id的接口 92 | - 4.10 生成主配置文件添加采集job准备 93 | 94 | - 第5章 监控采集模块缓存生成分片配置 95 | - 5.1 生成http-sd的配置项 96 | - 5.2 cache合入主配置文件 97 | - 5.3 解决http接口不显示scrape问题 98 | - 5.4 服务树mock绑定ecs差异化 99 | - 5.5 分片之tmpHash-keep 100 | - 5.6 验证单一ip和分片的结果 101 | - 5.7 采集器健康检测问题 102 | 103 | - 第6章 监控采集模块支持k8s集群外采集 104 | - 6.1 k8s的采集方式并部署inCluster采集 105 | - 6.2 模拟集群外采集解决证书x509问题 106 | - 6.3 模拟集群外采集解决401-token问题 107 | - 6.4 集群外采集数据库字段 108 | - 6.5 统计开发数据 109 | - 6.6 测试ca和token直接填内容 110 | - 6.7 解决不能使用inline-CA问题 111 | - 6.8 kubeconfig可不可以去掉 112 | - 6.9 解决kubeconfig_file和sd的http-client冲突问题 113 | - 6.10 尝试添加relabel_configs的支持 114 | 115 | - 第7章 监控采集模块前端采集池 116 | - 7.1 准备菜单 117 | - 7.2 采集池的表格和list接口 118 | - 7.3 表格字段和标签颜色 119 | - 7.4 新增采集池的表单 120 | - 7.5 机器apiSelect 121 | - 7.6 调整表单字段宽度 122 | - 7.7 切割exteralLabels前后端适配 123 | - 7.8 实例ip字段适配并mock2个真实节点 124 | - 7.9 remoteWrite地址url校验 125 | - 7.10 后端接口新增和更新接口 126 | - 7.11 查看采集实例的yaml 127 | - 7.12 yaml查看的后端接口支持鉴权和非鉴权 128 | - 7.13 codemirror展示yaml并添加复制按钮 129 | 130 | - 第8章 监控采集模块前端采集任务 131 | - 8.1 准备菜单 132 | - 8.2 删除采集池和采集池ip不能和其他池重复 133 | - 8.3 采集任务表格和list接口 134 | - 8.4 新增采集任务控制不同服务发现类型 135 | - 8.5 新增采集任务支持http服务发现 136 | - 8.6 新增采集任务调整form格式 137 | - 8.7 编辑任务时http-sd绑定的树节点名称只显示id问题 138 | - 8.8 定位到ids数组的问题 139 | - 8.9 模仿stringArray在gorm中做IntArr 140 | - 8.10 模仿stringArray在gorm中做IntArr 141 | 142 | - 第9章 测试联调 143 | - 9.1 测试采集池缩容情况 144 | - 9.2 测试采集池扩容解决指针数组问题 145 | - 9.3 测试k8s采集任务发现relabel缩进问题 146 | - 9.4 通过规定解决索引问题 147 | - 9.5 api中添加relabel解析失败的校验 148 | - 9.6 测试k8s的job解决时间大小问题 149 | - 9.7 模拟真实应用场景之cron 150 | - 9.8 给任务添加开关 151 | - 9.9 模拟部分job关闭情况=0不更新 152 | 153 | - 第10章 告警模块alertmanager基础 154 | - 10.1 告警TODO 155 | - 10.2 alertmanager核心功能点介绍和安装部署 156 | - 10.3 编写go程序充当告警触发端和接收端 157 | - 10.4 alertmanager分组功能-01 158 | - 10.5 alertmanager分组功能-02 159 | - 10.6 告警抑制实例 160 | - 10.7 告警静默 161 | 162 | - 第11章 告警模块分组的后端逻辑 163 | - 11.1 分析alertmanager配置 164 | - 11.2 alert实例对象 165 | - 11.3 send_group对象 166 | - 11.4 静态人和升级的关系 167 | - 11.5 生成mainconfig的逻辑 168 | - 11.6 准备group的mock数据 169 | - 11.7 校验默认route的生成 170 | - 11.8 newMatcher匹配 171 | - 11.9 验证match-re和route的生成 172 | - 11.10 生成对应的receiver 173 | 174 | - 第12章 告警规则触发和sendgroup的关联 175 | - 12.1 定义规则表rule字段 176 | - 12.2 缓存AlertManager生成yaml的逻辑 177 | - 12.3 测试yaml的结果 178 | - 12.4 告警触发复用采集池 179 | - 12.5 生成Prometheus主配置时需要添加alert的支持 180 | - 12.6 进行测试 181 | - 12.7 ruleFormat拼接规则 182 | - 12.8 生成单一规则 183 | - 12.9 如何直接生成group-go对象 184 | - 12.10 编写rule规则分片逻辑 185 | 186 | - 第13章 本地mock从采集-告警-分组-webhook 187 | - 13.1 测试rule分片的逻辑 188 | - 13.2 给规则中添加send_group标签 189 | - 13.3 本地mock从采集-告警-分组-webhook之采集数据准备 190 | - 13.4 本地mock从采集-告警-分组-webhook之采集数据完整链路验证 191 | - 13.5 总结TODO 192 | 193 | - 第14章 值班表逻辑 194 | - 14.1 基础逻辑 195 | - 14.2 表结构的设计 196 | - 14.3 思考交互逻辑 197 | - 14.4 mock数据并准备api 198 | - 14.5 最小化模拟轮班过程-1 199 | - 14.6 最小化模拟轮班过程-2 200 | - 14.7 查询历史值班情况 201 | - 14.8 mock集合历史算出未来 202 | - 14.9 进行测试 203 | - 14.10 完成api中未来的逻辑 204 | 205 | - 第15章 值班表历史和换班记录 206 | - 15.1 测试api发现边界问题 207 | - 15.2 解决这个问题 208 | - 15.3 值班换班记录表和历史表关系 209 | - 15.4 ticker填充历史记录 210 | - 15.5 解决多对多映射问题 211 | - 15.6 解决结束日期边界问题 212 | - 15.7 mock一些历史数据 213 | - 15.8 又发现bug了 214 | - 15.9 最终解决边界问题 215 | - 15.10 给值班组绑定查询当前值班人的方法 216 | 217 | - 第16章 webhook后端处理程序基础 218 | - 16.1 webhook处理程序的核心功能和是否独立 219 | - 16.2 webhook解析配置-连接数据库 220 | - 16.3 整理各模块gin的route和view目录 221 | - 16.4 启动接受alert的接口 222 | - 16.5 测试接收alert 223 | - 16.6 receive接口把alert异步写入Queue 224 | - 16.7 消费alertQueue的框架 225 | - 16.8 启动消费者并测试 226 | - 16.9 【7模块golang大运维平台】【模块5 Prometheus监控】【开发Webhook告警处理模块】为何要构建SendGroup的cache 227 | - 16.10 renewMap之SendGroup的逻辑 228 | 229 | - 第17章 webhook后端处理程序 230 | - 17.1 如何保证接口在缓存刷新后启动-goroutine的顺序控制 231 | - 17.2 消费者需要根据id获取发送组信息 232 | - 17.3 类比sg把用户和值班组的缓存也构建出来 233 | - 17.4 进行测试 234 | - 17.5 设计告警event表 235 | - 17.6 在alert中获取ruleId 236 | - 17.7 构建rule规则的cache 237 | - 17.8 尝试event的save操作 238 | - 17.9 event的次数更新 239 | 240 | - 第18章 im的机器人 241 | - 18.1 im选择飞书 242 | - 18.2 了解飞书机器人 243 | - 18.3 自定义机器人发送消息 244 | - 18.4 userId-openId如何获取 245 | - 18.5 自定义机器人其他格式消息 246 | - 18.6 应用机器人私聊消息 247 | - 18.7 总结机器人消息发送和tenant_access_token获取 248 | - 18.8 测试给二狗发送消息失败 机器人的可见范围 249 | 250 | - 第19章 交互式卡片消息 251 | - 19.1 卡片消息和 消息卡片搭建工具 252 | - 19.2 自定义机器人发送卡片消息 253 | - 19.3 应用机器人发送卡片消息 254 | - 19.4 消息卡片搭建工具构造告警信息模板01 255 | - 19.5 消息卡片搭建工具构造告警信息模板emoji 256 | - 19.6 消息卡片搭建工具构造告警信息模板按钮组 257 | - 19.7 消息卡片搭建工具构造告警信息模板发送测试 258 | 259 | - 第20章 webhook根据卡片模板生成消息01 260 | - 20.1 构造基础json模板 261 | - 20.2 封装http请求基础库post 262 | - 20.3 实验拼接大json部分字段 263 | - 20.3 群聊和私聊复用拼接大json的逻辑 264 | - 20.4 测试私聊卡片 265 | - 20.5 解决私聊卡片问题 266 | - 20.6 拼接卡片消息之绑定服务树和级别 267 | - 20.7 如何获取value 268 | - 20.8 进行字段的拼接之标题颜色 269 | - 20.9 拼接绑定服务树和时间 270 | - 20.10 调整一下mock数据 271 | 272 | 273 | - 第21章 webhook根据卡片模板生成消息02 274 | - 21.1 grafana链接和expr规则 275 | - 21.2 拼接发送组 276 | - 21.3 拼接屏蔽和认领按钮 277 | - 21.4 取消屏蔽 278 | - 21.5 获取值班人和值班组 279 | - 21.6 解决TodayDutyUser为空问题 280 | - 21.7 测试at不同人 281 | - 21.8 告警升级的私聊对象变为数组 282 | - 21.9 拼接升级内容并切换发送人 283 | - 21.10 mock数据告警升级接收人列表并测试 284 | 285 | - 第22章 屏蔽和认领接口 286 | - 22.1 测试告警升级格式 287 | - 22.2 补全告警标签和annotation 288 | - 22.3 私聊发给值班人+发送告警群at值班人 289 | - 22.4 告警屏蔽接口 290 | - 22.5 测试告警屏蔽 291 | - 22.6 取消屏蔽接口event增加silenceId 292 | - 22.7 完成unsilence接口 293 | - 22.8 按alertName屏蔽按钮 294 | - 22.9 按alertName屏蔽接口 295 | 296 | - 第23章 私聊和群聊token获取 297 | - 23.1 完成群聊发送token设置 298 | - 23.2 私聊token刷新管理器 299 | - 23.3 测试私聊token 300 | 301 | - 第24章 前端编写之值班组 302 | - 24.1 增加菜单 303 | - 24.2 值班组列表数据 304 | - 24.3 值班组Form字段 305 | - 24.4 值班组新增和更新 306 | - 24.5 值班组删除保护和级联删除 307 | - 24.6 route-link实现表格跳转 308 | - 24.7 准备排班表页面 309 | - 24.8 调试排班页面之moment获取日期 310 | - 24.9 和后端值班表对应上 311 | - 24.10 panelChange查看其他月份 312 | 313 | - 第25章 前端编写之值班组排班展示 314 | - 25.1 排班计划时间范围分3种情况 315 | - 25.2 排班组详情页增加信息 316 | - 25.3 轮班周期的填充历史记录的逻辑 317 | - 25.4 进行测试 318 | - 25.5 如果昨天的人是换班的-那么就得用它之前的人 319 | - 25.6 第一轮剩余轮班逻辑 320 | - 25.7 第一轮超过的逻辑 321 | - 25.8 测试第一轮剩余 322 | - 25.9 测试第一轮超过 323 | - 25.10 前段获取周期默认为2个月 324 | 325 | - 第26章 换班逻辑 326 | - 26.1 点击日期打开模态框 327 | - 26.2 需要把日期原值班人传入 328 | - 26.3 完成换班请求拼接 329 | - 26.4 后端接口测试并添加换班记录 330 | - 26.5 换班的记录显示在日历上 331 | - 26.6 历史日期不能换班 332 | - 26.7 测试历史换班记录 333 | 334 | - 第27章 alertmanager集群管理 335 | - 27.1 发送组菜单 336 | - 27.2 alertmanager集群列表 337 | - 27.3 alert集群yaml查看页面 338 | - 27.4 新增alertmanager集群的drawer 339 | - 27.5 新增接口和ip重复检验 340 | - 27.6 更新删除接口 341 | 342 | - 第28章 发送组配置管理 343 | - 28.1 发送组表格字段 344 | - 28.2 发送组列表接口 345 | - 28.3 展示第一升级人列表 346 | - 28.4 发送组的基础form字段 347 | - 28.5 告警升级开关 348 | - 28.6 封装view中公共的获取用户方法 349 | - 28.7 告警升级人编辑展示 350 | - 28.8 发送组的新增和更新接口 351 | - 28.9 之前配置的升级人不配置了需要增量删除 352 | - 28.10 测试gorm事务型更新方法 353 | - 28.11 删除后reload表格 354 | - 28.12 发送组变更后alertmanager配置测试 355 | 356 | - 第29章 告警规则前端配置 357 | - 29.1 菜单和规则表格字段 358 | - 29.2 fullfill方法和routeLink跳转 359 | - 29.3 告警级别颜色展示和开启switch 360 | - 29.4 规则的基础字段 361 | - 29.5 采集池要支持alertmanager配置 362 | - 29.6 标签和annotation列表字段 363 | - 29.7 promql-ui调研 364 | - 29.8 promql-ui配置 365 | - 29.9 ql和form位置调整 366 | - 29.10 promql语法校验的后端接口-1 367 | - 29.11 promql语法校验的后端接口-2 368 | - 29.12 校验都以200返回用字段区分 369 | 370 | - 第30章 告警规则配置后端接口 371 | - 30.1 编辑的时候把expr回填 372 | - 30.2 定义前转后和后转前的模板方法 373 | - 30.3 code为空保护接口中校验ql 374 | - 30.4 drawer的closefunc刷新表格或页面 375 | - 30.5 告警规则的开关按钮 376 | - 30.6 告警规则的删除 377 | - 30.7 开关和删除能否批量操作 378 | - 30.8 开关批量操作的后端接口 379 | - 30.9 批量删除按钮 380 | - 30.10 采集池支持采集器规则和告警规则查看 381 | 382 | - 第31章 告警规则annotation默认添加description_value 383 | - 31.1 告警规则yaml查看页面 384 | - 31.2 调整一下告警模块的菜单顺序 385 | - 31.3 告警规则annotation默认添加description_value 386 | - 31.4 解决rule文件中的非法字符 387 | - 31.5 人员信息添加飞书userId字段 388 | - 31.6 部分修补操作 389 | 390 | - 第32章 告警事件管理 391 | - 32.1 菜单-页面-api文件 392 | - 32.2 mock一些数据 393 | - 32.3 status颜色展示和关联字段跳转 394 | - 32.4 第一次告警时间 395 | - 32.5 告警屏蔽接口 396 | - 32.6 如何通过event获取alm-api 397 | - 32.7 前端屏蔽按钮 398 | - 32.8 解析屏蔽时间 399 | - 32.9 已屏蔽的不能再有屏蔽按钮了 400 | - 32.10 封装通过event发送飞书群消息的公共方法 401 | 402 | - 第33章 告警认领 403 | - 33.1 动作后同步触发im通知 404 | - 33.2 进行测试 405 | - 33.3 告警认领的webhook逻 406 | - 33.4 告警认领的接口 407 | - 33.5 告警认领的im消息拼接 408 | - 33.6 排查告警认领不能被告警升级覆盖 409 | - 33.7 排查renlingUserId=0 410 | - 33.8 解除屏蔽 411 | - 33.9 批量操作抽象公共方法 412 | - 33.10 前端进行batch和single的区分 413 | - 33.11 批量屏蔽的测试 414 | 415 | 416 | - 第34章 record预聚合 417 | - 34.1 record基础知识和vm-remote-read 418 | - 34.2 实验record 419 | - 34.3 record复用采集池逻辑 420 | - 34.4 拆分cache中的几把锁 421 | - 34.5 mock预聚合规则并测试缓存 422 | - 34.6 完成同步record脚本 423 | - 34.7 采集池支持Record配置和查看 424 | - 34.8 配置预聚合规则列表 425 | - 34.9 创建和更新操作 426 | - 34.10 删除和批量删除 427 | - 34.11 Prometheus管理平台开发之告警和预聚合规则绑定服务树节点的应用 428 | 429 | 430 | - 第35章 Prometheus告警总结 431 | - 35.1 总结采集模块 432 | - 35.2 总结值班组和ALertmanager模块 433 | - 35.3 总结webhook和im卡片消息模块 434 | - 35.4 总结告警规则模块 435 | 436 | 437 | 【5】Prometheus 第33章 告警认领 438 | 【5】Prometheus 第34章 record预聚合 439 | 【5】Prometheus 第35章 Prometheus告警总结 440 | 441 | - 告警认领 屏蔽 动作 442 | - TODO 批量屏蔽 443 | - 告警事件 时间轴 444 | 445 | - 采集任务对于采集池 相当于发送组 对于alert集群 446 | 447 | --------------------------------------------------------------------------------