栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

CKAD备战笔记(3)- 多容器Pod

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CKAD备战笔记(3)- 多容器Pod

CKAD备战笔记(3)- 多容器Pod
  • 为何需要多容器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 运行成功为止
Debug
  • kubectl describe pod/xxx是个非常强大的命令。比如能看到状态,原因,错误代码等。
  • kubectl logs pod/xxx 打印该pod的日志
  • kubectl debug pod/xxx 和kubectl exec一样, 进到Pod里面去,执行它的bash
>>> 本章kubectl命令整理

⚠️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
暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号