├── 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 | 
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 | 
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 | 
22 | - 一键化部署k8s-prometheus中的所有组件
23 | - 复杂的k8s采集自动生成
24 | - 内置了很多alert和record rule,专业的promql,不用我们自己写了
25 | - 多级嵌套的record计算如apiserver的slo
26 | - 使用 Prometheus Operator 框架及其自定义资源,使指标的接入可以由业务方自行配置,无需监控管理员介入
27 |
28 |
29 |
30 | # kube-prometheus采集难点
31 | 
32 |
33 | - kube-prometheus内置的k8s采集任务都采集了什么
34 | - 怎么采集到了
35 | - 为什么要采集这些
36 | - 用了哪些优化手段
37 |
38 |
39 | # kube-prometheus内置的grafana-dashboard看图分析难点
40 | 
41 | - 内置的grafana-dashboard看图都包含什么图表
42 | - 为什么要设置这些图表
43 | - 6层slo预聚合到底怎么做的
44 | - 动态dashboard怎么实现的
45 |
46 |
47 | # kube-prometheus内置的告警和预聚合分析,6层预聚合slo原理
48 | 
49 | - 内置的告警包含哪些规则
50 | - 怎么配置上去的
51 | - apiserver6层slo预聚合到底怎么做的
52 | - 我怎样去自定义规则
53 |
54 |
55 |
56 | # kube-rbac 鉴权是干什么的
57 | - 为什么要加着一层
58 | - 和envoy项目什么关系
59 | - 如果代理upstream的流量
60 |
61 | # 怎样把我自定义的指标应用到prometheus-operator中
62 | 
63 | - 如何用go编写项目部署到k8s的pod中
64 | - prometheus原始的k8s_pod_sd怎么采集自定义指标
65 | - 怎样使用serviceMonitor方式接入
66 |
67 |
68 |
69 |
70 | # 如何利用阿里云构建国外的镜像
71 |
72 | 
73 | 
74 | 
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 | 
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 | - 
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 
71 | - 执行过程,可视化输出--> 流程图
72 | - 执行到哪一步了,每一步的执行结果
73 | - 上线 cd 是需要工单的
74 | - 资产管理
75 | - 堡垒机
76 | - webssh操作记录回放
77 | - 工单系统
78 | - 工单进度 
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 | 
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 | 
246 | - bytes_pool_get_on_empty qps 很高
247 | 
248 | - db read qps增长 80%
249 | 
250 | - node cpu kernel 暴涨
251 | 
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 | 
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 | 
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 | 
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|  |
56 | k8s资源指标 | [kube-stats-metrics](https://github.com/kubernetes/kube-state-metrics) (简称ksm) | 具体可以看
看pod状态如pod waiting状态的原因
数个数如:查看node pod按namespace分布情况 |通过coredns访问域名|  |
57 | k8s服务组件指标| 服务组件 metrics接口 | 查看apiserver 、scheduler、etc、coredns请求延迟等 | k8s_sd endpoint级别 |  |
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 |
--------------------------------------------------------------------------------