golang
文章平均质量分 62
nangonghen
这个作者很懒,什么都没留下…
展开
-
kube-apiserver鉴权源码简析
kube-apiserver的鉴权其实so easy原创 2022-11-19 23:41:08 · 508 阅读 · 0 评论 -
go error
github.com/pkg/errors给了你对error进行套娃的能力原创 2022-10-16 00:03:19 · 174 阅读 · 0 评论 -
golang接口变量和nil
golang接口和nil的比较原创 2022-10-07 12:37:53 · 237 阅读 · 0 评论 -
go text/template在渲染时不转义html特殊字符
解决方案:复写内置的解析方法,它的key是"html"。tmpl, err = tmpl.New("").Funcs(template.FuncMap{ "html": func(s string) string { return s },}.Parse("example.tmpl")var buf bytes.Buffertmpl.Execute(&buf, data)result := buf.String()...原创 2021-12-01 20:03:03 · 1493 阅读 · 0 评论 -
kubelet liveness probe源码简析
1 概述:1.1 环境版本信息如下:a、操作系统: centos 7.6,amd64b、kubernetes版本:v1.15.4c、服务器docker版本:v18.09.22 liveness探针功能:存活性探针用于探测目标容器是否正常运行,手段有http get请求、tcp请求以及exec命令。探测失败,则kubelet会调用停止容器的API(docker stop)来结束目标容器。3 源码简析:探针的实现是定时器,定时器会定期执行预先设置好的探测动作,探测结果存放在kubelet的原创 2021-11-21 15:18:12 · 1291 阅读 · 0 评论 -
调试kubernetes dashboard v2.3.1
1 概述1.1 环境软件版本信息如下:a、操作系统: centos 7.6,amd64b、kubernetes dashboard版本: v2.3.1c、kubernetes版本: v1.15.4d、服务器docker版本:v18.09.2e、nodejs版本: v14.16.1f、npm版本:6.14.12g、go版本: 1.16.62 安装依赖2.1 安装go环境略,请参考百度。2.2 安装docker和kubernetes环境略,请参考百度。2.3 安装node原创 2021-10-25 23:47:41 · 482 阅读 · 0 评论 -
[ docker-ce源码分析系列 ]docker exec残留sh进程的原因
1 概述:1.1 环境版本信息如下:a、操作系统: centos 7.6,amd64b、服务器docker版本:v18.09.2c、docker的存储驱动: overlay22 现象:执行 [ docker exec -it 容器ID sh ]命令,用户可在容器中执行shell指令进行各种操作,此时用户直接kill掉docker exec命令,或者直接关闭xshell,则该sh进程依然残留在容器中,这种sh进程会消耗虚拟终端的数量,本质上是消耗文件描述符。如果用户退出时不是通过执行exit指原创 2021-10-10 22:47:02 · 692 阅读 · 0 评论 -
[ docker-ce源码分析系列 ]docker build源码简析
1 概述:1.1 环境版本信息如下:a、操作系统: centos 7.6,amd64b、服务器docker版本:v18.09.2c、docker的存储驱动: overlay22 源码简析:用户执行docker build命令,本篇文章简要分析docker daemon构建镜像的过程。2.1 服务端注册路由initRoutes()r.postBuild就是处理docker build请求的方法。func (r *buildRouter) initRoutes() { r.routes原创 2021-09-20 15:53:41 · 691 阅读 · 0 评论 -
[ docker-ce源码分析系列 ]创建(create)容器简析
1 概述:1.1 环境版本信息如下:a、操作系统: centos 7.6,amd64b、服务器docker版本:v18.09.22 源码简析:用户docker run,client至多会向docker daemon发起三次远程调用,分别是创建(拉取)镜像、创建容器、启动容器。本篇文章分析创建容器这个远程调用。2.1 注册路由initRoutes()func (r *containerRouter) initRoutes() { r.routes = []router.Route{原创 2021-03-28 01:57:10 · 812 阅读 · 2 评论 -
golang代码执行kubectl apply
1 概述:1.1 环境版本信息如下:a、操作系统:centos 7.6,amd64b、kubernetes版本:v1.15.0c、docker版本:v1.18.06d、golang版本: v1.132 代码:指定多个目录或文件,效果等同于kubectl apply。package mainimport ( "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/printers" cliresourc原创 2021-03-26 00:08:02 · 740 阅读 · 0 评论 -
源码编译docker-ce v18.09.2(简单易懂100%成功)
1 概述:1.1 环境版本信息如下:a、操作系统: centos 7.6,amd64b、服务器docker版本: v18.06.0c、服务器git版本: 1.8.3.1d、目标编译的docker版本: v18.09.22 前置准备2.1 宿主机安装docker编译环境是一个容器,因此需要在宿主机安装容器引擎,在后续的步骤中运行出一个容器来编译目标软件docker-ce v18.09.2。yum install yum-utils -yyum-config-manager --add-原创 2021-03-09 22:12:32 · 1890 阅读 · 1 评论 -
源码编译rancher v2.5.6和debug in kubernetes
1 概述:1.1 环境版本信息如下:a、操作系统:centos 7.6,amd64b、kubernetes版本:v1.18.16c、docker版本:v1.18.06d、rancher版本:v2.5.6e、golang版本: v1.14f、goland版本: 2020.32 安装go环境和docker:省略。3 编译和构建镜像:3.1 在裸机环境执行编译构建命令mkdir -p /opt/ && cd /opt/# 下载rancher源码git clone原创 2021-03-05 23:39:48 · 942 阅读 · 3 评论 -
kubernetes configmap热更新源码简析
1 概述:1.1 环境版本信息如下:a、操作系统:centos 7.6c、kubernetes版本:v1.15.01.2 configmap热更新原理概述configmap(secret的热更新也是一个原理)是kubernetes支持的卷的一种,底层原理是kubelet根据configmap中的内容在宿主机上写成若干文件(目录默认是/var/lib/kubelet/pods/<pod的UUI>/volumes/kubernetes.io~configmap/<卷名>),原创 2020-12-14 02:10:47 · 1356 阅读 · 0 评论 -
[ thanos源码分析系列 ]thanos sidecar组件源码简析
1 概述:1.1 源码环境版本信息如下:a、thanos组件版本:v0.16.01.2 Thanos Sidecar的作用Thanos Query组件和prometheus实例绑定在一起,三大作用:1)作为访问代理,对客户端暴露grpc接口,业务逻辑是访问其绑定的prometheus实例的http接口,从而获取metrics和rule数据,最终返回给客户端。2)如果开启对象存储功能,会将promethues tsdb目录下的所有block目录上传至指定的对象存储系统中。3)监听promet原创 2020-12-06 11:43:04 · 1321 阅读 · 0 评论 -
kubernetes exec源码简析
1 概述:1.1 环境版本信息如下:a、操作系统:centos 7.6c、kubernetes版本:v1.15.01.2 exec原理概述为进入目标pod的目标容器中执行命令(挂载标准输入和输出、标准错误的情景),kubectl exec访问kube-apiserver的connect接口(中间过程是通过http协议来握手,之后升级为spdy协议),kube-apiserver把请求转发至对应节点的kubelet进程,而kubelet进程此时是一个反向代理,再把请求转发至cri shim程序(原创 2020-12-01 01:38:15 · 1099 阅读 · 0 评论 -
[ thanos源码分析系列 ]thanos query组件源码简析
1 概述:1.1 源码环境版本信息如下:a、thanos组件版本:v0.16.01.2 Thanos Query的作用Thanos Query组件是http服务器 + grpc服务器,它的数据源是位于下游的已发现的实现STORE API的组件(例如Thanos Sidecar组件、Thanos Store组件、Thanos Ruler组件),同时实现了Prometheus官方的HTTP API。Thanos Query组件从下游处获得数据后,能进行合并、去重等操作,最后将结果返回给外部的客户端。原创 2020-11-24 00:44:41 · 2028 阅读 · 0 评论 -
kubelet驱逐机制的源码分析
1 概述:1.1 源码环境版本信息如下:a、kubernetes集群:v1.15.01.2 维持节点稳定的两道防线对于linux操作系统,CPU时间片、内存、磁盘IO、PID等都是系统资源。系统资源的一种分类:a、可压缩资源(CPU)b、不可压缩资源(内存、磁盘容量和inode、PID)kubelet作为节点代理,自然而然需要一定机制保证服务器资源不会被耗尽。当可压缩资源不够时,Pod(容器或进程)会饥饿,但不会被操作系统和kubelet进行强制退出。当不可压缩资源(例如内存)不够用时,原创 2020-11-15 00:04:53 · 832 阅读 · 0 评论 -
kubeadm reset删除用户通过docker run运行的容器
1 概述:1.1 环境版本信息如下:a、kubernetes集群:v1.18.51.2 现象执行kubeadm reset -f命令后,由我docker run命令运行的名称为xxx_k8s_registry的容器也被删除。我一直以为kubeadm reset命令是删除以 “k8s_” 为前缀的容器,因此我手工启动的容器是特意增加了xxx前缀作为区分。1.3 复现2 kubeadm源码:kubeadm reset命令的主逻辑方法是runCleanupNode(…)func runCl原创 2020-11-13 14:14:08 · 1220 阅读 · 0 评论 -
kubernetes删除pod的流程的源码简析
1 概述:1.1 代码环境版本信息如下:a、kubernetes集群:v1.15.41.2 Pod删除的过程简述当用户执行kubectl delete pod命令时(实际上是带grace-period=30s),实际上是访问kube-apiserver的DELETE接口(此时业务逻辑做的只是更新Pod对象的元信息(DeletionTimestamp字段和DeletionGracePeriodSeconds字段),并没有在etcd中删除记录),此时kubectl命令的执行会阻塞并显示正在删除pod原创 2020-10-27 11:10:40 · 2728 阅读 · 0 评论 -
kubelet垃圾(退出的容器和未使用的镜像)回收源码分析
1 概述:1.1 代码环境版本信息如下:a、kubernetes集群:v1.15.01.2 垃圾回收的简述为减少节点的资源消耗,kubelet组件内部运行着两个协程,一个协程每隔1分钟(时间周期不可修改,写死在代码)清理当前节点上状态为退出的容器,一个协程每隔5分钟(时间周期不可修改,写死在代码)清理当前节点上没被使用的镜像。2 影响垃圾回收的参数:2.1 用户不能配置的影响垃圾回收的参数ContainerGCPeriod,固定为1分钟,此值是常量,定时任务方法在调用时是直接使用此常量。原创 2020-10-25 12:21:16 · 771 阅读 · 0 评论 -
kubernetes部署thanos ruler的发送重复告警的一个隐秘的坑
1 概述:1.1 环境thanos ruler和alertmanager都部署在kubernetes集群,版本信息如下:a、kubernetes集群:v1.18.5b、thanos ruler: v0.11.0c、alertmanager: v0.20.0thanos ruler的yaml文件简介:apiVersion: apps/v1kind: StatefulSetmetadata: labels: app.kubernetes.io/name: thanos-rule原创 2020-10-20 18:28:03 · 2355 阅读 · 2 评论 -
goland IDE和delve调试位于kubernetes集群中的go程序
1 概述:在本地电脑的ide中调试远程go程序,IDE为goland-2019.3,go程序暴露的http接口为GET /ip,go程序是以pod的形式运行在kubernetes集群中。当客户端请求到达目标go程序时,本地的IDE断点生效。2 delve:2.1简介delve是一款go程序调式工具(git clone https://github.com/go-delve/delve.git),是一个简单易用的二进制程序,可用来启动目标go程序,进入dlv环境后可通过各种内置命令进行调试目标go程原创 2020-10-18 22:07:56 · 2042 阅读 · 0 评论 -
扩展Prometheus的解决方案thanos的简介和几个月使用心得
1 云原生监控的事实标准Promethues:监控系统的历史悠久,是一个颇为成熟的领域,而Prometheus作为新生代的开源监控系统,慢慢成为了云原生体系的监控事实标准,也证明了其设计得到业界认可。Prometheus启发于Google公司的borgmon监控系统,由google前员工在2012年作为社区开源项目创建和开发,并于2015年正式发布。2016年,Prometheus正式加入Cloud Native Computing Foundation,成为仅次于Kubernetes的第二把交椅的项目。原创 2020-09-15 14:13:58 · 7901 阅读 · 2 评论 -
golang gin框架进行分块传输
1)概述:分块传输这是一种"化整为零"或"分治"的思路,在 HTTP 协议里的体现就是"chunked"分块传输编码。在http响应报文中用头字段“Transfer-Encoding: chunked”,表示响应中的body不是一次性发送完毕,而是分成了许多的块(chunk)逐个发送,直到发送完毕。2)分块传输的编码规则1)每个分块包含两个部分,<长度头>和<数据块>;2)<长度头>是以 CRLF(回车换行,即\r\n)结尾的一行明文,用 16 进制数字表示长度;原创 2020-07-31 10:39:10 · 3851 阅读 · 0 评论