自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 一个云平台需要哪些东西?简单列了下

最近接了个活,可能需要写一套私有云的云管平台,简单梳理了下思路,我认为所谓的云管平台,即是将传统的数据/资产运维管理,转变为数据/资产的运营,所以主要操作还是以展示和反馈为主。

2024-01-24 16:46:02 404

原创 动手搓一个kubernetes管理平台(5)-WebSocket和TTY

所有的kubernetes管理平台,都会用到TTY的功能,既通过前端直接进入到容器内部,这是一个交互式的操作,或者说是一个流式操作,简单的http协议肯定不能满足这个需求,使用websocket就能很好的满足这个需求。既然决定了使用websocket作为前端进入容器的方式,那么可以看看后端是如何进入容器的。

2024-01-23 13:54:58 799

原创 动手搓一个kubernetes管理平台(4)-操作kubernetes

golang有一个好处是 操作kubernetes很方便,来看看基于clientset 如何进行封装

2024-01-19 14:44:12 1004

原创 动手搓一个kubernetes管理平台(3)-后端框架

后端框架的选择面比较大,由于不涉及复杂的调度/分布式管理等场景,所以后端选用一个标准的web server即可,比如gin, iris, beego等等,因为正好最近在看iris的一些项目,所以就选用了irsi+corba的框架进行后端开发 。

2024-01-19 13:18:52 1140

原创 动手搓一个kubernetes管理平台(2)-后端权限设计

对于集群的管理和平台的管理,权限很重要

2024-01-16 16:24:58 1062

原创 动手搓一个kubernetes管理平台(1)-需求和框架

用了rancher,用了kube-dashboard,要么觉得前者太重,要么觉得后者太轻,如何兼顾这2者?那就自己开发吧

2024-01-16 09:58:03 415

原创 一个冷门的需求,golang实现邮件回复生成邮件链

最近有一个 场景是基于某封邮件进行回复,这样可以在收件箱内形成一个完整的邮件链,比如进行倒计时的提醒,自动邮件回复等情况还挺实用的,日常对邮件的处理主要还是发邮件进行告警等,使用imap进行回复的场景还是挺少见的,所以简单记录一下。

2024-01-12 14:19:41 480

原创 Centos7升级到Rocky8

由于Centos7的EOL问题,业内有很多需求需要将Centos7进行升级,CloudLinux开展的一项支持 RHEL 衍生产品主要版本之间迁移的计划的项目-ELevate。Leapp 实用程序 (opens new window) 和一些支持从非 RHEL 操作系统迁移的补丁 (opens new window) 用于执行升级。该工具可以在升级前进行相关的环境检查,如rpm相关依赖,内核模块的差异,不同版本间的模块差异等,最大程度上的减少升级风险。

2023-06-06 17:23:43 1307

原创 etcd基础

日常使用golang开发,以及日常需要运维Kubernetes,所以一直不太习惯使用zookeeper或者nacos,反而使用etcd会多一点,有时候需要写一些分布式系统,使用etcd也可以很好的解决分布式系统一致性的问题。总的来说,我觉得etcd在以下3个领域的使用,很好用。

2023-03-22 13:27:53 448

原创 etcd问题发散-灾备恢复

相比方法二来说,方法一的步骤比较简单,但实际操作的时候,可能会存在做完快照的同时有用户数据写入的情况,从而再一次导致Revision不一致,此外,之前提到奇数节点一旦发生故障,会将集群变成偶数节点,从而在短期内产生脑裂的风险,所以在发现故障后,要赶快进行修复。算是比较粗暴的修复方法,就是将当前集群的问题member 从集群内剔除,然后删除节点信息,然后将该节点重新加入到集群,依靠etcd 自身的同步机制,将数据同步。方式1的方法需要重新新增节点,如果存在数据量较大,可以采用备份恢复的方式。

2023-03-22 11:03:55 1066 2

原创 cloud-init学习笔记

现在无论是公有云还是私有云,虚拟机还是裸金属,在交付过程中或多或少总有很多定制化的需求,比如密码定制,磁盘挂载,agent启动等等。有些场景可以将定制化的需求放在镜像内,但对于一些业务种类,规模较多的场景来说,频繁更新镜像并不是一个好事情,cloud-init 的方式就会比较合理,通过启动时候注入的方式,完成了主机的初始化,且就目前来说,cloud-init已经成为了云主机初始化的一个行业标准,并几乎适用于所有主流的Linux发行版。

2023-03-07 10:14:04 1180

原创 B-Tree和B+Tree

为什么innodb以及monggo等会喜欢使用B+Tree的数据结构进行数据存储呢?

2023-03-02 08:35:49 126

原创 如何在手机端抓https的报文

背景魔都啥情况也算众所周知了,每天5点多起床加购物车,抢菜,失败的循环已经持续了2个月了,作为一个IT从业者,只能想办法从代码层面来解决抢菜难的问题了。目前通过代码抢菜的方式主要分为2种,第一种是测试们都很熟悉的,利用手机自动化测试的方式,进行自动抢菜,说白了就是通过代码模拟你在手机端按键,可供选择的框架有Appium和Calabash或AthRun等,主要因为这几个对IOS和Android都支持比较好。该方式也挺方便,且安全,因为对于抢菜平台来说,你最多也就是个筋膜枪选手,而且是个,但性能相对会差一点

2022-05-23 16:12:03 626

原创 Kubernetes开发(7)-实现一个简单的ingress- controller

今天来撸一个简单的ingress-controller, 用于了解ingress-controller的实现机制。完整的代码在 simple-ingress-controller基本逻辑ingress说的简单点就是url 和 service的对应关系,相当于nginx的upstream,而ingress-controller就是用来管理这些“upstream”的,可以理解为是个动态的反向代理。基于“动态反向代理”这个概念,实现一个简单的ingress-controller需要2部分,即 动态 + 反

2022-05-20 16:10:13 442

原创 故障发散-从一个Nginx502问题来复习一下SNI

现象:某日某服务通过代理访问某公网地址:xxx-test.hhfx.cn,出现502 的情况,但直接访问该网站可以正常完成请求,查看502报错时间段的日志,出现了SSL_do_handshake() failed (SSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv1 alert handshake failure的报错。分析目前内网服务调用公网接口,使用的是Nginx正向代理的方式进行的,且默认使用4层代理,仅做TCP层面的端口转

2022-05-19 10:38:12 605

原创 Kubernetes开发(6)-MutatingAdmissionWebhook练手

之前写了一个简单的webhook 的tls server,并且写了一个简单的validate的api 用于实现资源的拦截。之前有提到webhook有两类,第二类就是mutatingadmissionwebhook,即对资源进行修改,仔细想想不会太意外,比如istio本质上不就是mutatingadmissionwebhook么,在启动的时候直接sidecar方式插入一个container,然后通过该container进行各类服务收集/治理,那练手的话可以自己插入一个redis 容器,模拟istio的side

2021-06-01 15:19:13 1151

原创 Kubernetes开发(5)-validateadmission练手

补充好基础知识后,上手实践才是最快的学习方法,所以先写一个validateadmission练练手。模拟一个生产需求,假设生产环境所有的deployment不允许单点,即副本数量不能少于2,如果少于2则不允许创建,且多个Kubernetes集群都有类似需求,那么这个场景用webhook实现就非常简单。先上一下自己写的demo地址webhook demo,可以对照查看思路之前有提过webhook的调用逻辑,结合当前场景,大致上是以下几个步骤:创建一个tls 的webserver, 做好路由,路由绑定

2021-06-01 15:18:28 558 3

原创 Kubernetes开发(4)-webhook 实现拦截请求

什么是webhookKubernetes 通过rbac进行权限控制,实现了哪些account对哪些资源具有哪些权限的控制,但它并不是万能的, 因为rbac控制的操作权限类型是有限的,需要再进行一些细化的权限管控就无从下手了,比如需要限制一些controller只能从制定的harbor进行image的下载,比如需要限制一些controller只能使用指定范围的端口号等,所幸Kubernetes在各个方面都可以进行一些自定义的开发,而webhook就是用来实现类似需求的。webhook官网介绍先看下官网的

2021-06-01 15:17:21 1866

原创 Kubernetes开发(3)-如何感知资源的实时变化

ClientSet的基本使用日常运维一般使用kubectl进行资源的查看,创建,销毁等,对接一些自动化运维平台的话可能需要通过一些其他方法,k8s官方提供的方式就是通过clientset进行操作,举个Goclient的例子, 当然其他语言也有类似的sdk封装,为了贴合源码,主要还是学习go的:package mainimport ( "flag" "fmt" "os" "path/filepath" "context" metav1 "k8s.io/apimachinery/pkg/

2021-05-14 17:26:41 718 4

原创 Kubernetes开发(2)—API 资源对象的串联过程

声明式API 与资源对象一般我们在k8s里声明一个新的资源对象,一般会先写一个声明式的yml, 里面对该资源进行描述/声明,最后apply/create一下进行资源的创建。apiVersion: batch/v1kind: Jobmetadata: name: demo namespace: default.......比如上面那个资源文件,就包含了资源的几个基本要素:资源类型(Resource): jobs(一般是kind的小写复数形式)资源组(Group):这里的batch就

2021-05-14 17:26:05 251

原创 Kubernetes开发(1)—环境以及代码目录结构

Big Picture环境Kubernetes 版本:v 1.19.7golang 版本:1.16.2(因为m1,不得不使用如此高版本的go…)目录结构.├── BUILD.bazel -> build/root/BUILD.root├── CHANGELOG├── CHANGELOG.md -> CHANGELOG/README.md├── CONTRIBUTING.md├── LICENSE├── LICENSES├── Makefile -> build/

2021-05-14 17:25:07 430

原创 ansible开发(3)

插件自定义开发插件的执行优先级是高于模块的,且和模块的使用有很大的区别和模块使用不同,插件是在ansible 服务器上执行的由于是在ansible 服务器上执行的,所以需要遵循ansible 和 本地python的版本做匹配,且开发语言只能是python使用场景除Paramiko, SSH, Local, Winrm连接方式外,希望Ansible基于新的通信方式与远程主机交互,比如需要支持SDN的一些协议,比如netconf等。基于Connection类型插件进行编写,在配置文件/a

2021-05-08 15:51:22 328 2

原创 ansible开发(2)

模块自定义开发ansible的模块非常多,官方/社区提供的模块数量非常多,大多数都可以满足需求,但有时候需要满足公司业务的一些特殊需求,则需要自己对模块的开发。ansible module的原理根据ansible 搜索路径找到inventory 以及对应的模块路径加载模块文件ansible 将模块加载到内存中,并同步生成对应的临时py文件(python脚本), 并将文件传到目标服务器(基于ssh),期间会打开3次ssh 链接,分别是传脚本-传文件-赋权限执行并返回结果删除临时py文件

2021-05-08 15:50:34 292 2

原创 ansible开发(1)

Big Pictureansible 的用途和使用场景就不再赘述了,日常使用中难免会遇到一些定制化需求,比如对接自动化操作平台需要将ansible api化,对接一些其他平台/网络设备/存储设备等需要自己定制模块进行自动化运维等,所以ansible的二次开发比较常见。开发类别ansible 开发主要分为4大类:api的调用&&重封装modules的开发plugin的开发源码的修改api的调用&&重封装ansible 一般使用都是基于命令行的方式进行

2021-05-08 15:49:50 350

原创 K8S水平伸缩-HPA

HPA(Horizontal Pod Autoscaler)K8S的水平扩缩容其实也是由一个独立的控制器管理的, 也就是HPA。API 细节HPA 属于 autoscaling API 组的资源组kubectl api-versions | grep autoscalautoscaling/v1autoscaling/v2beta1autoscaling/v2beta2autoscaling/v1:只支持基于CPU指标的缩放。autoscaling/v2beta1:支持Reso

2021-04-26 11:27:34 385

原创 Gunicorn基本使用

之前写代码需要启个nginx反向代理uwsgi, 很麻烦,后面干脆直接通过eventlet的monkeypath对http做协程处理,再之后考虑到易用性,换成了gunicorn.Big PictureGunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点配置文件模版#监听本机的5000端口bind='127.0.0.1:5000'#开启4个进程workers=4#服务器中

2021-03-29 14:50:59 426

原创 故障发散-vm.min_free_kbytes

之前有次DBA 新来了个小朋友,申请了30台VM 进行部署,没多久和我说机器无法登录了,排查后发现机器无脑重启,盲猜一定改了一些内核参数(公司DBA的一个坏习惯,老是喜欢百度一下直接改,却从不关心为啥这么改),DBA 支支吾吾说改了vm.min_free_kbytes, 数字大到可怕,原来他以为单位是字节,但其实是kb,我说你知道这个参数的意义以及后果么,小朋友支支吾吾,只能感叹一知半解多可怕也多害人,最后只能救援模式慢慢改回来了。vm.min_free_kbytes即强制Linux 系统最低保留多少空

2021-03-16 17:01:24 599

原创 故障发散-Recv-Q阻塞

之前有个开发遇到个生产问题,开发发现有时候CS之间的心跳直接丢了,查看日志发现客户端一直没收到心跳报文,但服务端其实已经把报文发了,觉得很奇怪,TCP 是可靠链接,不可能丢了吧,最终是发现了netstat 里的recv-q 有积压导致的,问题虽然解决了,但还是需要复盘一下,看看细节。先看下啥是Recv-Q 和 Send-QRecv-QEstablished: The count of bytes not copied by the user program connected to this soc

2021-03-16 17:00:15 4195

原创 腾讯蓝鲸笔试题

之前有次接到了腾讯小姐姐的电话,问我有没有兴趣参加蓝鲸devops的面试,在寒风中进行了45分钟的电话面之后,让我周末把笔试题做了,第一次笔试竟然在家做?有点意思啊,然后周末因为一些个人家庭原因思考了下没有参与后续的面试,但这道腾讯笔试题却花了一个下午简单做了下。题目设计并实现一个简单的存储资源分配系统实现一个服务,该服务可以接收用户端请求,为用户申请 MySQL 与 Redis 两类资源。分配给用户的资源实例必须是真实、可以连接使用的。用户可以通过接口查看分配给自己的资源配置信息。- 服务以 H.

2021-02-22 23:10:55 517 1

原创 Kafka运维&&开发扫盲(1)

开发的时候经常使用kafka来解耦自己的代码,运维中的kafka 大多数也是稳定就不管了,大致记录一下一些基本概念和常见的优化方案,以及代码的常规使用方式。概念扫盲基本体系架构: producer + broker + consumer + zk集群producer: 生产者, 用于生产消息Broker: 服务代理,可以理解为kafka集群的服务器,通常一台机器部署一个Kafka实例consumer: 消费者, 用于消费消息consumer group: 多个consumer组成一个con.

2021-02-05 11:41:09 252

原创 Linux Signal(信号)

Kill 与信号进程间的通信可以通过信号进行通信,基于这个方式,所以kill说白了就是kill 作为一个进程,对另外一个进程发送了一个signal的信号,程序捕获这个信号,进行操作。信号的作用信号的常规使用是为了程序的优雅退出,重载,热更新等等,为了实现这个目的,程序会在代码里进行信号的监听,常规的做法就是在主程序里写个(while listen…)Linux 本身会有很多信号,可以kill -l 看下默认支持得信号。信号得种类大家习惯使用KILL -9 杀进程,不知道有没有遇到过没有杀掉进程的情

2021-02-02 15:33:29 719

原创 golang实现热更新的常规方式

热更新去年写了一个Agent的程序,用于收集生产服务器的一些数据,以及对应的一些自动化操作等, 写完之后经常要修修改改加一些新功能, 产线服务器数量就很多, 导致了每次更新都是个大动作,目前的做法是通过puppet管理,新版本就往puppet上丢,等他自动重启即可,由此联想到了老东家游戏服务的热加载,所以看了一下golang的热加载实现。基本流程第一种方式, 文件主体更新golang服务进程运行时监听USR2信号进程收到USR2信号后, 下载新版本的客户端到本地fork子进程(启动新版本服

2021-02-02 09:57:15 8753

原创 Linux运维面试题(1)

Big Picture年底了,面试/被面试的需求比较多,整理一下传统运维的基础面试题,每次10题,随缘更新介绍下HTTP请求/响应报文结构一个HTTP请求报文由四个部分组成:请求行,请求头部,空行,请求数据请求行 GET /data/info.html HTTP/1.1(请求方法, URL, HTTP版本)请求头 大多数服务器在请求中都会在头部带上游览器信息等空行 空行标识请求头部的结束请求数据:请求主体,在GET方法中这里一般会是空一个HTTP响应报文由三个部分组成: 状态行,

2021-01-28 11:30:37 338

原创 调整CPU频率

cpu性能模式一台物理服务器使用时候,如果发现明显的延迟,就连ping都比平时慢很多,那么怀疑点可以放在cpu的性能模式上,或者说,可以关注一下cpufreq,即cpu的使用频率。一台服务器出厂之后,bios如果没有初始化,可能五花八门的cpu频率设置,服务上生产后,可能就会发生一些意想不到的问题。不过好在可以直接在线修改。cpufreq的五种模式五种模式本质上表示的是对cpu频率的五种策略userspace 让用户态的程序可以通过接口动态调整cpufreqconservative 动态调整,l

2021-01-28 11:26:32 2688

原创 calico源码分析-ipam(2)

Big Picturecalico 释放IP的逻辑相比分配IP的逻辑要简单很多,老样子,先画个图:然后看代码,从cmdDel开始看:func cmdDel(args *skel.CmdArgs) error { ...... handleID := utils.GetHandleID(conf.Name, args.ContainerID, epIDs.WEPName) ...... if err := calicoClient.IPAM().ReleaseByHandle(

2021-01-28 11:20:37 939

原创 calico源码分析-ipam(1)

背景生产要把网络插件换成calico,对于IP的分配方法有点存疑,花了2天看下了calico-ipam的源码,学习下calico的IP分配逻辑,对比生产环境,看看有没有明显的坑。calico比较突出的一点是可以指定单个pod的ip,也可以指定一个RS的网段,但实际用的比较少,首先不可能单个pod部署,一个rs指定一个ippool的意义并不是很大,所以主要看下自动分配的代码逻辑,代码其实不是很多,但几个概念挺绕的,根据目前的了解,简单画了一个流程图:IPAM的入口还是老三样,分IP 从cmdAdd开始

2021-01-27 14:47:44 2081

原创 golang 常见面试基础(2)

map的原理字典[map]:初始化: var amap map[string]string, 如果需要赋值,需要先make 一下testMap := make(map[string]string)Go中的字典是引用类型,但Golang中是没有引用传递的,均为值传递。这意味着传递的是数据的拷贝,所以map 也存在线程安全的问题底层结构是hmap,hmap 的结构体里有一个buckets,他是一个指针,指向了一个bucket的结构体,bucket可以看错一个链表,bucket 里存放着k&a.

2021-01-22 17:21:37 223

原创 golang 常见面试基础(1)

Big Picture开始记录下同事讨论/面试/论坛上有时候让我感到自信而又模糊,基础而又重要的一些问题。go语言切片和数组区别,go切片的原理:数组[array]:初始化后长度是固定的,无法修改其长度初始化: array := [5]int{1,2,3,4,5}/ array := […]int{1,2,3,4,5}Go中的数组是值类型切片[slices]: s :=[]int{1,2,3} / s := make([]int,len,cap)长度可变的"数组",可以

2021-01-20 18:08:40 342

原创 从iptables 到 nf_conntrack(1)

Big Picture1公司的监控服务器开启ipatbles 以后,经常会报kernel: nf_conntrack: nf_conntrack: table full, dropping packet的内核报错,原因是conntrack 表满了,常规的做法是以下几种:sysctl –w net.netfilter.nf_conntrack_max = 2097152 #状态跟踪表的最大行数的设定sysctl -w net.netfilter.nf_conntrack_buckets = 104857

2021-01-19 16:58:26 530 1

原创 tmux分屏操作

产线如果需要批量操作,有时候需要一起来一起观察日志,比如同时tail日志,同时开启top等,这样用ansible就不太合适了,以前用screen 手动一个个开窗口,或者借助xshell自带的一些功能进行处理,之前一个同事推荐了tmux,网上教程一大堆,其实大致逻辑就是新建session->新建window->划分pane, 其中比较好的一篇教程是这个:[https://www.w3cschool.cn/tmux/tji9dozt.html],但实际使用中,老是记命令其实也记不全,所以根据需求..

2021-01-18 10:11:02 873

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除