原生的 K8s 并不支持将指定的 Pod 从当前节点迁移到另外一个指定的节点上。但是我们可以基于 K8s 提供的扩展能力来实现对这一功能的支持。
原生的 K8s 并不支持将指定的 Pod 从当前节点迁移到另外一个指定的节点上。但是我们可以基于 K8s 提供的扩展能力来实现对这一功能的支持。
Kubernetes 对于挂载了 subpath 的容器,在 configmap 或其他 volume 变更后,如果容器因为意外退出后,就会持续 crash,无法正常启动。
当前 Kubernetes 已经发布了 1.18 版本,这个问题仍然存在。
借助 JWT 做用户认证是比较简单的一种方式。
自定义 controller 通常要求只能有一个实例在工作,但是为了保证高可用,就需要有一个选主的机制,保证在 leader 因为某个异常挂掉后,其他节点可以提升为 leader,然后正常工作。
kubernetes 的 controller-manager 通过 APIServer 实时监控内部资源的变化情况,通过各种操作将系统维持在一个我们预期的状态上。比如当我们将 Deployment 的副本数增加时,controller-manager 会监听到此变化,主动创建新的 Pod。
对于通过 CRD 创建的资源,也可以创建一个自定义的 controller 来管理。
对于一个多个用户的集群而言,通常单个用户只有自己 namespace 的相关权限,而 kubernetes CRD 需要配置额外的权限才能使用。
在研究 Service Mesh 的过程中,发现 Istio 很多参数都通过 kubernetes CRD 来管理,例如 VirtualService 和 DestinationRule,这种方式使部署在 k8s 集群上的服务的管理方式更趋向一致。
HTTP/2 是 HTTP/1.1 的升级,在请求方法、状态码乃至 URI 和绝大多数 HTTP 头部字段等方面保持高度兼容性,同时能够减少网络延迟和连接资源占用。Service Mesh 架构中,由于两个服务之间的通信由 proxy 介入,对于依靠 HTTP/1.1 通信的服务来说,可以无缝升级到 HTTP/2 协议。
随着容器化,微服务的概念逐渐成为主流,在日常的开发测试中,会遇到一些新的问题。例如如果服务跑在 istio 这样的 ServiceMesh 平台上,依赖于 k8s 的 sidecar 功能,在本地模拟这样的场景来调试和测试是比较复杂的。而 telepresence 帮助我们缓解了这样的问题。
在 k8s 平台测试自研 Service Mesh 方案时,发现更新服务时,会有少量请求耗时剧增。跟踪排查后确认是由于 Pod 被删除后,原先的 Pod 的 IP 不存在,客户端建立连接超时引起。
在设计 Service Mesh 架构方案时,考虑到有一些基础服务,访问频率高,流量大,如果在 kubernetes 平台上采用 DaemonSet 的部署方式,每一个机器部署一个实例,访问方能够优先访问同一个节点上的该服务,则可以极大地减少网络开销和延迟。
Istio 的项目中有一个亮点就是可以将旧的应用无缝接入到 Service Mesh 的平台上来,不用修改一行代码。实现这个功能,目前主要是通过 iptables 来截获流量转发给 proxy。
最近都在做自研 Service Mesh 方案的落地和后续迭代优化,目前稳定承接了旧系统的大部分流量,这里分享一下这套架构,以及过程中的思考和遇到的一些问题。
通关仙剑四后的随笔,作于 2008 年。
公司 mesos 集群某个 app 已经有数千的实例数,每次做滚动升级时,由于总资源不足,需要分批操作,每次起一批新版本实例,再停一批旧版本实例。目前停容器的策略是,先从服务发现中摘除需要停掉的节点,等待 60 秒后再停止容器,释放资源,但是实际上每次从发送停止容器的请求到容器资源被实际释放需要长达 6 分钟,导致滚动升级耗时过长。经过排查,最终确认问题出在我们使用 docker 的方式上,这里记录下分析和解决问题的过程。