[云原生] k8s之pod容器

一、pod的相关知识

1.1 Pod基础概念

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。

1.2 k8s中pod的两种使用方式 

(1)一个pod中运行一个容器。"每个po中一个容器"的模式是最常见的用法:在这种使用方式中,你可以把pod想象成是单个容器的封装,kterentes管理的是Pod而不是直接管理容器。

(2)在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个servie单位,比如一个容器共享文件,另一个"sidecar"容器(边车容器)来更新这些文件。Pod将这些突器的存储资源作为一个实体来管理 

1.3 pod 容器的常规使用流程 

一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一该进程在容器中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容个讲程,器生命固期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统1进程的管控类进程,以树状结构完成多进程的生命周期管理。

运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器其享Network、0TS及IPC命令间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信。 

Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器( 也可称为父容器) pause就是为了管理Pod容器间的共享操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,是它提供整个Pod的Linux命名空间的基础。二来启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程),并回收僵尸进程。

1.4 k8s中pod结构设计的巧妙用意

(1)在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了,此时是算整体挂了么?那么引入与业务无关的Pause容器作为Pod的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。
(2)Pod里的多个应用容器共享Pause容器的IP,共享Pause容器挂载的Volume,这样简化了应用容器之间的通信问题,也解决了容器之间的文件共享问题。

通常把Pod分为三类 

(1)控制器管理的Pod:由scheduler调度到node节点运行的;被控制器管理的;有自愈能力,一旦Pod挂掉了,会被控制器重新拉起;有副本管理、滚动更新等功能
                 创建命令:kubectl create deployment ....     控制器有 deployment  statefulset   deamonset 
(2)自主独立的Pod:由scheduler调度到node节点运行的;不被控制器管理的;没有自愈能力,一旦Pod挂掉了,不会被重新拉起;没有副本管理、滚动更新等功能
               创建:kubectl run
(3)静态Pod:不由scheduler调度到node节点运行的,而是由kubelet自行管理的;始终与kubelet运行在同一个node节点上;通过向apiserver发送请求无法直接删除的
         在node节点的/etc/kubernetes/manifests目录中放置Pod的yaml配置文件,kubelet就会自动根据yaml配置文件创建静态Pod 

二、容器的分类

 2.1  pause基础容器(infrastructure container)

  • 维护整个Pod网络和存储空间
  • 启动一个容器时,k8s会自动启动一个基础容器

(1)查看pause容器的基础镜像

docker images

(2)配置kubelet使用阿里云的镜像

#查看pause配置镜像文件
cat /etc/sysconfig/kubelet(kubeadmin)cat /opt/kubernetes/cfg/kubelet (二进制)

#配置修改为阿里的官方pause镜像源
cat > /etc/sysconfig/kubelet << EOFKUBELET_EXTRA_ARGS=--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF
pause容器的作用 
  • 在pod中担任Linux命名空间( 如网络命令空间)共享的基础
  • 启用PID命名空间,开启init进程。

网络:
每个Pod都会被分配一个唯一的IP地址。Pod中的所 有容器共享网络空间,包括IP地址和端口。Pod内 部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)

存储:
可以Pod指定多个共享的Volume. Pod中 的所有容器都可以访问共享的Volume,Volume 也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。

总结:
每个Pod都有一个特殊的被称为“基础容器"的Pause容器。Pause 容器对应的镜像属于Kubernetes平台的- - 部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户应用容器。 

2.2 init初始化容器

每个 pod中可以包含多个容器, 应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。

Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • 每个都必须在下一个启动之前成功完成。

如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。 然而,如果 Pod 对应的 restartPolicy 值为 "Never",并且 Pod 的 Init 容器失败, 则 Kubernetes 会将整个 Pod 状态设置为失败。

为 Pod 设置 Init 容器需要在pod规则中添加 initContainers 字段, 该字段以 container类型对象数组的形式组织,和应用的 containers 数组同级相邻。 参阅 API 参考的容器章节了解详情。

Init 容器的状态在 status.initContainerStatuses 字段中以容器状态数组的格式返回 (类似 status.containerStatuses 字段)。

2.3 init容器和普通容器的区别 

Init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。 然而,Init 容器对资源请求和限制的处理稍有不同,在下面资源节有说明。

同时 Init 容器不支持 lifecyclelivenessProbereadinessProbe 和 startupProbe, 因为它们必须在 Pod 就绪之前运行完成。

如果为一个 Pod 指定了多个 Init 容器,这些容器会按顺序逐个运行。 每个 Init 容器必须运行成功,下一个才能够运行。当所有的 Init 容器运行完成时, Kubernetes 才会为 Pod 初始化应用容器并像平常一样运行。

2.4 Init 容器的使用 

因为 Init 容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。 例如,没有必要仅为了在安装过程中使用类似 sedawkpython 或 dig 这样的工具而去 FROM 一个镜像来生成一个新的镜像。

  • 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。

  • 与同一 Pod 中的多个应用容器相比,Init 容器能以不同的文件系统视图运行。因此,Init 容器可以被赋予访问应用容器不能访问的 Secret的权限。

  • 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。 一旦前置条件满足,Pod 内的所有的应用容器会并行启动。

  • Init 容器可以安全地运行实用程序或自定义代码,而在其他方式下运行这些实用程序或自定义代码可能会降低应用容器镜像的安全性。 通过将不必要的工具分开,你可以限制应用容器镜像的被攻击范围

运行特例
  • 在Pod启动过程中,Init容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。
  • 如果由于运行时或失败退出,将导致容器启动失败,它会根据Podl的restartPolicy指定的策略(该策略又分为 Always , Never ,OnFailure)进行重试。然而,如果Pod的restartPolicy设置为Always,Init容器失败时会使用RestartPolicy策略。
  • 在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true。
  • 如果Pod重启,所有Init容器必须重新执行。
  • 对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image字段,等价于重启该Pod。
  • Init容器具有应用容器的所有字段。除了readinessProbe,因为Tnit容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行。
  • 在Pod中的每个app和Init容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。

2.5 应用容器(业务容器,Maincontainer) 

 提供应用程序业务

 应用容器是在所有init容器都成功的完成启动退出后才会启动;如果Pod定义了多个应用容器,它们是并行启动的

三、模拟演练

官网模板地址:Init 容器 | Kubernetes

 编写业务容器加初始化容器的demo:

vim nginx_init.yaml 
apiVersion: v1
kind: Pod
metadata:name: myapp01namespace: default
spec:containers:- image: nginx:1.41name: nginxports:- containerPort: 80protocol: TCPinitContainers:- name: init-test1image: busybox:1.28command: ['sh', '-c', "until nslookup test1 ; do echo waiting is for  test1 && sleep 5 ; done " ]- name: init-test2image: busybox:1.28command: ['sh', '-c', "until nslookup test2 ; do echo waiting is for  test2 && sleep 5 ; done " ]kubectl apply -f nginx_init.yaml 

kubectl describe pods myapp01

进行声明式资源编写:

vim svc-init.yamlapiVersion: v1
kind: Service
metadata:name: test1namespace: defaultlabels:app: nginx
spec:ports:- port: 80selector:app: nginxkubectl aaply -f svc-init.yaml

vim svc-init.yamlapiVersion: v1
kind: Service
metadata:name: test2namespace: defaultlabels:app: busybox
spec:ports:- port: 80selector:app: busyboxkubectl apply -f svc-init.yaml

四、pod的镜像拉取策略 

4.1 镜像拉取说明 

当你在创建容器时会针对指定的镜像来进行容器的创建,所以pod的创建是以镜像为基础。当你在拉取镜向不指定仓库的主机名,Kubernetes 认为你在使用 Docker 公共仓库。

在镜像名称之后,你可以添加一个标签(Tag)(与使用 docker 或 podman 等命令时的方式相同)。 使用标签能让你辨识同一镜像序列中的不同版本。

镜像标签可以包含小写字母、大写字母、数字、下划线(_)、句点(.)和连字符(-)。 关于在镜像标签中何处可以使用分隔字符(_- 和 .)还有一些额外的规则。 如果你不指定标签,Kubernetes 认为你想使用标签latest

4.2 镜像拉取的策略 

首先在资源式声明中存在着imagePullPolicy的字段,它的value决定着k8s创建容器时拉取镜像的方式策略。【此字段所在位置也说明了在声明式yaml中,imagePullPolicy是包含containers中】

kubectl explain pod.spec.containers.imagePullPolicy

如图所示,这三种便是k8s拉取镜像的三种策略:

imagePullPolicy(与image字段同一层级)

(1)IfNotPresent:优先使用node节点本地已存在的镜像,如果本地没有则从仓库拉取镜像。是标签为非latest的镜像的默认拉取策略
(2)Always:总是从仓库拉取镜像,无论node节点本地是否已存在镜像。是标签为latest或无标签的镜像的默认拉取策略
(3)Never:仅使用node节点本地镜像,总是不从仓库拉取镜像。
 

注意:如果没有显式设定的话, Pod 中所有容器的默认镜像拉取策略是IfNotPresent。但是也存在着默认策略选择Always的情况。

  • 如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latest, imagePullPolicy 会自动设置为 Always
  • 如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always
  • 如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent

此外:

在生产环境中部署容器时,你应该避免使用 :latest 标签,因为这使得正在运行的镜像的版本难以追踪,并且难以正确地回滚。(难以追溯版本,且latest一直会不断迭代更新,给版本维护照成困扰) 

4.3 镜像拉取策略的设置操作 

 (1)Never策略的使用
kubectl run app-test --image=nginx:1.14  --dry-run=client -o yaml > demo1.yaml
vim demo1.yaml apiVersion: v1
kind: Pod
metadata:name: app-test
spec:containers:- image: nginx:1.10name: app-testimagePullPolicy: Never

(2)IfNotPresent策略在本地无镜像的情况下使用 
apiVersion: v1
kind: Pod
metadata:name: app-test
spec:containers:- image: nginx:1.14name: app-testimagePullPolicy: IfNotPresent

#查看详细的pod信息,其中也有日志的作用
kubectl describe pod  app-test

 

(3) IfNotPresent策略在本地有镜像的情况下使用

(4)再次使用Never策略进行测试  

(5)Always策略  

五、Pod容器的3种重启策略 

restartPolicy(与containers字段同一层级)

Always:当Pod容器退出时,总是重启容器,无论容器退出状态码如何。是默认的容器重启策略
OnFailure:当Pod容器异常退出时(容器退出状态码为非0),才会重启容器;正常退出的容器(容器退出状态码为0)不重启
Never:当Pod容器退出时,总是不重启容器,无论容器退出状态码如何

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2815663.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 &#xff08;最多只能有128个字符&#xff09;Unicode &#xff08;用于表示世界上几乎所有的文字和符号&#xff09;URL编码 &#xff08;解决服务器只能识别ASCII字符的问题&#xff09;实现&#xff1a;编码_URLEncoder实现&#xf…

Python3中真真假假True、False、None等含义详解

在Python中&#xff0c;不仅仅和类C一样的真假类似&#xff0c;比如1代表真&#xff0c;0代表假。Python中的真假有着更加广阔的含义范围&#xff0c;Python会把所有的空数据结构视为假&#xff0c;比如 [] (空列表)、 {} &#xff08;空集合&#xff09;、 &#xff08;空字符…

机器学习专项课程03:Unsupervised Learning, Recommenders, Reinforcement Learning笔记 Week01

Week 01 of Unsupervised Learning, Recommenders, Reinforcement Learning 本笔记包含字幕&#xff0c;quiz的答案以及作业的代码&#xff0c;仅供个人学习使用&#xff0c;如有侵权&#xff0c;请联系删除。 课程地址&#xff1a; https://www.coursera.org/learn/unsupervi…

精读《使用 css 变量生成颜色主题》

作者&#xff1a;五灵 本周工作中遇到类似颜色主题的问题&#xff0c;在查资料的时候&#xff0c;看到这个视频&#xff0c;觉得讲得很清楚&#xff0c;而且趣味性丰富&#xff0c;所以想拿出来讲讲这个很有意思的主题。 视频链接&#xff1a; CSSconf EU 2018 | Dag-Inge Aas…

STM32标准库——(12)USART串口协议

1.全双工、半双工及单工通讯 2.同步与异步通讯 在同步通讯中&#xff0c;收发设备双方会使用一根信号线表示时钟信号&#xff0c;在时钟信号的驱动下双方进行协调&#xff0c; 同步数据&#xff0c;见图 同步通讯。 通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线…

循环结构:for循环,while循环,do-while,死循环

文章目录 for循环for案例&#xff1a;累加for循环在开发中的常见应用场景 whilewhile循环案例&#xff1a; for和while的区别&#xff1a;do-while三种循环的区别小结死循环 快捷键 ctrlaltt for循环 看循环执行多少次&#xff0c;就看有效数字有几个 快捷键 fori 示例代码&am…

11.以太网交换机工作原理

目录 一、以太网协议二、以太网交换机原理三、交换机常见问题思考四、同网段数据通信全过程五、跨网段数据通信全过程六、关键知识七、调试命令 前言&#xff1a;在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以…

java多线程编程(学习笔记)入门

一、多线程创建的三种方式 (1)通过继承Thread本身 (2)通过实现runnable接口 (3)通过 Callable 和 Future 创建线程 其中&#xff0c;前两种不能获取到编程的结果&#xff0c;第三种能获取到结果 二、常见的成员方法 方法名称说明String getName()返回此线程的名称void setNam…

练习 2 Web [ACTF2020 新生赛]BackupFile 1

[ACTF2020 新生赛]BackupFile 1 Web常规题目 首先尝试查找常见的前端页面index.php之类的&#xff0c;没找到 题目有个“BackupFile”——备份文件 尝试用工具遍历查找相关的文件 御剑没扫出来&#xff0c;搜索搭建好dirsearch后&#xff0c;扫出来的index.php.bak 扫描工…

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…

D3D渲染画面扭曲

今天在项目中渲染出来的画面始终不对&#xff0c;工具PIX显示图元类型输出是对的&#xff0c;但是就是渲染画面不对&#xff0c;顶点着色器的输出就奇形怪状&#xff0c;查了一条才发现是观察投影矩阵的问题。 如果你也是看的D3D龙书&#xff0c;那么在不跟着书上打完代码就直接…

云原生架构技术揭秘:探索容器技术的奥秘

云原生的概念和演进都是围绕云计算的核心价值展开的&#xff0c;比如弹性、自动化、韧性&#xff0c;所以云原生所涵盖的技术领域非常丰富。 随着云计算技术的不断发展&#xff0c;云原生架构已经成为了新一代软件开发的重要趋势。本文将为您介绍云原生架构的相关技术&#xf…

蓝桥杯第十二届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题_蓝桥杯 - 蓝桥云课&#xff08;点击查看&#xff09; 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十二届比赛原题 1.比赛题目 2.题目解读 蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客 二、…

sylar高性能服务器-日志(P43-P48)内容记录

文章目录 P43&#xff1a;Hook01一、HOOK定义接口函数指针获取接口原始地址 二、测试 P44-P48&#xff1a;Hook02-06一、hook实现基础二、class FdCtx成员变量构造函数initsetTimeoutgetTimeout 三、class FdManager成员变量构造函数get&#xff08;获取/创建文件句柄类&#x…

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握与文件打开、关闭相关的函数&#xff0c;以及与读写操作相关的常用方法的…

【亚马逊云科技】通过Amazon CloudFront(CDN)快速访问资源

文章目录 前言一、应用场景二、【亚马逊云科技】CloudFront&#xff08;CDN&#xff09;的优势三、入门使用总结 前言 前面有篇文章我们介绍了亚马逊云科技的云存储服务。云存储服务主要用于托管资源&#xff0c;而本篇文章要介绍的CDN则是一种对托管资源的快速访问服务&#…

Py2neo查询neo4j周杰伦数据库中的节点、关系和路径教程

文章目录 py2neo介绍连接Neo4j数据库py2neo查询图数据库neo4j数据概览使用NodeMatcher查询节点使用RelationshipMatcher查询关系 通过执行Cypher语句查询 py2neo介绍 Neo4j是一款开源图数据库&#xff0c;Py2neo提供了使用Python语言访问Neo4j的接口。本文介绍了使用Py2neo的N…

python脚本实现全景站点矩阵转欧拉角

效果 脚本 import re import numpy as np import math import csv from settings import * # 以下是一个示例代码,可以输入3*3旋转矩阵,然后输出旋转角度:# ,输入3*3旋转矩阵# 计算x,y,z旋转角def rotation_matrix_to_euler_angles(R):

使用uniapp开发时自定义tabbar

预览图&#xff1a; 一、配置page.jsong中的tabbar&#xff08;这一步是必须的&#xff0c;因为我们在使用uni.switchTab()时必须要用到&#xff09; "tabBar": {"list": [{"pagePath": "pages/index/index","iconPath": &…

CI/CD笔记.Gitlab系列.`gitlab-ci.yml`中的头部关键字

CI/CD笔记.Gitlab系列 gitlab-ci.yml中的头部关键字 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136342897HuaW…