Skip to content

Commit 2592735

Browse files
committed
[pod] refactor: rewrite pod document.
1 parent afd8833 commit 2592735

2 files changed

Lines changed: 32 additions & 16 deletions

File tree

README.md

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,11 @@ func main() {
175175

176176
在以前,如果你想将这段代码运行起来并测试一下。你首先需要懂得如何下载 golang 的安装包进行安装,接着需要懂得 `golang module` 的基本使用,最后还需要了解 golang 的编译和运行命令,才能将该代码运行起来。甚至在过程中,可能会因为环境变量问题、操作系统问题、处理器架构等问题导致编译或运行失败。
177177

178-
但是通过容器技术,只需要上面的代码,附带着对应的容器 `Dockerfile` 文件,那么你就不需要 golang 的任何知识,也能将代码顺利运行起来。
178+
但是通过 Container (容器) 技术,只需要上面的代码,附带着对应的容器 `Dockerfile` 文件,那么你就不需要 golang 的任何知识,也能将代码顺利运行起来。
179179

180-
> Container (容器) 是一种沙盒技术。它是基于 Linux 中 Namespace / Cgroups / chroot 等技术结合而成,更多技术细节可以参看这个视频 [如何自己实现一个容器](https://www.youtube.com/watch?v=8fi7uSYlOdc)
180+
> Container (容器) 是一种沙盒技术。它是基于 Linux 中 Namespace / Cgroups / chroot 等技术组合而成,更多技术细节可以参照这个视频 [如何自己实现一个容器](https://www.youtube.com/watch?v=8fi7uSYlOdc)
181181
182-
下面就是 Go 代码对应的 `Dockerfile`,简单的方案是直接使用 golang 的 alpine 镜像来打包,但是因为我们后续练习需要频繁的推送镜像到 DockerHub 和拉取镜像到 k8s 集群中,为了优化网络速度,我们选择先在 `golang:1.16-buster` 中将上述 Go 代码编译成二进制文件,再将二进制文件复制到 `base-debian10` 镜像中运行 (Dockerfile 不理解没有关系,不影响后续教程学习)。
182+
下面就是 Go 代码对应的 `Dockerfile`,简单的方案是直接使用 golang 的 alpine 镜像来打包,但是因为我们后续练习需要频繁的推送镜像到 DockerHub 和拉取镜像到 k8s 集群中,为了优化网络速度,我们选择先在 `golang:1.16-buster` 中将上述 Go 代码编译成二进制文件,再将二进制文件复制到 `base-debian10` 镜像中运行 (Dockerfile 不理解没有关系,不影响后续学习)。
183183

184184
这样我们可以将 300MB 大小的镜像变成只有 20MB 的镜像,甚至压缩上传到 DockerHub 后大小只有 10MB!
185185

@@ -202,7 +202,7 @@ EXPOSE 3000
202202
ENTRYPOINT ["/main"]
203203
```
204204

205-
需要注意 `main.go` 文件需要和 `Dockerfile` 文件在同一个目录下,执行下方 `docker build` 命令,第一次需要耐心等待拉取基础镜像。并且**需要注意将 `guangzhengli` 替换成自己的 `DockerHub` 账号名称**。 这样我们后续可以推送镜像到自己注册的 `DockerHub` 仓库当中。
205+
需要注意 `main.go` 文件需要和 `Dockerfile` 文件在同一个目录下,执行下方 `docker build` 命令,第一次需要耐心等待拉取基础镜像。并且**需要注意将命令中 `guangzhengli` 替换成自己的 `DockerHub` 注册的账号名称**。 这样我们后续可以推送镜像到自己注册的 `DockerHub` 仓库当中。
206206

207207
```shell
208208
docker build . -t guangzhengli/hellok8s:v1
@@ -233,13 +233,15 @@ docker run -p 3000:3000 --name hellok8s -d guangzhengli/hellok8s:v1
233233
docker push guangzhengli/hellok8s:v1
234234
```
235235

236-
经过这一节的练习,有没有对容器的强大有一个初步的认识呢?可以想象当你想部署一个更复杂的服务时,例如 Nginx,MySQL,Redis。你只需要到 [DockerHub 搜索](https://hub.docker.com/search?q=) 中搜索对应的镜像,通过 `docker pull` 下载镜像,`docker run` 启动服务即可!而无需关系依赖和各种配置
236+
经过这一节的练习,有没有对容器的强大有一个初步的认识呢?可以想象当你想部署一个更复杂的服务时,例如 Nginx,MySQL,Redis。你只需要到 [DockerHub 搜索](https://hub.docker.com/search?q=) 中搜索对应的镜像,通过 `docker pull` 下载镜像,`docker run` 启动服务即可!而无需关心依赖和各种配置
237237

238238
## Pod
239239

240-
`pod` 是我们练习的第一个 k8s 资源,在了解 `pod``container` 的区别之前,我们可以先创建一个简单的 pod 试试,
240+
如果在生产环境中运行的都是独立的单体服务,那么 Container (容器) 也就够用了,但是在实际的生产环境中,维护着大规模的集群和各种不同的服务,服务之间往往存在着各种各样的关系。而这些关系的处理,才是手动管理最困难的地方。
241241

242-
我们先创建 `nginx.yaml` 文件。
242+
**Pod** 是我们将要创建的第一个 k8s 资源,也是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。在了解 `pod``container` 的区别之前,我们可以先创建一个简单的 pod 试试,
243+
244+
我们先创建 `nginx.yaml` 文件,编写一个可以创建 `nginx` 的 Pod。
243245

244246
```yaml
245247
# nginx.yaml
@@ -255,15 +257,25 @@ spec:
255257
256258
其中 `kind` 表示我们要创建的资源是 `Pod` 类型, `metadata.name` 表示要创建的 pod 的名字,这个名字需要是唯一的。 `spec.containers` 表示要运行的容器的名称和镜像名称。镜像默认来源 `DockerHub`。
257259

258-
我们运行第一条 k8s 命令 `kubectl apply -f nginx.yaml` 命令启动 pod。
260+
我们运行第一条 k8s 命令 `kubectl apply -f nginx.yaml` 命令来创建 `nginx` Pod。
261+
262+
接着通过 `kubectl get pods` 来查看 pod 是否正常启动。
263+
264+
最后通过 `kubectl port-forward nginx-pod 4000:80` 命令将 `nginx` 默认的 `80` 端口映射到本机的 `4000` 端口,打开浏览器或者 `curl` 来访问 `http://127.0.0.1:4000` , 查看是否成功访问 `nginx` 默认页面!
259265

260266
``` shell
261-
kubectl apply -f nginx.yaml
262-
```
267+
kubectl apply -f nginx.yaml
268+
# pod/nginx-pod created
269+
270+
kubectl get pods
271+
# nginx-pod 1/1 Running 0 6s
263272
264-
我们可以通过 `kubectl get pods` 来查看 pod 是否正常启动,
273+
kubectl port-forward nginx-pod 4000:80
274+
# Forwarding from 127.0.0.1:4000 -> 80
275+
# Forwarding from [::1]:4000 -> 80
276+
```
265277

266-
通过命令下面的命令来配置 `nginx` 的首页内容
278+
`kubectl exec -it` 可以用来进入 Pod 内容器的 Shell。通过命令下面的命令来配置 `nginx` 的首页内容
267279

268280
```shell
269281
kubectl exec -it nginx-pod /bin/bash
@@ -277,11 +289,11 @@ kubectl port-forward nginx-pod 4000:80
277289

278290
### Pod 与 Container 的不同
279291

280-
回到 `pod` 和 `container` 的区别,我们会发现刚刚创建出来的资源如下图所示,在最内层是我们的服务 `nginx`,运行在 `container` , `container` (容器) 的本质是进程,而 `pod` 是管理这一组进程的资源。
292+
回到 `pod` 和 `container` 的区别,我们会发现刚刚创建出来的资源如下图所示,在最内层是我们的服务 `nginx`,运行在 `container` 容器当中, `container` (容器) 的本质是进程,而 `pod` 是管理这一组进程的资源。
281293

282294
![nginx_pod](https://cdn.jsdelivr.net/gh/guangzhengli/PicURL@master/uPic/nginx_pod.png)
283295

284-
所以自然 `pod` 可以管理多个 `container`,在某些场景例如 `container` 之间需要文件交换(日志收集),本地网络通信需求(使用 localhost 或者 Socket 文件进行本地通信),在这些场景中使用 `pod` 管理多个 `container` 就非常的推荐。如下图所示:
296+
所以自然 `pod` 可以管理多个 `container`,在某些场景例如服务之间需要文件交换(日志收集),本地网络通信需求(使用 localhost 或者 Socket 文件进行本地通信),在这些场景中使用 `pod` 管理多个 `container` 就非常的推荐。而这,也是 k8s 如何处理服务之间复杂关系的第一个例子,如下图所示:
285297

286298
![pod](https://cdn.jsdelivr.net/gh/guangzhengli/PicURL@master/uPic/pod.png)
287299

@@ -301,7 +313,9 @@ kubectl delete -f nginx.yaml
301313
# pod "nginx" deleted
302314
```
303315

304-
根据我们在 `container` 的那节构建的 `hellok8s:v1` 的镜像,同时参考 `nginx` pod 的资源定义,我们很容易的编写出 `hellok8s:v1` `pod` 的资源文件。并通过 `port-forward` 到本地的 `3000` 端口进行访问,最终得到字符串 `[v1] Hello, Kubernetes!`。
316+
最后,根据我们在 `container` 的那节构建的 `hellok8s:v1` 的镜像,同时参考 `nginx` pod 的资源定义,你能独自编写出 `hellok8s:v1` Pod 的资源文件吗。并通过 `port-forward` 到本地的 `3000` 端口进行访问,最终得到字符串 `[v1] Hello, Kubernetes!`。
317+
318+
`hellok8s:v1` Pod 资源定义和相应的命令如下所示:
305319

306320
```yaml
307321
# hellok8s.yaml
@@ -316,6 +330,8 @@ spec:
316330
```
317331

318332
```shell
333+
kubectl apply -f hellok8s.yaml
334+
319335
kubectl get pods
320336
321337
kubectl port-forward hellok8s 3000:3000

docs/container.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func main() {
2424

2525
在以前,如果你想将这段代码运行起来并测试一下。你首先需要懂得如何下载 golang 的安装包进行安装,接着需要懂得 `golang module` 的基本使用,最后还需要了解 golang 的编译和运行命令,才能将该代码运行起来。甚至在过程中,可能会因为环境变量问题、操作系统问题、处理器架构等问题导致编译或运行失败。
2626

27-
但是通过容器技术,只需要上面的代码,附带着对应的容器 `Dockerfile` 文件,那么你就不需要 golang 的任何知识,也能将代码顺利运行起来。
27+
但是通过 Container (容器) 技术,只需要上面的代码,附带着对应的容器 `Dockerfile` 文件,那么你就不需要 golang 的任何知识,也能将代码顺利运行起来。
2828

2929
> Container (容器) 是一种沙盒技术。它是基于 Linux 中 Namespace / Cgroups / chroot 等技术结合而成,更多技术细节可以参看这个视频 [如何自己实现一个容器](https://www.youtube.com/watch?v=8fi7uSYlOdc)
3030

0 commit comments

Comments
 (0)