Docker 与 K8S学习笔记(十八)—— Pod的使用
Pod 是一组紧密关联的容器集合,它们共享IPC、Network和UTS namespace,是 Kubernetes 调度的基本单元。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
一、Pod的定义
这里还是以我们之前做的webapp为例定义一个Pod,这是一个最简单的Pod定义
- apiVersion: v1
- kind: Pod
- metadata:
- name: webapp
- labels:
- app: webapp
- spec:
- containers:
- - name: webapp
- image: 172.16.194.135:5000/webapp:latest
- ports:
- - containerPort: 5000
关于Pod的定义比较重要的就是kind、spec.containers,kind就是定义资源类型、在spec.containers中主要定义容器所使用的镜像,这里可以定义多个容器。
二、Pod的基本使用
在使用Pod前我们需要注意,在Kubernetes中对于长时间运行的容器的要求是:其主程序需要一直在前台运行。如果主程序运行在后台,则Kubernetes会认为Pod执行结束,将会销毁Pod。以webapp镜像为例,它的Dockerfile如下:
- FROM java:8
- WORKDIR /opt/soft/
- EXPOSE 4567
- COPY webapp-1.0-SNAPSHOT.jar /opt/soft/webapp.jar
- ENTRYPOINT ["java", "-jar", "/opt/soft/webapp.jar"]
接下来,我们尝试一下Pod中多容器的场景,我们的Pod包含两个容器:webapp和busybox,Pod定义如下:
- apiVersion: v1
- kind: Pod
- metadata:
- name: webapp
- labels:
- app: webapp
- spec:
- containers:
- - name: webapp
- image: 172.16.194.135:5000/webapp:1.0
- ports:
- - containerPort: 5000
- - name: busybox
- image: busybox
- command: ["sh", "-c", "top"]
注意:busybox容器中我们定义了启动命令top,这样做就是为了确保busybox容器始终在前台运行top命令,避免容器直接被销毁。
我们创建Pod,并通过describe可以清楚看到这两个容器的创建过程:
- $ sudo kubectl create -f webapp_pod.yaml
- pod/webapp created
- $ sudo kubectl describe pod webapp
- Name: webapp
- Namespace: default
- Priority: 0
- Node: ayato/172.16.194.135
- Start Time: Sat, 08 Jan 2022 05:49:38 +0000
- Labels: app=webapp
- Annotations: <none>
- Status: Running
- IP: 172.17.0.6
- IPs:
- IP: 172.17.0.6
- Containers:
- webapp:
- Container ID: docker://9c68ef7019126b65e2feba5d4d69e55997a9e573ce585b0bbb6a7cfe2fe20b31
- Image: 172.16.194.135:5000/webapp:1.0
- Image ID: docker-pullable://172.16.194.135:5000/webapp@sha256:df3a447a013ada0642dec67bb31976f42f1a0699a68873d0452f514fa24e5c77
- Port: 5000/TCP
- Host Port: 0/TCP
- State: Running
- Started: Sat, 08 Jan 2022 05:49:40 +0000
- Ready: True
- Restart Count: 0
- Environment: <none>
- Mounts:
- /var/run/secrets/kubernetes.io/serviceaccount from default-token-pcr2h (ro)
- busybox:
- Container ID: docker://0dfd00b5fa8e419bfe0b4a43595c83cb1d4986980914865ae3371e1724c7f568
- Image: busybox
- Image ID: docker-pullable://busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
- Port: <none>
- Host Port: <none>
- Command:
- sh
- -c
- top
- State: Running
- Started: Sat, 08 Jan 2022 05:49:45 +0000
- Ready: True
- Restart Count: 0
- Environment: <none>
- Mounts:
- /var/run/secrets/kubernetes.io/serviceaccount from default-token-pcr2h (ro)
- Conditions:
- Type Status
- Initialized True
- Ready True
- ContainersReady True
- PodScheduled True
- Volumes:
- default-token-pcr2h:
- Type: Secret (a volume populated by a Secret)
- SecretName: default-token-pcr2h
- Optional: false
- QoS Class: BestEffort
- Node-Selectors: <none>
- Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
- node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal Scheduled 3m50s default-scheduler Successfully assigned default/webapp to ayato
- Normal Pulled 3m49s kubelet Container image "172.16.194.135:5000/webapp:1.0" already present on machine
- Normal Created 3m48s kubelet Created container webapp
- Normal Started 3m48s kubelet Started container webapp
- Normal Pulling 3m48s kubelet Pulling image "busybox"
- Normal Pulled 3m44s kubelet Successfully pulled image "busybox" in 4.516692787s
- Normal Created 3m44s kubelet Created container busybox
- Normal Started 3m43s kubelet Started container busybox
我们之前说过同一个Pod中的容器共享网络,也就是说我们在busybox容器中可以通过localhost访问webapp的接口,我们尝试一下:
- $ sudo kubectl exec -it webapp -c busybox /bin/sh
- kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
- / # wget http://localhost:4567/api/hello
- Connecting to localhost:4567 (127.0.0.1:4567)
- saving to 'hello'
- hello 100% |******************************************************************************************| 15 0:00:00 ETA
- 'hello' saved
- / # cat hello
- Hello my friend/ #
三、Pod容器共享Volume
同一个Pod中的容器能够共享Pod级别的Volume,Volume可以被定义为各种类型,多个容器分别进行挂载操作。我们还是以webapp和busybox为例,webapp向volume中写log,busybox通过tail命令读log,Pod定义如下:
- apiVersion: v1
- kind: Pod
- metadata:
- name: webapp
- labels:
- app: webapp
- spec:
- containers:
- - name: webapp
- image: 172.16.194.135:5000/webapp:1.0
- ports:
- - containerPort: 5000
- volumeMounts:
- - name: webapp-logs
- mountPath: /tmp
- - name: busybox
- image: busybox
- command: ["sh", "-c", "tail -f /logs/log.out"]
- volumeMounts:
- - name: webapp-logs
- mountPath: /logs
- volumes:
- - name: webapp-logs
- emptyDir: {}
我们通过Pod定义中可以看到:我们设置了一个Volume,名称为webapp-logs,type为emptyDir。容器webapp将Volume挂载到/tmp目录,因为webapp配置了logback并会向/tmp中写日志。容器busybox将Volume挂载到/logs目录,并通过tail命令持续读日志。我们启动Pod,并使用kubectl logs命令从busybox中读取tail的输出:
- $ sudo kubectl create -f webapp_pod.yaml
- pod/webapp created
- $ sudo kubectl logs webapp -c busybox
- 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)
- 06:30:27.821 [INFO ] [main] [org.demo.webapp.todolist.TodoListApplication] No active profile set, falling back to default profiles: default
- 06:30:30.060 [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat initialized with port(s): 4567 (http)
- 06:30:30.079 [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Initializing ProtocolHandler ["http-nio-4567"]
- 06:30:30.088 [INFO ] [main] [org.apache.catalina.core.StandardService] Starting service [Tomcat]
- 06:30:30.089 [INFO ] [main] [org.apache.catalina.core.StandardEngine] Starting Servlet engine: [Apache Tomcat/9.0.41]
- 06:30:30.359 [INFO ] [main] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]] Initializing Spring embedded WebApplicationContext
- 06:30:30.359 [INFO ] [main] [org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext] Root WebApplicationContext: initialization completed in 2407 ms
- 06:30:30.913 [INFO ] [main] [org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor] Initializing ExecutorService 'applicationTaskExecutor'
- 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)
- 06:30:32.956 [INFO ] [main] [org.apache.coyote.http11.Http11NioProtocol] Starting ProtocolHandler ["http-nio-4567"]
- 06:30:33.096 [INFO ] [main] [org.springframework.boot.web.embedded.tomcat.TomcatWebServer] Tomcat started on port(s): 4567 (http) with context path ''
- 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的使用的更多相关文章
- Docker 与 K8S学习笔记(八)—— 自定义容器网络
我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
- (C/C++学习笔记) 十八. 继承和多态
十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...
- Docker 与 K8S学习笔记(二十五)—— Pod的各种调度策略(上)
上一篇,我们学习了各种工作负载的使用,工作负载它会自动帮我们完成Pod的调度和部署,但有时我们需要自己定义Pod的调度策略,这个时候该怎么办呢?今天我们就来看一下如何定义Pod调度策略. 一.Node ...
- Docker 与 K8S学习笔记(十九)—— Pod的配置管理
我们在部署应用时常常会考虑将应用程序与配置文件相分离,这样可以使应用程序更好的复用,并且通过不同配置也能实现更灵活的功能.将应用制作成镜像后,我们可以在启动容器时通过环境变量或挂载文件的方式注入,但是 ...
- Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息
Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称.Pod IP.Node IP.Label.Annotation.资源限制等,我们经常会在应用程序中使用到这些数据 ...
- Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧
kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...
- Docker 与 K8S学习笔记(十)—— 容器的端口映射
我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...
- Docker 与 K8S学习笔记(十 二)容器间数据共享
数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...
随机推荐
- 『学了就忘』Linux日志管理 — 92、日志轮替
目录 1.日志文件的命名规则 2.logrotate配置文件说明 3.logrotate配置文件的主要参数 1.日志文件的命名规则 日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志 ...
- yarn 过程中遇到的问题
场景 项目中打包遇到了点问题,所以想删除原先装好的依赖包,重新yarn,结果神奇的报错了,无语... 遇到的问题 (1)error An unexpected error occurred: &quo ...
- JAVA发送邮件报错,返回500 Error: bad syntax问题
把项目部署在Linux系统的centos服务器,发送邮件报错了. 500 Error: bad syntax 处理办法 [root@master bin]# hostname master 显示 ma ...
- nim_duilib(20)之即刻(1)
note 一个基于nim_duilib仿wechat的IM. 主界面 样式 美工差了. 布局 整体为水平布局,左边的深灰色区域(frame_left),右侧的light white区域(frame_r ...
- 【LeetCode】1001. Grid Illumination 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 哈希 日期 题目地址:https://leetcod ...
- 【授课录屏】JavaScript高级(IIFE、js中的作用域、闭包、回调函数和递归等)、MySQL入门(单表查询和多表联查)、React(hooks、json-server等) 【可以收藏】
一.JavaScript授课视频(适合有JS基础的) 1.IIFE 2.js中的作用域 3.闭包 4.表达式形式函数 5.回调函数和递归 资源地址:链接:https://pan.baidu.com/s ...
- 第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的?
第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的? 注意:这篇博客是由follow论密码计算中消除错误的重要性(On the importance of Eliminating E ...
- 深入理解Java虚拟机二:垃圾收集与内存分配
垃圾收集:垃圾收集要完成三件事,包括哪些内存需要回收,什么时候回收及如何回收. 1.需要回收的内存判定:没有引用指向原先分配给某个对象的内存时,则该内存是需要回收的垃圾 Java垃圾收集器在对内存进行 ...
- [opencv]常用阵列操作函数总结
/*=========================================================================*/ // 阵列操作 /*============ ...
- Java Web程序设计笔记 • 【第1章 Web应用程序】
全部章节 >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ...