自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Qinng的博客

航行在云原生的大海里

  • 博客(62)
  • 资源 (2)
  • 收藏
  • 关注

原创 Golang实现一个事务型内存数据库

MossDB的实现细节已经分析完成,支持了事务、持久化、Watch与过期删除等特性,后续可能会支持HTTP API、存储快照等功能。

2023-03-03 09:28:54 961 1

原创 Rust初探: 实现一个Ping

这两年Rust火的一塌糊涂,甚至都烧到了前端,再不学习怕是要落伍了。最近翻了翻文档,写了个简单的Ping应用练练手,被所有权折腾的够呛,相比起Golang上手难度大很多,现将开发中的一些问题总结如下。

2022-11-29 16:45:52 710 1

原创 如何实现零宕机的配置热加载

本文主要总结实现配置热更新的多种方式,手动更新可以通过Socket、信号等进程间通信手段来通知服务,自动更新可以通过inotify来感知配置变化,在分布式环境中就需要配合分布式配置中心来进行热更新。

2022-09-30 16:12:37 750

原创 Golang优雅之道

本文总结了Golang的一些有趣的编程模式,例如链式调用、可选配置、并发控制等,通过这些技巧或者手段,可以提高编码的质量,所有代码见gocorex。

2022-09-13 14:56:17 991 1

原创 Golang分布式应用之ZooKeeper

本文分析了ZooKeeper在分布式锁、服务发现等场景上的实现方式,并对比了与etcd的差异点。

2022-08-10 11:14:37 1401

原创 Golang分布式应用之etcd

etcd是一个可靠的分布式KV存储数据库,由CoreOS开源。Kuberentes使用etcd作为其存储引擎,随着云原生的火热,etcd也逐渐广泛应用起来。本文结合Golang来编写对应的中间件。

2022-08-09 09:26:57 769

原创 Golang分布式应用之定时任务

本文主要总结了定时任务的两种实现方式,最小堆与时间轮,并分析其核心实现逻辑。

2022-07-29 11:27:26 1719

原创 Golang分布式应用之Redis

Redis作是一个高性能的内存数据库,常被应用于分布式系统中,除了作为分布式缓存或简单的内存数据库还有一些特殊的应用场景,本文结合Golang来编写对应的中间件。

2022-07-25 20:12:28 3796

原创 Golang访问控制框架:Open Policy Agent vs Casbin

大型项目中基本都包含有复杂的访问控制策略,特别是在一些多租户场景中,例如Kubernetes中就支持RBAC,ABAC等多种授权类型。在Golang中目前比较热门的访问控制框架有Open Policy Agent与Casbin,本文主要分析其异同。......

2022-06-13 09:43:55 1300

原创 Kubernetes中的Golang设计模式

随着Kubernetes成为容器编排领域的事实标准,Golang在云原生方面应用的也越来越多。今天我们跟随K8s的脚步,学习下在K8s中使用哪些经典的设计模式。创建型模式创建型模式顾名思义提供了对象的创建机制,封装了内部的复杂性,提高代码复用和灵活性。包括:单例模式工厂模式建造者模式原型模式单例模式单例模式用来保证一个类只有一个实例,并提供调用它的一个全局访问点。单例模式是设计模式中最简单,使用最广的一个,通常用来创建一个共享的实例,比如数据库连接池、线程池等。单例模式分为懒汉式(使用

2022-04-18 11:27:34 710 2

原创 手写一个Kubernetes CNI网络插件

CNI(Container Network Interface) 即容器的网络API接口,在Kubernetes中通过CNI来扩展网络功能,今天我们从零开始实现一个自己的CNI网络插件。本文所有代码见:https://github.com/qingwave/mycniCNI简介Kubernetes提供了很多扩展点,通过CNI网络插件可以支持不同的网络设施,大大提供了系统的灵活性,目前也已成为容器网络领域的标准。Kubernetes与CNI的交互逻辑如下:Kubelet监听到Pod调度到当前

2022-04-06 14:28:20 1670 1

原创 Golang Channel的一些妙用

Golang中通过我们使用Channel来传递信息、信号,经典的如生产者消费者、退出信号等, 那么除此之外Channel还有哪些不常见的用法。

2022-02-24 10:23:58 393

原创 Kubernetes调试利器Nsenter

在k8s云环境中,我们需要在容器内抓包进行Debug, 但通常大多容器都没有安装tcpdump以及其他网络工具;在托管k8s中我们想登录node,不是没权限就是步骤太麻烦。本文的主角nsenter正是很擅长解决这些问题,nsenter可以进入指定namespace的工具,一般用来在容器环境中进行调试。调试容器网络通过nsenter可以轻松在宿主机进入容器的网络命令空间,命令如下:# 设置containeridcontainerid=xxx # 获取容器主进程pid=$(docker inspe

2022-01-27 09:52:40 1292

原创 K8S中为什么需要Unstructured对象

K8S中为什么需要Unstructured对象,通过源码分析原因

2022-01-27 09:47:17 1764

原创 Golang+Vue构建全功能Web应用

Go+Vue实现前后端管理平台,支持Gin、Postgres、Redis、ELement等

2022-01-24 14:47:42 10549 12

原创 深入了解kubebuilder

前文快速实现一个Kubernetes Operator介绍了kubebuilder工具,快速实现了一个Operator。今天我们深入水下,探寻kubebuilder究竟是如何工作的。普通开发流程如果不借助任何Operator脚手架,我们是如何实现Operator的?大体分为一下几步:CRD定义Controller开发,编写逻辑测试部署API定义首先通过k8s.io/code-generator项目生成API相关代码,定义相关字段。Controller实现实现Controller以官方提

2021-09-13 17:11:57 1485

原创 快速实现一个Kubernetes Operator

Kubernetes提供了众多的扩展功能,比如CRD、CRI、CSI等等,强大的扩展功能让k8s迅速占领市场。Operator模式可以实现CRD并管理自定义资源的生命周期,本文基于kubebuilder快速实现一个Operator,示例源码见mygame。Kubebuilderkubebuilder是一个官方提供快速实现Operator的工具包,可快速生成k8s的CRD、Controller、Webhook,用户只需要实现业务逻辑。类似工具还有operader-sdk,目前正在与Kubebuilde

2021-08-15 10:30:28 2923

原创 优化Kubernetes横向扩缩HPA

Pod水平自动扩缩(Horizontal Pod Autoscaler, 简称HPA)可以基于 CPU/MEM 利用率自动扩缩Deployment、StatefulSet 中的 Pod 数量,同时也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。默认HPA可以满足一些简单场景,对于生产环境并不一定适合,本文主要分析HPA的不足与优化方式。HPA Resource类型不足默认HPA提供了Resource类型,通过CPU/MEM使用率指标(由metrics-server提供原始指标)来扩缩应用。使用

2021-04-02 14:54:04 2373

原创 Prometheus高可用自动分区方案

在Prometheus分区实践中我们介绍了使用集群联邦与远程存储来扩展Prometheus以及监控数据持久化,但之前的分区方案存在一定不足,如分区配置较难维护,全局Prometheus存在性能瓶颈等,本文通过Thanos+Kvass实现更优雅的Prometheus扩展方案。自动分区之前分区方案依赖Prometheus提供hashmod,通过在配置中指定hash对象与modules进行散列(md5),每个分片只抓取相同job命中的对象,例如我们可以通过对node散列从而对cadvisor、node-exp

2021-03-31 18:52:18 1129 2

原创 Golang自定义DNS Nameserver

某些情况下我们希望程序通过自定义Nameserver去查询域名,而不希望通过操作系统给定的Nameserver,本文介绍如何在Golang中实现自定义Nameserver。DNS解析过程Golang中一般通过net.Resolver的LookupHost(ctx context.Context, host string) (addrs []string, err error)去实现域名解析,解析过程如下:检查本地hosts文件是否存在解析记录,存在即返回解析地址不存在即根据resolv.conf中

2021-03-31 18:49:08 2346

原创 golang zk大量disconnected event

背景在容器平台上我们提供了zk做白名单功能,Pod启动时 sidecar会自动注册zk。昨天遇到zk server抖动,sidecar容器输出大量StateDisconnected事件,zk正常后仍无法恢复,由于大量日志造成sidecar容器 cpu占用过高,进而引发dockerdcpu占用过高,严重时影响dockerd正常调用。问题分析问题复现正常情况下,sidecar启动后会去注册zk:# docker logs -f 01a1a4a74785I0302 15:04:05.476463

2021-03-02 17:56:08 498

原创 优化Kubernetes集群内DNS

kubernetes集群内置的dns插件kubedns/coredns在高并发情况下可能遇到性能瓶颈,以下从配置与本地缓存方面说明如何减少dns查询失败率,提高性能。配置优化dnsPolicyk8s 默认的 dnsPolicy 是ClusterFirst,因为 ndots 和 serach domain 在访问外部 dns 会有额外的查询次数。/ # cat /etc/resolv.conf nameserver 10.254.0.2search default.svc.cluster.loca

2021-02-04 15:42:07 2053 3

原创 k8s中shell脚本启动如何传递信号

背景在k8s或docker中,有时候我们需要通过shell来启动程序,但是默认shell不会传递信号(sigterm)给子进程,当在pod终止时应用无法优雅退出,直到最大时间时间后强制退出(kill -9)。分析普通情况下,大多业务的启动命令如下command: ["binary", "-flags", ...]主进程做为1号进程会收到sigterm信号,优雅退出(需要程序捕获信号); 而通过脚本启动时,shell作为1号进程,不会显示传递信号给子进程,造成子进程无法优雅退出,直到最大退出时间后

2021-02-04 15:41:03 1397 2

原创 kubernetes apiserver限流方案

背景为了防止突发流量影响apiserver可用性,k8s支持多种限流配置,包括:MaxInFlightLimit,server级别整体限流Client限流EventRateLimit, 限制eventAPF,更细力度的限制配置MaxInFlightLimitMaxInFlightLimit限流,apiserver默认可设置最大并发量(集群级别,区分只读与修改操作),通过参数--max-requests-inflight和 --max-mutating-requests-inflight,

2020-11-11 14:24:35 3851

原创 Kubernetes中Sidecar生命周期管理

背景在多个容器的Pod中,通常业务容器需要依赖sidecar。启动时sidecar需要先启动,退出时sidecar需要在业务容器退出后再退出。k8s目前对于sidecar的生命周期比较有争议,见issue、sidecarcontainers。Kubernetes Pod 内有两种容器: 初始化容器(init container)和应用容器(app container)。其中初始化容器的执行先于应用容器,按顺序启动,执行成功启动下一个: if container := podContainerC

2020-09-21 14:29:35 3203

原创 开启shareProcessNamespace后容器异常

背景目前k8s不支持容器启动顺序,部分业务通过开启shareProcessNamespace监控某些进程状态。当开启共享pid后,有用户反馈某个容器主进程退出,但是容器并没有重启,执行exec会卡住,现象参考issue复现创建deploymentapiVersion: apps/v1kind: Deploymentmetadata: labels: app: nginx name: nginxspec: selector: matchLabels:

2020-08-03 23:18:55 1511

原创 kubernetes相关开源项目

cncfprojectsandbox阿里kruise: 各种自定义app,包括增强deployment/statefulset等kubernetes-cronhpa-controller: 定时扩缩kube-eventer: event收集gpushare-scheduler-extender: 共享GPUlog-pilot: docker日志收集工具腾讯tapp: 增强版deployment/statefulsetcron-hpa: 定时扩缩lb-controlling-

2020-07-14 14:24:47 426

原创 k8s中实现应用优雅升级

在k8s中通常用户通过ingress接入流量,转发到后端实例(ingress→ pod),在后端应用更新过程中,ingress是否能做到优雅升级,本文将通过分析升级流程与实验验证,说明在k8s中如何实现优化升级。Ingress原理用户创建ingress资源后,ingress-nginx通过service获取到对应的endpoint,监听到endpoint变化后将动态更新upstream。endpoint每次变化后会通过selector匹配的pod列表中ready的pod(不包括待删除的p..

2020-06-19 18:25:29 2834

原创 Ingress获取真实IP

一般情况下,经过ingress的请求会携带headerX-Real-IP,用户可根据header解析出真实访问IP。特殊情况,用户请求可能经过多个nginx才达到ingress, 通过上述方法得到的并不是用户的真实IP。request->nginx->…->ingress->backend方案1 use-forwarded-headersnginx-ingress官方的建议是开启use-forwarded-headers, 配置如下:kind: ConfigMapap

2020-06-05 15:12:28 6591

原创 Ingress Header Too Large

线上遇到多次由ingress header过大引起的请求失败, 可能返回502/400,解决方案如下。502 – too big header502错误一般是后端服务不可用,但这里是nginx-ingress返回的,在nginx-ingress可看到如下日志:upstream sent too big header while reading response header from upstream, client...需要在ingress配置如下参数apiVersion: extensions

2020-06-05 15:08:11 1481

原创 ingress-nginx性能测试

Ingress是目前Kubernetes集群流量接入的重要入口,了解其性能指标有助于用户选用合适的网络方案。测试方案通过wrk压测后端nginx服务,对比ingress-nginx, 原生nginx,以及直连后端性能的差异,如下图:方案1,经过ingress方案2,经过nginx方案3,直连ip硬件环境CPU: 2x Intel® Xeon® CPU E5-2620 v4 @ 2.10GHz, 32 coresNetwork: 10-GigabitMemory: 128 GB

2020-05-22 21:26:21 3684

原创 journald日志被打满设置

修改vim /etc/systemd/journald.confRateLimitInterval=30sRateLimitBurst=100000重启systemctl restart journald

2020-05-12 00:09:35 1111

原创 Linux中线程数限制总结

如果遇到Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread 或者fork failed,请检查以下内容:堆栈设置每个Java线程都消耗自己的堆栈内存。默认堆栈大小为1024k(= 1M)。您可以像这样减少堆栈大小java -Xss512k ...。如果堆栈太小,则无法启动JVM。并且要注意堆内存配置:(初始)-Xms和(最大)-Xmx。分配给堆的内存越多,堆栈可用的内存就越少

2020-05-12 00:06:20 1471

原创 Kubectl、Pod Phase和Container Status映射关系

注:以下状态为kubernetes-1.10的映射关系,较新版本有部分改动Pod Phase Kubectl Status Container Status 备注 Pending Pending None Pod没有到达Kubelet之前 Pending ImagePullBackOff Pod没有到达Kubelet之后,Image拉取镜像成功之前 CreateContainerConfigError ...

2020-05-11 23:42:17 2391 3

原创 ansible执行脚本常用命令

用法ansible all -i [hosts] -m [shell/script/ping] -f [num]-i host文件-m 模块,shell命令,script本地脚本, ping命令-f 并发数脚本执行如所有hosts中的节点执行脚本build.shansible all -i hosts -m script "build.sh"若只执行其中一个节点,可将all替换会hostname;顺序执行可添加-f 1执行shell命令ansible all -i hosts -

2020-05-11 23:38:07 5210

原创 查找文件描述符fd过多的进程

for fd in $(ls /proc | egrep [1-9]);do num=$(sudo ls /proc/$fd/fd|wc -l); if [ $num -gt 10000 ]; then echo "pid $fd $num"; fi; done

2020-05-11 23:23:43 856

原创 kubernetes关键组件debug

controller managerwget http://localhost:10252/debug/pprof/profilewget http://localhost:10252/debug/pprof/heapcurl http://127.0.0.1:10252/debug/pprof/goroutine?debug=1 >> debug1curl http://127.0.0.1:10252/debug/pprof/goroutine?debug=2 >> deb

2020-05-11 23:15:59 940

原创 openssl验证证书常用命令

输出x509证书信息openssl x509 -noout -text -in ca.pem结果如下Certificate: Data: Version: 3 (0x2) Serial Number: 5f:11:aa:b3:70:18:fd:89:b0:25:7a:9e:36:c5:e7:ce:33:5a:cc:b7 Signature Algorithm: sha256WithRSAEncryption Iss

2020-05-11 23:03:34 8603

原创 kube-apiserver启动流程分析

kube-apiserver 共由 3 个组件构成(Aggregator. KubeAPIServer. APIExtensionServer),这些组件依次通过 Delegation 处理请求:Aggregator:暴露的功能类似于一个七层负载均衡,将来自用户的请求拦截转发给其他服务器,并且负责整个 APIServer 的 Discovery 功能;也负责处理ApiService,注册对应的...

2020-04-25 20:29:39 1371

原创 kubernetes扩展apiserver实现分析

Kubernetes提供了丰富的扩展功能,如果需要实现自定义的资源,通过有两种方式CRD与Aggregation API。相对于CRD扩展API功能更丰富,可以实现单独的存储。今天来聊一聊,k8s是如果实现扩展api,它们直接又是如何协作的。AggregationApiserver介绍Aggregator类似于一个七层负载均衡,将来自用户的请求拦截转发给其他服务器,并且负责整个 APIServ...

2020-04-25 20:27:23 1680

超市贵宾卡收银管理系统

pb平台做的小型超市贵宾卡收银系统,希望能帮到学弟学妹

2014-06-21

空空如也

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

TA关注的人

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