kubernetes 自定义控制器的高可用

自定义 controller 通常要求只能有一个实例在工作,但是为了保证高可用,就需要有一个选主的机制,保证在 leader 因为某个异常挂掉后,其他节点可以提升为 leader,然后正常工作。


kubernetes 自定义控制器

kubernetes 的 controller-manager 通过 APIServer 实时监控内部资源的变化情况,通过各种操作将系统维持在一个我们预期的状态上。比如当我们将 Deployment 的副本数增加时,controller-manager 会监听到此变化,主动创建新的 Pod。

对于通过 CRD 创建的资源,也可以创建一个自定义的 controller 来管理。


kubernetes CRD 权限管理

对于一个多个用户的集群而言,通常单个用户只有自己 namespace 的相关权限,而 kubernetes CRD 需要配置额外的权限才能使用。


kubernetes 自定义资源(CRD)

在研究 Service Mesh 的过程中,发现 Istio 很多参数都通过 kubernetes CRD 来管理,例如 VirtualService 和 DestinationRule,这种方式使部署在 k8s 集群上的服务的管理方式更趋向一致。


Service Mesh 探索之升级 HTTP/2 协议

HTTP/2 是 HTTP/1.1 的升级,在请求方法、状态码乃至 URI 和绝大多数 HTTP 头部字段等方面保持高度兼容性,同时能够减少网络延迟和连接资源占用。Service Mesh 架构中,由于两个服务之间的通信由 proxy 介入,对于依靠 HTTP/1.1 通信的服务来说,可以无缝升级到 HTTP/2 协议。


使用 telepresence 在 k8s 环境中实现快速开发

随着容器化,微服务的概念逐渐成为主流,在日常的开发测试中,会遇到一些新的问题。例如如果服务跑在 istio 这样的 ServiceMesh 平台上,依赖于 k8s 的 sidecar 功能,在本地模拟这样的场景来调试和测试是比较复杂的。而 telepresence 帮助我们缓解了这样的问题。



Service Mesh 探索之优先本地访问

在设计 Service Mesh 架构方案时,考虑到有一些基础服务,访问频率高,流量大,如果在 kubernetes 平台上采用 DaemonSet 的部署方式,每一个机器部署一个实例,访问方能够优先访问同一个节点上的该服务,则可以极大地减少网络开销和延迟。


Service Mesh 探索之流量劫持

Istio 的项目中有一个亮点就是可以将旧的应用无缝接入到 Service Mesh 的平台上来,不用修改一行代码。实现这个功能,目前主要是通过 iptables 来截获流量转发给 proxy。


Service Mesh 自研实践

最近都在做自研 Service Mesh 方案的落地和后续迭代优化,目前稳定承接了旧系统的大部分流量,这里分享一下这套架构,以及过程中的思考和遇到的一些问题。


烟然

通关仙剑四后的随笔,作于 2008 年。


记一次mesos集群停容器时间过长的问题排查

公司 mesos 集群某个 app 已经有数千的实例数,每次做滚动升级时,由于总资源不足,需要分批操作,每次起一批新版本实例,再停一批旧版本实例。目前停容器的策略是,先从服务发现中摘除需要停掉的节点,等待 60 秒后再停止容器,释放资源,但是实际上每次从发送停止容器的请求到容器资源被实际释放需要长达 6 分钟,导致滚动升级耗时过长。经过排查,最终确认问题出在我们使用 docker 的方式上,这里记录下分析和解决问题的过程。


为 mtcp 项目添加 udp 支持

mtcp 是一个用户态的 tcp 协议栈,结合 dpdk 可以实现高性能的收发包。mtcp 不支持 udp 协议,想要在 bind 里利用 mtcp 进行加速,需要改动源码以提供支持。


减小 golang 编译出程序的体积

Go 语言的优势是可以很方便地编译出跨平台的应用程序,而不需要为每一个平台做代码适配,也不像 JAVA 一样需要预先安装 JDK 环境。相应的问题就是 go 编译出的程序体积较大,和 c/c++ 不同,它将大多数依赖都以静态编译的方式编译进了程序中。


golang 交叉编译

golang 相比 c/c++ 的优势之一是更容易编写出跨平台的应用,而不需要为各个平台编写适配代码。和 JAVA 相比,对系统环境要求较低,不需要预先安装 JDK 等适配环境。