前言
在本文中,您将了解如何在Pod启动或关闭时防止连接异常,并将学习如何以优雅的方式关闭长时间运行的任务。
得益于了 Go 运行时高效的内置内存管理,我们通常能够在程序中优先考虑正确性和可维护性,而不需要过多考虑如何进行分配的细节。不过,有时我们可能会发现代码中的性能瓶颈,并希望进行更深入的研究。
任何使用 -benchmem
标志运行基准测试的人都会在输出中看到 allocs/op
的统计。在这篇文章中,我们将看看什么算作一个 alloc,以及我们可以做什么来影响这个数字。1
BenchmarkFunc-8 67836464 16.0 ns/op 8 B/op 1 allocs/op
Go 以其并发性著称,深受人们喜爱。go 运行时管理轻量级线程,称为 goroutines。goroutine 的编写非常快速简单。
你只需在你想异步执行的函数前输入 go
,程序就会在另一个线程中执行。
听起来很简单?
goroutines 是 Go 编写异步代码的方式。
重要的是要了解 goroutine 和并发的工作原理。Go 提供了管理 goroutine 的方法,使它们在复杂的程序中更容易管理和预测。
因为 goroutine 非常容易使用,所以它们很容易被滥用。
本文翻译自 2019 年 Daniel Borkmann 和 Martynas Pumputis 在 Linux Plumbers Conference 的一篇分享: Making the Kubernetes Service Abstraction Scale using eBPF 。 翻译时对大家耳熟能详或已显陈旧的内容(K8s 介绍、Cilium 1.6 之前的版本对 Service 实现等)略有删减,如有需要请查阅原 PDF。
实际上,一年之后 Daniel 和 Martynas 又在 LPC 做了一次分享,内容是本文的延续:Cilium:基于 BPF/XDP 实现 K8s Service 负载均衡
K8s 当前重度依赖 iptables 来实现 Service 的抽象。对于每个 Service 及其 backend pods,在 K8s 里会生成很多 iptables 规则。例如 5K 个 Service 时,iptables 规则将达到 25K 条,导致的后果:
本文将介绍如何基于 Cilium/BPF 来解决这些问题,实现 K8s Service 的大规模扩展。
Golang 是一种并发编程语言。它具有强大的特性,如 Goroutines
和 Channels
,可以很好地处理异步任务。另外,goroutines
不是 OS 线程,这就是为什么您可以在不增加开销的情况下根据需要启动任意数量的 goroutine
的原因,它的堆栈大小初始化时仅 2KB。那么为什么要 async/await
呢? Async/Await
是一种很好的语言特点,它为异步编程提供了更简单的接口。