CloudNative 架构

CloudNative|云原生应用架构|云原生架构|容器化架构|微服务架构|平台架构|基础架构


  • 首页

  • 标签

  • 分类

  • 归档

  • k8s离线安装包

  • 搜索

(译)深入理解 Kubernetes 网络模型 - 自己实现 kube-proxy 的功能

发表于 2020-10-19 | 分类于 kubernetes , kube-proxy , 网络 | | 热度: ℃
字数统计: 8,189 字 | 阅读时长 ≈ 38 分钟

索引

  1. 背景知识
  2. 节点代理模型
  3. 测试环境
  4. 实现:通过 userspace socket 实现 proxy
  5. 实现:通过 iptables 实现 proxy
  6. 实现:通过 ipvs/ipset 实现 proxy
  7. 实现:通过 bpf 实现 proxy
  8. 总结
  9. 参考文献
  10. 附录

Kubernetes 中有几种类型的代理。其中有 node proxier 或 kube-proxy,它在每个节点上反映 Kubernetes API 中定义的服务,可以跨一组后端执行简单的 TCP/UDP/SCTP 流转发 [1]。

为了更好地理解节点代理模型,在这篇文章中,我们将用不同的方法设计和实现我们自己版本的 kube-proxy; 尽管这些只是 toy-proxy,但从透明流量拦截、转发、负载均衡等方面来说,它们的工作方式与 K8S 集群中运行的普通 kube-proxy 基本相同。

通过我们的 toy-proxy 程序,非 K8S 节点(不在 K8S 集群中)上的应用程序(无论是宿主本地应用程序,还是在 VM/容器中运行的应用程序)也可以通过 ClusterIP 访问 K8S 服务 – 注意,在 kubernetes 的设计中,ClusterIP 只能在 K8S 集群节点中访问。(在某种意义上,我们的 toy-proxy 程序将非 K8S 节点变成了 K8S 节点。)

阅读全文 »

Kubernetes CPUThrottlingHigh 告警解析

发表于 2020-10-13 | 分类于 kubernetes , 告警 | | 热度: ℃
字数统计: 2,635 字 | 阅读时长 ≈ 11 分钟

前言

在使用Kubernetes的过程中,我们看到过这样一个告警信息:

[K8S]告警主题: CPUThrottlingHigh
告警级别: warning
告警类型: CPUThrottlingHigh
故障实例: xxxx
告警详情: 27% throttling of CPU in namespace kube-system for container kube-proxy in pod kube-proxy-9pj9j.
触发时间: 2020-05-08 17:34:17

这个告警信息说明 kube-proxy 容器被 throttling 了,然而查看该容器的资源使用历史信息,发现该容器以及容器所在的节点的 CPU 资源使用率都不高:

告警期间容器所在节点CPU使用率
告警期间kube-proxy的资源使用率

经过我们的分析,发现该告警实际上是和 Kubernetes 对于 CPU 资源的限制和管控机制有关。Kubernetes 依赖于容器的 runtime 进行 CPU 资源的调度,而容器 runtime 以 Docker 为例,是借助于 cgroup 和 CFS 调度机制进行资源管控。本文基于这个告警案例,首先分析了 CFS 的基本原理,然后对于 Kubernetes 借助 CFS 进行 CPU 资源的调度和管控方法进行了介绍,最后使用一个例子来分析 CFS 的一些调度特性来解释这个告警的 root cause 和解决方案。

阅读全文 »

记一次线上Go服务内存占用率过高问题排查

发表于 2020-10-12 | 分类于 golang , 故障分析 | | 热度: ℃
字数统计: 1,844 字 | 阅读时长 ≈ 7 分钟

故障现象

某线上埋点上报机器偶尔触发内存占用过多的报警。ssh到机器top发现主要内存被埋点服务占用。之前重启过几次,但是过段时间仍然会发生内存占用过多的警报。下面是报警详情。

[P1][PROBLEM][ali-e-xxx-service03.bj][][ all(#3) mem.memfree.percent 4.19575<5][O3 >2019-10-28 10:20:00]

问题推断

埋点服务主要接收客户端压缩过的上报请求,并对请求数据做解压,投递到kafka,逻辑功能相对简单。初步怀疑是某些资源没有释放导致的内存泄露或Groutine泄露。

问题排查

由于代码不是由我们业务方维护的,首先向相关部门索要了代码权限。阅读了一下源码,所有资源释放都是由defer进行操作的,并没有发现很明显的资源未释放的情况。

阅读全文 »

带你认识Kubernetes 网络插件Flannel与Calico

发表于 2020-10-09 | 分类于 kubernetes , cni , 网络插件 | | 热度: ℃
字数统计: 3,124 字 | 阅读时长 ≈ 13 分钟

概述

容器的网络解决方案有很多种,每支持一种网络实现就进行一次适配显然是不现实的,而 CNI 就是为了兼容多种网络方案而发明的。CNI 是 Container Network Interface 的缩写,是一个标准的通用的接口,用于连接容器管理系统和网络插件。

简单来说,容器 runtime 为容器提供 network namespace,网络插件负责将 network interface 插入该 network namespace 中并且在宿主机做一些必要的配置,最后对 namespace 中的 interface 进行 IP 和路由的配置。

所以网络插件的主要工作就在于为容器提供网络环境,包括为 pod 设置 ip 地址、配置路由保证集群内网络的通畅。目前比较流行的网络插件是 Flannel 和 Calico。

阅读全文 »

如何使用go pprof定位内存泄露

发表于 2020-09-30 | 分类于 golang , pprof | | 热度: ℃
字数统计: 7,675 字 | 阅读时长 ≈ 33 分钟

最近解决了我们项目中的一个内存泄露问题,事实再次证明 pprof 是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用 pprof 定位内存泄露问题。

关于Go的内存泄露有这么一句话不知道你听过没有:

10次内存泄露,有9次是 goroutine 泄露。

我所解决的问题,也是 goroutine 泄露导致的内存泄露,所以这篇文章主要介绍Go程序的goroutine 泄露,掌握了如何定位和解决 goroutine 泄露,就掌握了内存泄露的大部分场景。

本文草稿最初数据都是生产坏境数据,为了防止敏感内容泄露,全部替换成了demo数据,demo的数据比生产环境数据简单多了,更适合入门理解,有助于掌握 pprof。

阅读全文 »
1…678…22
icyboy

icyboy

109 日志
98 分类
182 标签
RSS
GitHub 微博 知乎
友情链接
  • 张家港水蜜桃
  • 运维开发
  • DevOps
© 2016 — 2021 icyboy | Site words total count: 330.8k
本站访客数:
博客全站共330.8k字