-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
134 lines (126 loc) · 5.43 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="initial-scale=1">
<title>Internal Blog Theory | Anqur</title>
<link rel="stylesheet" href="/style/post.css">
<link rel="stylesheet" href="/style/highlight.css">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"
integrity="sha384-wcIxkf4k558AjM3Yz3BBFQUbk/zgIYC2R0QpeeYb+TwlBVMrlgLqwRjRtGZiK7ww"
crossorigin="anonymous">
<script defer
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js"
integrity="sha384-hIoBPJpTUs74ddyc4bFZSM1TVlQDA60VBbJS0oA934VSz82sBx1X7kSx2ATBDIyd"
crossorigin="anonymous"></script>
<script defer
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js"
integrity="sha384-43gviWU0YVjaDtb/GhzOouOXtZMP/7XUzwPTstBeZFe/+rCMvRwr4yROQP43s0Xk"
crossorigin="anonymous"
onload="renderMathInElement(document.body);"></script>
</head>
<body>
<header>
<h1><a href="/">Internal Blog Theory</a></h1>
</header>
<main>
<article>
<h1 id="将-kubernetes-api-翻译成-systemd-操作">将 Kubernetes API 翻译成
systemd 操作</h1>
<ul>
<li>2023-03-10</li>
<li>💼</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: center;">想法复杂度</th>
<th style="text-align: center;">实现难度</th>
<th style="text-align: center;">是否已实现</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">2/5</td>
<td style="text-align: center;">1/5</td>
<td style="text-align: center;">✅</td>
</tr>
</tbody>
</table>
<hr />
<p>自己在 Shopee 的工作中, 即使是最近很长一段时间做的分布式存储的项目,
或者是以前一些偏重 CRUD 的项目, 服务的部署都相当的野蛮:</p>
<ul>
<li>平台服务的一组实例基本会独占一台 bare metal (例如 Go 服务配上各种
exporter/sidecar 进程)</li>
<li>对于一些有特殊用途的 bare metal, 甚至提供了 64 CPU + 200+ GiB memory
+ 50+ TiB disks 的配置</li>
<li>服务一般不期望有任何的资源隔离, 存活在一个简单的 cgroup 就可以了,
因为有的需要直接读写块设备</li>
<li>一个服务实例一般是个 systemd unit</li>
</ul>
<p>目前集群管理的手段, 是将各个可能的操作写成了不同的 Ansible roles.
那么有没有什么办法, 将这种简单的服务调度的场景转换成使用 K8s 呢?</p>
<p>这样的好处就是:</p>
<ul>
<li>许多 K8s 现有的功能可以实时地在各种平台中使用, 例如集群状态查询, pod
失败重试等等</li>
<li>能利用起 K8s 的 container logs 和 exposed metrics 等功能</li>
<li>可以做基于 image 的部署 (而且 image 不一定要遵循 OCI image
layout)</li>
</ul>
<h2 id="virtual-kubelet">Virtual Kubelet</h2>
<p>翻来翻去, 找到了 <a
href="https://github.com/virtual-kubelet/systemk">systemk</a> 这个项目,
但是这个项目做的事情太多了 (volumes, secrets, configMap, emptyDir 等等),
而它底下基于的框架 <a
href="https://github.com/virtual-kubelet/virtual-kubelet">Virtual
Kubelet</a>, 用户只要实现 <a
href="https://github.com/virtual-kubelet/virtual-kubelet/blob/v1.7.0/node/podcontroller.go#L47"><code>PodLifecycleHandler</code></a>
接口, 就能假扮成一个 kubelet 并适配上 apiserver 的各种行为操作,
看起来很有望.</p>
<p>接下来就要关注 K8s 概念和 systemd 概念之间的静态对应关系:</p>
<ul>
<li>Pod: 一组 systemd unit</li>
<li>Container: 一个 systemd unit</li>
<li>Image: 可以直接忽略, 或者是某个服务的安装包</li>
<li>Namespace: 也是一组 systemd unit, 在 pod 概念之上</li>
</ul>
<p>Systemd unit 服务名遵循这样的命名规则:</p>
<pre class="plaintext"><code>unitlet.NAMESPACE_NAME.POD_NAME.CONTAINER_NAME.service</code></pre>
<p>接下来就可以关注 pod 本身的生命周期了.</p>
<h2 id="introducing-unitlet">Introducing unitlet</h2>
<p>我花了两天的时间, 用了 1k 左右的代码, 实现了 <a
href="https://github.com/anqur/unitlet">unitlet</a> 这个项目.
整个项目分成了几个核心模块 (interface 的形式):</p>
<ul>
<li>Unit store, 存放 unit 数据的模块, 具体实现就是一个 file store, 将
systemd unit 文件存放在某个目录里</li>
<li>Unit state, 即 unit 的运行状态, 具体实现就是 D-Bus 的一些操作</li>
<li>Virtual Kubelet provider, 即 unitlet 本身, 内部是对 unit store 和
unit state 操作的组合</li>
</ul>
<p>整个实现没有什么复杂的地方, 查询/创建/删除 pod 等变成操作 systemd
unit 文件以及 systemctl 的各种命令就完事儿了.</p>
<p>一些未来可以做的事情:</p>
<ul>
<li>实现 get container logs, 这个当时有点懒了, 可以转换成对 journalctl
的调用</li>
<li>实现 exposed metrics, 这个也是暴露相应的接口方法就可以了</li>
<li>将从 image registry 下载的功能包装成一个接口, 并可以简单实现成从某个
URL 下载并解压软件包的方式达到版本发布的目的</li>
<li>将我组的服务接入到公司的 K8s 平台去, 让服务部署更加的规范</li>
</ul>
</article>
</main>
<footer>
<p>
Report bugs, or you have better ideas:
<a href="//github.com/anqur/anqur.github.io/issues">Issues</a>.
</p>
<p>All posts follow the <code>cc-by-4.0</code> license.</p>
</footer>
</body>
</html>