- 为何需要多容器Pod
- 多容器Pod的设计模式
- Sidecar
- Adapter
- Ambassador
- initContainer
- Debug
- >>> 本章kubectl命令整理
多Pod容器有多种 设计模式,包括 Ambassador, Adapter和 Sidecar。我们会一一对他们进行学习。 为何需要多容器Pod
将大型单体应用程序(monolith)解耦为称为微服务(microservices)的子组件的想法使我们能够开发和部署一组独立的小型可重用代码。 这种架构可以帮助我们根据需要扩大、缩小和修改每个服务,而不是修改整个应用程序。如下图:
(图片来源在这)
但是,有时您可能需要两个服务一起工作,例如 Web 服务器和日志服务。每个配对的 Web 服务器实例需要一个日志服务的实例。所以我们需要把这两个微服务放到同一个Pod中,以保证它们:
- 处于同一个生命周期(lifecycle):意味着同时被生成/销毁
- 分享同一个network:可以相互引用为localhost
- 访问同一个volume
当用户访问量增多,我们需要扩大应用规模的时候,我们只需多见几个Pod就可以了:
举例:多容器Pod的定义文件
apiVersion: v1 kind: Pod metadata: name: simple-webapp spec: # containers是一个数组,数组中的每个元素是一个container containers: - name: simple-webapp image: simple-webapp ports: - containerPort: 8080 - name: log-agent image: log-agent多容器Pod的设计模式 Sidecar
在同一个Pod中,给每个配对的 Web 服务器配一个日志服务的实例。然后将不同Pod中日志服务记录下来的日志发送到一个中央服务器。
Adapter是基于Sidecar设计模式的变种。唯一的区别是在发送日志到中央服务器之前,先对日志格式进行处理,以便中央服务器可以收到数据格式相同的对日志。
Ambassador假设你有dev,prod,test三个数据库,分别对应开发,生产和测试三个应用场景。如何判断当前环境,并选择正确的数据库呢?我们可以选择将此类逻辑外包给 Pod 中的某一个特定容器,该容器就扮演了一个**大使(Ambassador)**的角色。
⚠️ 这三种是不同的设计模式,当我们用yaml文件写Pod时,定义文件其实并没有区别!
initContainer我们之前提及的Pod中的Container都是在Pod起来之后就一直在运行的。Pod生Container生,Pod死Container死,在同一个生命周期。但还有一种应用场景,Container上的程序只需要跑一次,不需要整个生命周期都在执行。比如,把源代码从github上下载下来 – 这件事情就只需要做一次。initContainer就是解决办法。
对initContainer的定义和普通Container是类似的:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
# initContainers也放在一个数组里
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'git clone ;']
initContainer运行方式:
- POD首次创建时,会运行 initContainer,并且 initContainer 中的进程必须在普通容器启动之前运行完成!
- 如有多个initContainer,则会按序一个一个运行
- 如果有一个 initContainer 未能运行完成,则Kubernetes 会反复重启 Pod,直到initContainer 运行成功为止
- kubectl describe pod/xxx是个非常强大的命令。比如能看到状态,原因,错误代码等。
- kubectl logs pod/xxx 打印该pod的日志
- kubectl debug pod/xxx 和kubectl exec一样, 进到Pod里面去,执行它的bash
暑期编程PK赛 得CSDN机械键盘等精美礼品!⚠️k可以作为kubectl的缩写使用
YAML语法
command: - sh - -c - sleep 20与下面这种写法相同:
command: ["sleep", "20"]
修改Pod
除了(1)输出yaml(2)删除旧Pod(3)从yaml文件新建Pod的方法之外,还有一种更简单的方法:
- k edit pod/xxx这里你会得到提示信息说Pod无法被直接修改,你的改变被暂时存到了/tmp/kubectl-edit-xxxx.yaml文件中
- k replace --force -f /tmp/kubectl-edit-xxxx.yaml强制用新的YAML文件代替旧的Pod



