Pod 是一组紧密关联的容器集合,它们共享IPC、Network和UTS namespace,是 Kubernetes 调度的基本单元。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

一、Pod的定义

这里还是以我们之前做的webapp为例定义一个Pod,这是一个最简单的Pod定义

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: webapp
  5. labels:
  6. app: webapp
  7. spec:
  8. containers:
  9. - name: webapp
  10. image: 172.16.194.135:5000/webapp:latest
  11. ports:
  12. - containerPort: 5000

关于Pod的定义比较重要的就是kind、spec.containers,kind就是定义资源类型、在spec.containers中主要定义容器所使用的镜像,这里可以定义多个容器。

二、Pod的基本使用

在使用Pod前我们需要注意,在Kubernetes中对于长时间运行的容器的要求是:其主程序需要一直在前台运行。如果主程序运行在后台,则Kubernetes会认为Pod执行结束,将会销毁Pod。以webapp镜像为例,它的Dockerfile如下:

  1. FROM java:8
  2. WORKDIR /opt/soft/
  3. EXPOSE 4567
  4. COPY webapp-1.0-SNAPSHOT.jar /opt/soft/webapp.jar
  5. ENTRYPOINT ["java", "-jar", "/opt/soft/webapp.jar"]

接下来,我们尝试一下Pod中多容器的场景,我们的Pod包含两个容器:webapp和busybox,Pod定义如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: webapp
  5. labels:
  6. app: webapp
  7. spec:
  8. containers:
  9. - name: webapp
  10. image: 172.16.194.135:5000/webapp:1.0
  11. ports:
  12. - containerPort: 5000
  13. - name: busybox
  14. image: busybox
  15. command: ["sh", "-c", "top"]

注意:busybox容器中我们定义了启动命令top,这样做就是为了确保busybox容器始终在前台运行top命令,避免容器直接被销毁。

我们创建Pod,并通过describe可以清楚看到这两个容器的创建过程:

  1. $ sudo kubectl create -f webapp_pod.yaml
  2. pod/webapp created
  3. $ sudo kubectl describe pod webapp
  4. Name: webapp
  5. Namespace: default
  6. Priority: 0
  7. Node: ayato/172.16.194.135
  8. Start Time: Sat, 08 Jan 2022 05:49:38 +0000
  9. Labels: app=webapp
  10. Annotations: <none>
  11. Status: Running
  12. IP: 172.17.0.6
  13. IPs:
  14. IP: 172.17.0.6
  15. Containers:
  16. webapp:
  17. Container ID: docker://9c68ef7019126b65e2feba5d4d69e55997a9e573ce585b0bbb6a7cfe2fe20b31
  18. Image: 172.16.194.135:5000/webapp:1.0
  19. Image ID: docker-pullable://172.16.194.135:5000/webapp@sha256:df3a447a013ada0642dec67bb31976f42f1a0699a68873d0452f514fa24e5c77
  20. Port: 5000/TCP
  21. Host Port: 0/TCP
  22. State: Running
  23. Started: Sat, 08 Jan 2022 05:49:40 +0000
  24. Ready: True
  25. Restart Count: 0
  26. Environment: <none>
  27. Mounts:
  28. /var/run/secrets/kubernetes.io/serviceaccount from default-token-pcr2h (ro)
  29. busybox:
  30. Container ID: docker://0dfd00b5fa8e419bfe0b4a43595c83cb1d4986980914865ae3371e1724c7f568
  31. Image: busybox
  32. Image ID: docker-pullable://busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
  33. Port: <none>
  34. Host Port: <none>
  35. Command:
  36. sh
  37. -c
  38. top
  39. State: Running
  40. Started: Sat, 08 Jan 2022 05:49:45 +0000
  41. Ready: True
  42. Restart Count: 0
  43. Environment: <none>
  44. Mounts:
  45. /var/run/secrets/kubernetes.io/serviceaccount from default-token-pcr2h (ro)
  46. Conditions:
  47. Type Status
  48. Initialized True
  49. Ready True
  50. ContainersReady True
  51. PodScheduled True
  52. Volumes:
  53. default-token-pcr2h:
  54. Type: Secret (a volume populated by a Secret)
  55. SecretName: default-token-pcr2h
  56. Optional: false
  57. QoS Class: BestEffort
  58. Node-Selectors: <none>
  59. Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
  60. node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
  61. Events:
  62. Type Reason Age From Message
  63. ---- ------ ---- ---- -------
  64. Normal Scheduled 3m50s default-scheduler Successfully assigned default/webapp to ayato
  65. Normal Pulled 3m49s kubelet Container image "172.16.194.135:5000/webapp:1.0" already present on machine
  66. Normal Created 3m48s kubelet Created container webapp
  67. Normal Started 3m48s kubelet Started container webapp
  68. Normal Pulling 3m48s kubelet Pulling image "busybox"
  69. Normal Pulled 3m44s kubelet Successfully pulled image "busybox" in 4.516692787s
  70. Normal Created 3m44s kubelet Created container busybox
  71. Normal Started 3m43s kubelet Started container busybox

我们之前说过同一个Pod中的容器共享网络,也就是说我们在busybox容器中可以通过localhost访问webapp的接口,我们尝试一下:

  1. $ sudo kubectl exec -it webapp -c busybox /bin/sh
  2. kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
  3. / # wget http://localhost:4567/api/hello
  4. Connecting to localhost:4567 (127.0.0.1:4567)
  5. saving to 'hello'
  6. hello 100% |******************************************************************************************| 15 0:00:00 ETA
  7. 'hello' saved
  8. / # cat hello
  9. Hello my friend/ #

三、Pod容器共享Volume

同一个Pod中的容器能够共享Pod级别的Volume,Volume可以被定义为各种类型,多个容器分别进行挂载操作。我们还是以webapp和busybox为例,webapp向volume中写log,busybox通过tail命令读log,Pod定义如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: webapp
  5. labels:
  6. app: webapp
  7. spec:
  8. containers:
  9. - name: webapp
  10. image: 172.16.194.135:5000/webapp:1.0
  11. ports:
  12. - containerPort: 5000
  13. volumeMounts:
  14. - name: webapp-logs
  15. mountPath: /tmp
  16. - name: busybox
  17. image: busybox
  18. command: ["sh", "-c", "tail -f /logs/log.out"]
  19. volumeMounts:
  20. - name: webapp-logs
  21. mountPath: /logs
  22. volumes:
  23. - name: webapp-logs
  24. emptyDir: {}

我们通过Pod定义中可以看到:我们设置了一个Volume,名称为webapp-logs,type为emptyDir。容器webapp将Volume挂载到/tmp目录,因为webapp配置了logback并会向/tmp中写日志。容器busybox将Volume挂载到/logs目录,并通过tail命令持续读日志。我们启动Pod,并使用kubectl logs命令从busybox中读取tail的输出:

  1. $ sudo kubectl create -f webapp_pod.yaml
  2. pod/webapp created
  3. $ sudo kubectl logs webapp -c busybox
  4. 06:30:27.810 [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] Starting TodoListApplication v1.0-SNAPSHOT using Java 1.8.0_111 on webapp with PID 1 (/opt/soft/webapp.jar started by root in /opt/soft)
  5. 06:30:27.821 [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] No active profile set, falling back to default profiles: default
  6. 06:30:30.060 [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat initialized with port(s): 4567 (http)
  7. 06:30:30.079 [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Initializing ProtocolHandler ["http-nio-4567"]
  8. 06:30:30.088 [INFO ] [main] [org.apache.catalina.core.StandardService] Starting service [Tomcat]
  9. 06:30:30.089 [INFO ] [main] [org.apache.catalina.core.StandardEngine] Starting Servlet engine: [Apache Tomcat/9.0.41]
  10. 06:30:30.359 [INFO ] [main] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]] Initializing Spring embedded WebApplicationContext
  11. 06:30:30.359 [INFO ] [main] [org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext] Root WebApplicationContext: initialization completed in 2407 ms
  12. 06:30:30.913 [INFO ] [main] [org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] Initializing ExecutorService 'applicationTaskExecutor'
  13. 06:30:32.634 [WARN ] [main] [org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration] Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
  14. 06:30:32.956 [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Starting ProtocolHandler ["http-nio-4567"]
  15. 06:30:33.096 [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat started on port(s): 4567 (http) with context path ''
  16. 06:30:33.131 [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] Started TodoListApplication in 6.387 seconds (JVM running for 7.205)

关于Volume的类型,有如下几种:

1)emptyDir:emptyDir是在Pod分配到Node时创建的,它的初始内容为空,并且无须指定host上对应的目录文件,它是由Kubernetes自动分配的目录,当Pod销毁后,emptyDir中的数据也会被删除。一般可用作临时空间,存放应用程序临时数据。

2)hostPath:将宿主机中的文件或目录挂载到Pod中。通常用于应用永久数据的存储。

3)iscsi:将iSCSI存储设备上的目录挂载到Pod中。

4)nfs:将NFS上的目录挂载到Pod中。

5)glusterfs:将GlusterFS网络文件系统的目录挂载到Pod中。

6)rbd:将Ceph块设备共享存储挂载到Pod中。

7)gitRepo:通过挂载一个空目录,并从Git中克隆一个git仓库供Pod使用。

8)configmap:将配置数据挂载为容器中的文件。

9)secret:将Secret数据挂载为容器中的文件。

Docker 与 K8S学习笔记(十八)—— Pod的使用的更多相关文章

  1. Docker 与 K8S学习笔记(八)—— 自定义容器网络

    我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...

  2. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  3. (C/C++学习笔记) 十八. 继承和多态

    十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...

  4. Docker 与 K8S学习笔记(二十五)—— Pod的各种调度策略(上)

    上一篇,我们学习了各种工作负载的使用,工作负载它会自动帮我们完成Pod的调度和部署,但有时我们需要自己定义Pod的调度策略,这个时候该怎么办呢?今天我们就来看一下如何定义Pod调度策略. 一.Node ...

  5. Docker 与 K8S学习笔记(十九)—— Pod的配置管理

    我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能.将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是 ...

  6. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息

    Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称.Pod IP.Node IP.Label.Annotation.资源限制等,我们经常会在应用程序中使用到这些数据 ...

  7. Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧

    kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...

  8. Docker 与 K8S学习笔记(十)—— 容器的端口映射

    我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...

  9. Docker 与 K8S学习笔记(十 二)容器间数据共享

    数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...

随机推荐

  1. 『学了就忘』Linux日志管理 — 92、日志轮替

    目录 1.日志文件的命名规则 2.logrotate配置文件说明 3.logrotate配置文件的主要参数 1.日志文件的命名规则 日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志 ...

  2. yarn 过程中遇到的问题

    场景 项目中打包遇到了点问题,所以想删除原先装好的依赖包,重新yarn,结果神奇的报错了,无语... 遇到的问题 (1)error An unexpected error occurred: &quo ...

  3. JAVA发送邮件报错,返回500 Error: bad syntax问题

    把项目部署在Linux系统的centos服务器,发送邮件报错了. 500 Error: bad syntax 处理办法 [root@master bin]# hostname master 显示 ma ...

  4. nim_duilib(20)之即刻(1)

    note 一个基于nim_duilib仿wechat的IM. 主界面 样式 美工差了. 布局 整体为水平布局,左边的深灰色区域(frame_left),右侧的light white区域(frame_r ...

  5. 【LeetCode】1001. Grid Illumination 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 哈希 日期 题目地址:https://leetcod ...

  6. 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】

    一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...

  7. 第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的?

    第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的? 注意:这篇博客是由follow论密码计算中消除错误的重要性(On the importance of Eliminating E ...

  8. 深入理解Java虚拟机二:垃圾收集与内存分配

    垃圾收集:垃圾收集要完成三件事,包括哪些内存需要回收,什么时候回收及如何回收. 1.需要回收的内存判定:没有引用指向原先分配给某个对象的内存时,则该内存是需要回收的垃圾 Java垃圾收集器在对内存进行 ...

  9. [opencv]常用阵列操作函数总结

    /*=========================================================================*/ // 阵列操作 /*============ ...

  10. Java Web程序设计笔记 • 【第1章 Web应用程序】

    全部章节   >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ...