首页 > 其他分享 >k8s 深入篇———— pod 实战[六]

k8s 深入篇———— pod 实战[六]

时间:2023-06-24 21:57:30浏览次数:37  
标签:实战 容器 这个 定义 状态 nginx pod k8s Pod

前言

pod 实战一下,主要是一些例子。

正文

例子一

pod 实例的选择:

NodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段

NodeName:一旦 Pod 的这个字段被赋值,Kubernetes 项目就会被认为这个 Pod 已经经过了调度,调度的结果就是赋值的节点名字。

所以,这个字段一般由调度器负责设置,但用户也可以设置它来“骗过”调度器,当然这个做法一般是在测试或者调试的时候才会用到。

HostAliases:定义了 Pod 的 hosts 文件(比如 /etc/hosts)里的内容:

例如:

在这个 Pod 的 YAML 文件中,我设置了一组 IP 和 hostname 的数据。这样,这个 Pod
启动后,/etc/hosts 文件的内容将如下所示:

127.0.0.1 localhost
...
10.244.135.10 hostaliases-pod
10.1.2.3 foo.remote
10.1.2.3 bar.remote

如果设置:
shareProcessNamespace=true.

这就意味着这个 Pod 里的容器要共享 PID Namespace。

而在这个 YAML 文件中,我还定义了两个容器:一个是 nginx 容器,一个是开启了 tty 和stdin 的 shell 容器。

然后就运行成功了。

 kubectl exec -it nginx /bin/bash

如果一个 Pod 中有多个容器,使用 kubectl exec 进入容器时需要指定容器名称。可以使用以下命令指定容器名称:

kubectl exec -it <pod-name> -c <container-name> sh

其中,`<pod-name>` 是 Pod 的名称,`<container-name>` 是容器名称。如果不指定容器名称,默认进入第一个容器。

那么我们进入第二个容器看下,因为第一个容器没有安装ps等一些基本的命令。

stdin 是 Kubernetes 中容器的一个属性,用于指定容器是否需要一个标准输入(stdin)。

当 stdin 属性设置为 true 时,容器会打开一个 STDIN 文件描述符,并等待输入。这通常用于在容器中运行交互式应用程序,例如 bash shell。

当 stdin 属性设置为 false 时,容器不会打开 STDIN 文件描述符,并且不会等待输入。这通常用于在容器中运行后台进程,例如 Web 服务器或数据库。

需要注意的是,如果 stdin 属性设置为 true,而容器本身没有能力处理输入,那么容器将会无限期地等待输入,直到手动停止容器。因此,在使用 stdin 属性时,需要确保容器本身能够处理输入。

使用:

kubectl attach -it nginx -c shell

这里我们可以看到infra 程序,并且可以看到nginx,是因为shareProcessNamespace 为true了。

默认情况下,只有网络namespace 是共享的。

在这个 Pod 中,我定义了共享宿主机的 Network、IPC 和 PID Namespace。这就意味着,这个 Pod 里的所有容器,会直接使用宿主机的网络、直接与宿主机进行 IPC 通信、看到宿主机里正在运行的所有进程。

首先,是 ImagePullPolicy 字段。它定义了镜像拉取的策略。而它之所以是一个Container 级别的属性,是因为容器镜像本来就是 Container 定义中的一部分。

ImagePullPolicy 的值默认是 Always,即每次创建 Pod 都重新拉取一次镜像。另外,当容器的镜像是类似于 nginx 或者 nginx:latest 这样的名字时,ImagePullPolicy 也会被认为
Always。
而如果它的值被定义为 Never 或者 IfNotPresent,则意味着 Pod 永远不会主动拉取这个镜像,或者只在宿主机上不存在这个镜像时才拉取

其次,是 Lifecycle 字段。它定义的是 Container Lifecycle Hooks。顾名思义,Container Lifecycle Hooks 的作用,是在容器状态发生变化时触发一系列“钩子”。

我们来看这样一个例子:

这是一个来自 Kubernetes 官方文档的 Pod 的 YAML 文件。它其实非常简单,只是定义了一个 nginx 镜像的容器。

不过,在这个 YAML 文件的容器(Containers)部分,你会看到这个容器分别设置了一个 postStart 和 preStop 参数。

这是什么意思呢?先说 postStart 吧。它指的是,在容器启动后,立刻执行一个指定的操作。需要明确的是,postStart 定义的操作,虽然是在 Docker 容器 ENTRYPOINT 执行之后,但它并不严格保证顺序。

也就是说,在 postStart 启动时,ENTRYPOINT 有可能还没有结束。

当然,如果 postStart 执行超时或者错误,Kubernetes 会在该 Pod 的 Events 中报出该容器启动失败的错误信息,导致 Pod 也处于失败的状态。

而类似地,preStop 发生的时机,则是容器被杀死之前(比如,收到了 SIGKILL 信号)。

而需要明确的是,preStop 操作的执行,是同步的。所以,它会阻塞当前的容器杀死流程,直到这个 Hook 定义操作完成之后,才允许容器被杀死,这跟 postStart 不一样。

所以,在这个例子中,我们在容器成功启动之后,在 /usr/share/message 里写入了一句“欢迎信息”(即 postStart 定义的操作)。

而在这个容器被删除之前,我们则先调用了nginx 的退出指令(即 preStop 定义的操作),从而实现了容器的“优雅退出”。

Pod 生命周期的变化,主要体现在 Pod API 对象的Status 部分,这是它除了 Metadata和 Spec 之外的第三个重要字段。

其中,pod.status.phase,就是 Pod 的当前状态,它有

如下几种可能的情况:

  1. Pending。这个状态意味着,Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功。

  2. Running。这个状态下,Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至少有一个正在运行中。

  3. Succeeded。这个状态意味着,Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最为常见。

  4. Failed。这个状态下,Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。

这个状态的出现,意味着你得想办法 Debug 这个容器的应用,比如查看 Pod 的 Events和日志。

  1. Unknown。这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。

更进一步地,Pod 对象的 Status 字段,还可以再细分出一组 Conditions。这些细分状态的值包括:PodScheduled、Ready、Initialized,以及 Unschedulable。

它们主要用于描述造成当前 Status 的具体原因是什么。

比如,Pod 当前的 Status 是 Pending,对应的 Condition 是 Unschedulable,这就意味着它的调度出现了问题。

而其中,Ready 这个细分状态非常值得我们关注:它意味着 Pod 不仅已经正常启动(Running 状态),而且已经可以对外提供服务了。这两者之间(Running 和 Ready)是有区别的,你不妨仔细思考一下。

Pod 的这些状态信息,是我们判断应用运行情况的重要标准,尤其是 Pod 进入了非“Running”状态后,你一定要能迅速做出反应,根据它所代表的异常情况开始跟踪和定位,而不是去手忙脚乱地查阅文档

下一节k8s,进阶例子。

标签:实战,容器,这个,定义,状态,nginx,pod,k8s,Pod
From: https://www.cnblogs.com/aoximin/p/17501748.html

相关文章

  • GoLang图形用户界面编程实战(GUI编程)—fyne框架(三)
    fyne中文乱码的两种解决方法方法一(使用embed):embed是Go1.16新特性,以后会有专门的介绍。1、拷贝字体到项目目录项目根目录下新建resource目录,把字体文件拷贝到其中。2、在resource目录下新建resource_export.go文件。resource_export.go代码:packageresourceimport_"emb......
  • k8s进阶4-应用无损发布之健康检查
    一、配置探针kubernetes提供了三种探针(支持exec、tcp和http方式)来探测容器的状态:LivenessProbe:容器存活性检查,用于判断容器是否健康,告诉kubelet一个容器什么时候处于不健康的状态。如果LivenessProbe探针探测到容器不健康,则kubelet将删除该容器,并根据容器的重启策略做相应......
  • k8s 深入篇———— k8s 的pod[五]
    前言简单整理一下pod的相关知识。正文为什么我们需要pod。前面我们知道了k8s一个最重要的作用是解决容器的编排功能,那么为什么有一个pod的东西。这就是实际中遇到的问题。那就是容器和容器之间,那就是如何表达容器和容器之间的关系。就是有些场景下,容器与容器之间是存在关系......
  • 【人工智能技术专题】「入门到精通系列教程」零基础带你进军人工智能领域的全流程技术
    前言人工智能是一个庞大的研究领域。虽然我们已经在人工智能的理论研究和算法开发方面取得了一定的进展,但是我们目前掌握的能力仍然非常有限。机器学习是人工智能的一个重要领域,它研究计算机如何模拟或实现人类的学习行为,以获取新的知识或技能,并通过重新组织已有的知识结构来不断提......
  • k8s驱逐篇(6)-kube-controller-manager驱逐-NodeLifecycleController源码分析
    概述k8sv1.16版本中NodeController已经分为了NodeIpamController与NodeLifecycleController,本文主要介绍NodeLifecycleController。NodeLifecycleController主要功能有:(1)定期检查node的心跳上报,某个node间隔一定时间都没有心跳上报时,更新node的readycondition值为false或unkno......
  • Maven 入门实战(1)--简介及安装
    Maven是一种软件项目管理和理解工具;它基于项目对象模型(POM),从中央位置管理项目的构建、报告和文档,并帮助开发人员轻松管理依赖项并自动化构建过程。1、简介1.1、项目目录Maven使用约定优于配置的原则,提倡使用一个共同的标准目录结构。目录说明${basedir}项目根目录,存......
  • 【五子棋实战】第6章 调用接口进行联调
    【五子棋实战】第6章调用接口进行联调Ajax调用接口调用五子棋接口点击优化尾声更多待开发的功能Ajax调用接口  引入Jquery,使用JQ封装的ajax,demo如下:<scriptsrc="jquery-3.5.0.min.js"></script><script>$.ajax({ url:'http://localhost:5000/api/next_step',......
  • 【五子棋实战】第4章 部署五子棋计算接口到Window、Linux上
    【五子棋实战】第4章部署五子棋计算接口到Window、Linux上python项目打包成exe可执行文件##步骤一、安装pyinsatller##步骤二、使用pyinstaller打包Python程序##操作演示##注意事项!!python的Flask接口部署(Linux)##步骤一、安装必要的软件依赖##步骤二、安装Flask和......
  • TensorFlow10.2 卷积神经网络-CIFAR100 实战
    ▪Loaddatasets▪BuildNetwork▪Train▪Test这里先是进行卷积然后再进行全连接Loaddatasetsdefpreprocess(x,y):#[0~1]x=tf.cast(x,dtype=tf.float32)/255.y=tf.cast(y,dtype=tf.int32)returnx,y(x,y),(x_test,y_test)=dat......
  • K8S安装记录
    https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ 在master和worker节点上安装containerd、kubelet、kubeadm、kubectllsmod|grepbr_n......