![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
云原生
文章平均质量分 85
kubernetes, docker, cicd and so on.
qingwave
qingwave.github.io
展开
-
Golang访问控制框架:Open Policy Agent vs Casbin
大型项目中基本都包含有复杂的访问控制策略,特别是在一些多租户场景中,例如Kubernetes中就支持RBAC,ABAC等多种授权类型。在Golang中目前比较热门的访问控制框架有Open Policy Agent与Casbin,本文主要分析其异同。......原创 2022-06-13 09:43:55 · 1381 阅读 · 0 评论 -
Kubernetes中的Golang设计模式
随着Kubernetes成为容器编排领域的事实标准,Golang在云原生方面应用的也越来越多。今天我们跟随K8s的脚步,学习下在K8s中使用哪些经典的设计模式。创建型模式创建型模式顾名思义提供了对象的创建机制,封装了内部的复杂性,提高代码复用和灵活性。包括:单例模式工厂模式建造者模式原型模式单例模式单例模式用来保证一个类只有一个实例,并提供调用它的一个全局访问点。单例模式是设计模式中最简单,使用最广的一个,通常用来创建一个共享的实例,比如数据库连接池、线程池等。单例模式分为懒汉式(使用原创 2022-04-18 11:27:34 · 778 阅读 · 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 · 1763 阅读 · 1 评论 -
Kubernetes调试利器Nsenter
在k8s云环境中,我们需要在容器内抓包进行Debug, 但通常大多容器都没有安装tcpdump以及其他网络工具;在托管k8s中我们想登录node,不是没权限就是步骤太麻烦。本文的主角nsenter正是很擅长解决这些问题,nsenter可以进入指定namespace的工具,一般用来在容器环境中进行调试。调试容器网络通过nsenter可以轻松在宿主机进入容器的网络命令空间,命令如下:# 设置containeridcontainerid=xxx # 获取容器主进程pid=$(docker inspe原创 2022-01-27 09:52:40 · 1341 阅读 · 0 评论 -
K8S中为什么需要Unstructured对象
K8S中为什么需要Unstructured对象,通过源码分析原因原创 2022-01-27 09:47:17 · 1885 阅读 · 0 评论 -
深入了解kubebuilder
前文快速实现一个Kubernetes Operator介绍了kubebuilder工具,快速实现了一个Operator。今天我们深入水下,探寻kubebuilder究竟是如何工作的。普通开发流程如果不借助任何Operator脚手架,我们是如何实现Operator的?大体分为一下几步:CRD定义Controller开发,编写逻辑测试部署API定义首先通过k8s.io/code-generator项目生成API相关代码,定义相关字段。Controller实现实现Controller以官方提原创 2021-09-13 17:11:57 · 1570 阅读 · 0 评论 -
快速实现一个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 · 2985 阅读 · 0 评论 -
优化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 · 2399 阅读 · 0 评论 -
Prometheus高可用自动分区方案
在Prometheus分区实践中我们介绍了使用集群联邦与远程存储来扩展Prometheus以及监控数据持久化,但之前的分区方案存在一定不足,如分区配置较难维护,全局Prometheus存在性能瓶颈等,本文通过Thanos+Kvass实现更优雅的Prometheus扩展方案。自动分区之前分区方案依赖Prometheus提供hashmod,通过在配置中指定hash对象与modules进行散列(md5),每个分片只抓取相同job命中的对象,例如我们可以通过对node散列从而对cadvisor、node-exp原创 2021-03-31 18:52:18 · 1275 阅读 · 2 评论 -
优化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 · 2093 阅读 · 3 评论 -
k8s中shell脚本启动如何传递信号
背景在k8s或docker中,有时候我们需要通过shell来启动程序,但是默认shell不会传递信号(sigterm)给子进程,当在pod终止时应用无法优雅退出,直到最大时间时间后强制退出(kill -9)。分析普通情况下,大多业务的启动命令如下command: ["binary", "-flags", ...]主进程做为1号进程会收到sigterm信号,优雅退出(需要程序捕获信号); 而通过脚本启动时,shell作为1号进程,不会显示传递信号给子进程,造成子进程无法优雅退出,直到最大退出时间后原创 2021-02-04 15:41:03 · 1474 阅读 · 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 · 4023 阅读 · 0 评论 -
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 · 3347 阅读 · 0 评论 -
开启shareProcessNamespace后容器异常
背景目前k8s不支持容器启动顺序,部分业务通过开启shareProcessNamespace监控某些进程状态。当开启共享pid后,有用户反馈某个容器主进程退出,但是容器并没有重启,执行exec会卡住,现象参考issue复现创建deploymentapiVersion: apps/v1kind: Deploymentmetadata: labels: app: nginx name: nginxspec: selector: matchLabels:原创 2020-08-03 23:18:55 · 1591 阅读 · 0 评论 -
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 · 444 阅读 · 0 评论 -
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 · 2895 阅读 · 0 评论 -
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 · 6765 阅读 · 0 评论 -
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 · 1627 阅读 · 0 评论 -
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 · 3873 阅读 · 0 评论 -
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 · 2481 阅读 · 3 评论 -
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 · 1067 阅读 · 0 评论 -
kube-apiserver启动流程分析
kube-apiserver 共由 3 个组件构成(Aggregator. KubeAPIServer. APIExtensionServer),这些组件依次通过 Delegation 处理请求:Aggregator:暴露的功能类似于一个七层负载均衡,将来自用户的请求拦截转发给其他服务器,并且负责整个 APIServer 的 Discovery 功能;也负责处理ApiService,注册对应的...原创 2020-04-25 20:29:39 · 1449 阅读 · 0 评论 -
kubernetes扩展apiserver实现分析
Kubernetes提供了丰富的扩展功能,如果需要实现自定义的资源,通过有两种方式CRD与Aggregation API。相对于CRD扩展API功能更丰富,可以实现单独的存储。今天来聊一聊,k8s是如果实现扩展api,它们直接又是如何协作的。AggregationApiserver介绍Aggregator类似于一个七层负载均衡,将来自用户的请求拦截转发给其他服务器,并且负责整个 APIServ...原创 2020-04-25 20:27:23 · 1758 阅读 · 0 评论 -
kube-apiserver rbac鉴权源码分析
简介kube-apiserver中与权限相关的主要有三种机制,即认证、鉴权和准入控制。上节讲到认证流程。认证与授权很容易混淆:认证(Authentication), 负责检查你是谁,识别user授权(Authorization), 你能做什么,是否允许User对资源的操作审计(Audit), 负责记录操作信息,方便后续审查本文主要分析apiserver的rbac授权流程。认证流程...原创 2020-04-25 15:03:15 · 1021 阅读 · 0 评论 -
多端口服务的Ingress IP-hash问题
背景业务反馈使用Ingress的ip-hash, 同一个服务开启了http和websocket分别是两个端口, 但是配置ip-hash后, 同一个client的请求http和websocket不在同一个后端.探究根据业务Ingress配置,配置如下实例:apiVersion: extensions/v1beta1kind: Ingressmetadata: annotations:...原创 2020-04-25 11:11:05 · 5199 阅读 · 0 评论 -
可能是史上最全的Kubernetes证书解析
为了避免广告法,题目还是加个可能吧。想要安全就必须复杂起来,证书是少不了的。在Kubernetes中提供了非常丰富的证书类型,满足各种不同场景的需求,今天我们就来看一看Kubernetes中的证书。k8s证书分类在说证书之前,先想想作为集群的入口apiserver需要提供那些服务,与那些组件通信,通信的两方可能需要配置证书。与apiserver通信的组件大体可以分为以下几类:clien...原创 2020-04-25 11:08:02 · 8394 阅读 · 0 评论 -
如何做一个优雅的Pod
没有人不想优雅的活着,在这喧闹的生活中过得优雅从容并不容易。但在k8s的世界中,如何做个优雅的Pod还是有套路可循的。Pod的生命周期在优雅之前,我们先谈谈Pod的一生,大体分为以下几个阶段创建,通过kubectl或者api创建pod, apiserver收到请求后存储到etcd调度,scheduler检测到pod创建后,通过预选优选为pod选取合适的人家(node)启动,kubele...原创 2020-04-11 20:32:42 · 548 阅读 · 0 评论 -
k8s中文件描述符与线程限制
背景linux中为了防止进程恶意使用资源,系统使用ulimit来限制进程的资源使用情况(包括文件描述符,线程数,内存大小等)。同样地在容器化场景中,需要限制其系统资源的使用量。限制方法ulimit: docker 默认支持ulimit设置,可以在dockerd中配置 default-ulimits 可为宿主机所有容器配置默认的ulimit,docker启动时可添加 --ulimit 为每个...原创 2020-04-11 15:45:21 · 8381 阅读 · 0 评论 -
Pod memory usage in k8s
Cadvisor内存使用率指标Cadvisor中有关pod内存使用率的指标指标说明container_memory_cacheNumber of bytes of page cache memory.container_memory_rssSize of RSS in bytes.(包括匿名映射页和交换区缓存)container_memory_swapCo...原创 2020-04-11 15:42:46 · 2162 阅读 · 2 评论 -
apline镜像添加时区与字符设置
添加时区设置TZ与安装tzdata添加work用户addgroup -S work && adduser -S -G work work -s /bin/sh设置字符格式设置环境变量LANG与LC_ALLDockerfile如下:FROM alpineENV TZ=Asia/Shanghai \ LANG=en_US.UTF-8 \ ...原创 2020-04-11 15:41:17 · 519 阅读 · 0 评论 -
apline 容器中执行shell脚本报错 executable file not found
问题今天在创建java镜像时,使用了(openjdk:8-jdk-alpine)[https://hub.docker.com/_/openjdk],启动容器后需要运行一java脚本,直接执行./test.sh报错sh:.sh test.sh: not found网上有说由于权限文件不能执行,chmod +x test.sh,仍然报错在k8s pod中部署,describe报错Error...原创 2020-04-11 15:40:31 · 2436 阅读 · 0 评论 -
Docker多阶段构建
之前的做法在 Docker 17.05 版本之前,我们构建 Docker 镜像时,通常会采用两种方式:全部放入一个 Dockerfile一种方式是将所有的构建过程编包含在一个 Dockerfile 中,包括项目及其依赖库的编译、测试、打包等流程,这里可能会带来的一些问题:Dockerfile 特别长,可维护性降低镜像层次多,镜像体积较大,部署时间变长源代码存在泄露的风险例如...原创 2020-04-11 15:37:31 · 330 阅读 · 0 评论 -
nginx ingress最后的倔强: admission webhook
背景k8s中大多使用nginx-ingress-controller来实现ingress, 但是脆弱的nginx-controller通过ingress解析出nginx配置, 对于某些annotation会reload nignx配置失败, 然后controller就卡死了, 不断重启, 除非删除对应的ingress.问题复现创建有问题的ingressapiVersion: extensi...原创 2020-04-11 15:32:02 · 7766 阅读 · 3 评论 -
cgroup引起的应用延迟
背景用户发现线上某容器请求hbase延迟较大,其他容器无类似现象,发现问题容器宿主机系统cpu占用较大(30%左右,正常在5%以下)。通过top查看lxcfs占用cpu较多(200%以上)。探究查看宿主机(内核 4.9.2)top,1显示每个cpu使用信息。查看最高的cpu占用是lxcfs造成的。strace查看lxcfs调用#查看调用情况,read占用99%$ strace -p 1...原创 2020-04-07 16:10:03 · 605 阅读 · 0 评论 -
Pod一直显示Terminating
问题集群中有一个pod一直显示TerminatingeventNormal Scheduled 1h default-scheduler Successfully assigned feed-426565da19777e5d325f-5994dc5cff-znqmh to node01Normal SuccessfulMountVolume 1h kubelet, node01 (comb...原创 2020-04-07 16:06:03 · 4575 阅读 · 0 评论 -
nginx ingress controller 最后的倔强: admission webhook
背景k8s中大多使用nginx-ingress-controller来实现ingress, 但是脆弱的nginx-controller通过ingress解析出nginx配置, 对于某些annotation会reload nignx配置失败, 然后controller就卡死了, 不断重启, 除非删除对应的ingress.问题复现创建有问题的ingressapiVersion: extensi...原创 2020-04-07 16:01:58 · 6316 阅读 · 0 评论 -
Prometheus分区实践
背景单个Prometheus Server可以轻松的处理数以百万的时间序列。但当机器规模过大时,需要对其进行分区,Prometheus也提供了集群联邦的功能,方便对其扩展。我们采用Prometheus来监控k8s集群,节点数400,采集的samples是280w,Prometheus官方的显示每秒可抓取10w samples。当集群规模扩大到上千节点时,单个Prometheus不足以处理大量数...原创 2020-04-03 14:11:17 · 786 阅读 · 0 评论 -
k8s中pod sandbox创建失败"failed to start sandbox container"
背景今天在k8s更新服务时,发现pod启动失败,报错failed to start sandbox container,如下所示:Events: Type Reason Age From Message ---- ...原创 2020-04-03 14:04:08 · 19143 阅读 · 0 评论 -
kube-apiserver认证源码分析
简介kube-apiserver中与权限相关的主要有三种机制,即认证、鉴权和准入控制。本文主要分析apiserver的认证流程。认证流程分析权限相关代码从k8s.io/apiserver/pkg/server/config.go中DefaultBuildHandlerChain函数开始执行func DefaultBuildHandlerChain(apiHandler http.Handl...原创 2020-04-03 14:01:56 · 711 阅读 · 0 评论 -
容器内存分析
背景在容器化环境中,平台需要提供准确的业务监控指标,已方便业务查看。那么如何准确计算容器或Pod的内存使用率,k8s/docker又是如何计算,本文通过实验与源码阅读相结合来分析容器的内存实际使用量。预备知识不管docker还是k8s(通过cadvisor)最终都通过cgroup的memory group来得到内存的原始文件,memory相关的主要文件如下:cgroup.event_con...原创 2020-04-03 13:58:46 · 7116 阅读 · 0 评论