K8s中pod詳解

目录

Yaml语法解析

Pod

 pod是如何被创建的

1.创建一个pod

2.创建一个多容器pod

进入容器

3.配置节点标签

4.Pod容器的交互

4.1创建pod,并做本地解析

 4.2pod共享进程

 4.3pod共享宿主机namespace

 5.钩子函数lifecycle

基础指令

# 查看对应资源: 状态
$ kubectl get <SOURCE_NAME> -n <NAMESPACE>   -o wide

# 查看对应资源: 事件信息
$ kubectl describe <SOURCE_NAME> <SOURCE_NAME_RANDOM_ID> -n <NAMESPACE>

# 查看pod资源: 日志
$ kubectl logs -f <SOURCE_NAME_RANDOM_ID> [CONTINER_NAME] -n <NAMESPACE>

# 创建资源: 根据资源清单
$ kubectl apply[or create] -f <SOURCE_FILENAME>.yaml

# 删除资源: 根据资源清单
$ kubectl delete -f <SOURCE_FILENAME>.yaml

# 修改资源: 根据反射出的etcd中的配置内容, 生产中不允许该项操作, 且命令禁止
$ kubectl edit <SOURCE_NAME> <SOURCE_NAME_RANDOM_ID> -n <NAMESPACE>

Yaml语法解析

YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。

YAML的语法比较简单,主要有下面几个:
1、大小写敏感
2、使用缩进表示层级关系
3、缩进不允许使用tab,只允许空格( 低版本限制 )
4、缩进的空格数不重要,只要相同层级的元素左对齐即可
5、'#'表示注释

YAML支持以下几种数据类型:
1、纯量:单个的、不可再分的值
2、对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
3、数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

补充说明:
1、书写yaml切记: 后面要加一个空格
2、如果需要将多段yaml配置放在一个文件中,中间要使用---分隔

 创建命名空间

vim test.yaml
apiVersion: v1
kind: Namespace
metadata:name: arenkubectl apply -f test.yaml# 如果通过命令行创建
$ kubectl create namespace webserver
# 删除名称空间[注意,这将删除名称空间下的所有资源]
$ kubectl delete namespace webserver

Pod

  Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元; Pod 中会启动一个或一组紧密相关的业务容器, 各个业务容器相当于Pod 中的各个进程, 此时就可以将Pod 作为虚拟机看待; 在创建 Pod 时会启动一个init容器, 用来初始化存储和网络, 其余的业务容器都将在init容器启动后启动, 业务容器共享init容器的存储和网络; Pod 只是一个逻辑单元, 并不是真实存在的“主机”, 这种类比主机的概念可以更好的符合现有互联网中几乎所有的虚拟化设计; 像之前运行在虚拟机中的 nginx、mysql、php均可以使用对应的镜像运行出对应的容器在Pod中, 来类比虚拟机中运行这三者;

  对于 Pod 而言, 在运行的过程中, k8s为了控制其生命周期的状态, 增加了容器探测指针资源限额期望状态保持多容器结合安全策略设定控制器受管故障处理策略 等; Pod在平时是不能够被单独创建的, 而是需要使用控制器对其创建, 这样可以时刻保持Pod的期望状态;

 在Kubernetes中所有的资源均可通过命令行参数或者资源清单[yaml/json]的方式进行创建和修改, 但由于Kubernetes属于声明式资源控制集群, 故大多管理Kubernetes集群的方式采用资源配置清单; 资源配置清单可以很好的追溯资源的原型和详细的配置, 且配合版本控制能够完成更好的溯源、回滚、发布等操作; 所以课程中所有的资源创建和修改都会采用资源配置清单的方式, 除部分命令行操作以外;

 pod是如何被创建的

  • step1: kubectl 向 k8s api server 发起一个create pod 请求

  • step2: k8s api server接收到pod创建请求后,不会去直接创建pod;而是生成一个包含创建信息的yaml。

  • step3: apiserver 将刚才的yaml信息写入etcd数据库。

  • step4: scheduler 查看 k8s api,判断:pod.spec.Node == null,若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最适合的node。并更新数据库

  • step5: node节点上的Kubelet通过监听数据库更新,发现有新的任务与自己的node编号匹配,则进行任务创建

1.创建一个pod

创建pod模板

kubectl  run    [pod名称]    --image=mysql --namespace=aren  --port=3306 --dry-run -o yaml
[root@kube-master kubernetes]#  vim mysql.yaml
apiVersion: v1
kind: Pod
metadata:name: mysqlnamespace: arenlabels:name: mysql
spec:containers:- name: mysqlimage: mysql:5.7ports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: "123456"- name: MYSQL_DATABASEvalue: "test"

2.创建一个多容器pod

[root@kube-master kubernetes]# vim test.yaml
---
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: arenlabels:name: nginx
spec:restartPolicy: OnFailurecontainers:- name: centosimagePullPolicy: IfNotPresentimage: 10.36.192.206:8088/library/centos:7.9.2009command: ["tail","-f","/dev/null"]- name: nginximagePullPolicy: IfNotPresentimage: 10.36.192.206:8088/library/nginx:1.20.2resources:limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80
# nodeName: kube-node1nodeSelector:kubernetes.io/hostname: kube-node2kubectl apply -f test.yaml

# 字段解析
restartPolicy
pod 重启策略,可选参数有:
1、Always:Pod中的容器无论如何停止都会自动重启
2、OnFailure: Pod中的容器非正常停止会自动重启
3、Never: Pod中的容器无论怎样都不会自动重启

imagePullPolicy:
镜像拉取策略,可选参数有:
1、Always:总是重新拉取
2、IfNotPresent:默认,如果本地有,则不拉取
3、Never:只是用本地镜像,从不拉取

nodeSelector:
节点选择器:可以指定node的标签,查看标签指令:

nodeSelector:
    kubernetes.io/hostname: kube-node2
nodeName:
节点名称: 可以指定node的名称进行调度
$ kubectl get node --show-labels

进入容器

 -n 指定命名空间 -c 指定pod中的容器

[root@kube-master ~]# kubectl  exec -it -n aren nginx -c centos /bin/bash

3.配置节点标签

添加标签
kubectl label nodes node3 name=value
删除标签
kubectl label nodes node3 name-

[root@kube-master ~]# kubectl  label nodes  kube-node1  type=cpus

 可以通过  nodeSelector:(节点选择器:可以指定node的标签,查看标签指令:)

nodeSelector:type=cpus

4.Pod容器的交互

4.1创建pod,并做本地解析
[root@kube-master ~]# vim host-alias.yamlapiVersion: v1
kind: Pod
metadata:labels:run: centosname: centosnamespace: default
spec:containers:- image: 10.36.192.206:8088/library/centos:7.9.2009name: centoscommand: - "tail"- "-f"- "/dev/null"hostAliases: - ip: "192.168.134.166"hostnames: - "kube-node1"- ip: "192.168.134.163"hostnames:- "kube-node2"# kubectl   apply -f host-alisa.yaml
# 字段解析
command:
启动容器时执行的指令,类似于docker run -it 镜像 tail -f /dev/nullhostAliases:
在容器中的/etc/hosts文件中配置本地解析

进入容器可以看到

 4.2pod共享进程

shareProcessNamespace: true  #共享进程名称空间

[root@kube-master ~]# vim pod.yaml---
apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: websitenamespace: aren
spec:shareProcessNamespace: truecontainers:- name: test-webimage: 10.36.192.206:8088/library/nginx:1.20.2ports:- containerPort: 80- name: busyboximage: 10.36.192.206:8088/library/busyboxstdin: truetty: true# kubectl  apply -f pod.yaml

1. 定义了 shareProcessNamespace=true
表示这个 Pod 里的容器要共享进程(PID Namespace)如果是false则为不共享。
2. 定义了两个容器:
一个 nginx 容器
一个开启了 tty 和 stdin 的 busybos 容器

在 Pod 的 YAML 文件里声明开启它们俩,等同于设置了 docker run 里的 -it(-i 即 stdin,-t 即 tty)参数。此 Pod 被创建后,就可以使用 shell 容器的 tty 跟这个容器进行交互了。

 可以在busybbox中看到nginx的进程

 4.3pod共享宿主机namespace

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

  hostNetwork: true  #共享宿主机网络    有端口可以直接访问宿主机ip
  hostIPC: true  #共享ipc通信
  hostPID: true  #共享宿主机的pid

[root@kube-master ~]# vim pod1.yaml
---
apiVersion: v1
kind: Pod
metadata:name: websitelabels:app: website
spec:hostNetwork: true hostIPC: truehostPID: truecontainers:- name: test-webimage: 10.36.192.206:8088/library/nginx:1.20.2ports:- containerPort: 80- name: busyboximage: 10.36.192.206:8088/library/busyboxstdin: truetty: true# kubectl apply -f pod1.yaml

查看详信息 ,发现与kube-node1共享

 5.钩子函数lifecycle

kubernetes 在主容器启动之后和删除之前提供了两个钩子函数:

  • post start:容器创建之后执行,如果失败会重启容器

  • pre stop:容器删除之前执行,执行完成之后容器将成功删除,在其完成之前会阻塞删除容器的操作

钩子函数的三种使用方式:

  • 第一种 exec 执行指令

lifecycle:postStart: exec:command:- cat- /etc/hosts
  • 第二种 在容器中请求端口

lifecycle:postStart:tcpSocket:port: 8080
  • 第三种 向容器发起http请求

   lifecycle:postStart:httpGet:path: /                  # URI地址port: 80                 # 端口号host: 192.168.96.10     # 主机地址  scheme: HTTP

 实例

[root@kube-master ~]# vim lifecycle.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx-lifecyclenamespace: defaultlabels:app: nginx
spec:containers:- name: nginx-lifecycleimage: nginx:1.16.1ports:- containerPort: 80protocol: TCPlifecycle:postStart:exec:command: ["/bin/sh", "-c", "echo '<h1>this is a nginx-lifecycle test page</h1>' > /usr/share/nginx/html/index.html"]preStop:exec:command: ["/bin/sh", "-c", "echo 'stop nginx 30 ' > /usr/share/nginx/html/index.html; sleep 30"]# kubectl  apply -f lifecycle.yaml 

查看


[root@kube-master kubernetes]# kubectl  get pod -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
nginx-lifecycle   1/1     Running   0          10s   10.244.9.98   kube-node1   <none>           <none>
[root@kube-master kubernetes]# curl 10.244.9.98 
<h1>this is a nginx-lifecycle test page</h1>
#删除pod
[root@kube-master kubernetes]#kubectl  delete pod nginx-lifecycle -n default[root@kube-master ~]#  curl 10.244.9.98
stop nginx 30 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

家委会的职责

家委会&#xff0c;起着至关重要的作用。然而&#xff0c;而很多人对家委会的职责并不清楚。 家委会是家长与学校之间的沟通桥梁。家委会成员需要积极与学校沟通&#xff0c;了解学校的各项政策和规定&#xff0c;并及时向家长传达。同时&#xff0c;家委会也需要收集家长的意见…

leetcode算法题:省份数量

leetcode算法题547 链接&#xff1a;https://leetcode.cn/problems/number-of-provinces 题目 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间…

立创EDA把三个单独的PCB合并成一个文件

[TOC](立创EDA把三个单独的PCB合并成一个文件 1.具体操作 1.具体操作 参考&#xff1a;立创社区 先选中PCB CTRLSHIFTC, CTRLSHIFTV** **

fcntl函数简介和使用

一、fcntl函数的作用 read函数是典型的阻塞模型&#xff0c;当缓冲区里的数据不就绪的时候&#xff0c;会一直阻塞等待。这是正常的&#xff0c;因为文件描述符默认是阻塞IO&#xff0c;而我们可以通过 fcntl 接口函数将文件描述符设置为非阻塞IO。 设置成非阻塞IO以后&#x…

发送java字节码的数据包

一些Java反序列化漏洞在利用时&#xff0c;要发送Java序列化值&#xff08;字节码&#xff09;到服务器。 我们在使用一些工具生成字节码后&#xff0c;可以通过python或者burp发送。 生成的字节码一般以两种形式存储&#xff1a; 1、二进制形式存储到 poc.ser 2、将字节码…

系统架构达人亲授:多电商活动从容应对的顶级秘籍!

大家好&#xff0c;我是小米&#xff0c;一个热爱技术分享的小伙伴。最近我参加了一场社招面试&#xff0c;遇到了一道非常有趣的题目&#xff1a;在面对多个电商活动时&#xff0c;从架构上需要做到什么支持呢&#xff1f;今天我就来和大家分享一下我的思考和解答。 引言 随…

关于面试总结--接口测试面试题

前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&#xff…

广州华锐互动:AI虚拟数字人为教培行业带来诸多变革和创新

随着科技的不断发展&#xff0c;人工智能技术已经逐渐渗透到各个行业&#xff0c;其中教育领域也不例外。近年来&#xff0c;AI虚拟数字人在教培行业的应用越来越广泛&#xff0c;为教育行业带来了诸多变革和创新。 广州华锐互动作为一家虚拟现实内容制作商&#xff0c;已开发了…

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中&#xff0c;如果后验分布 p&#xff08;θx&#xff09;与先验概率分布 p&#xff08;θ&#xff09;在同一概率分布族中&#xff0c;则先验和后验称为共轭分布&#xff0c;先验称为似然函数的共轭先验。 多…

尚硅谷Docker笔记-基础篇

B站视频&#xff1a;https://www.bilibili.com/video/BV1gr4y1U7CY 1.Docker简介 解决了运行环境和配置问题的软件容器 方便做持续集成并有助于整体发布的容器虚拟化技术 容器与虚拟机比较 Docker 容器是在操作系统层面上实现虚拟化&#xff0c;直接复用本地主机的操作系统…

防反接电路设计和保姆级实测

文末有封面图&#xff01;~&#xff01;~ 注意&#xff1a;正确的防反接电路在实验C ​​​​​​​ 前言 一、实验器材 二、实验步骤 正确的电路在实验C 1 实验A&#xff1a; 2 实际A数据&#xff1a; 3 实验A结论 4 实验B 5 实际B数据&#xff1a; 6 实际B结论&…

服务器感染了.DevicData-D-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 勒索病毒成为网络安全的严峻挑战&#xff0c;而最新的.DevicData-D-XXXXXXXX勒索病毒更是引起广泛关注。本文将深入介绍.DevicData-D-XXXXXXXX勒索病毒的特征&#xff0c;提供恢复被其加密的数据文件的方法&#xff0c;并分享预防措施&#xff0c;以确保您的数…

ubuntu or MacOS 源码安装 fmt fmtlib

1&#xff0c;前情 提醒这个源代码需要从release中下载 打包好的&#xff0c;而直接用git clone下载不了&#xff0c;可能github上的这个git clone的链接仅仅是给fmt lib的开发者使用的吧&#xff1b; 下载fmtlib的release源代码u下载fmtlib的release源代码 2&#xff0c;解压编…

Jmeter实现服务器端后台接口性能测试!

实现目的 在进行服务器端后台接口性能测试时&#xff0c;需要连接到Linux服务器端&#xff0c;然后通过命令调用socket接口&#xff0c;这个过程就需要用到jmeter的SSH Command取样器实现了。 脚本实现 设置CSV Data Set ConFig配置元件&#xff0c;参数化测试数据 设置SSH…

条件变量--使两个线程实现交替打印

一、介绍 什么是条件变量&#xff1f; 条件变量&#xff08;Condition Variable&#xff09;是多线程编程中用于线程间通信和同步的一种机制。它通常与互斥锁&#xff08;Mutex&#xff09;一起使用&#xff0c;用于解决线程竞争和避免忙等待的问题。&#xff08;条件变量不能…

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;用于存储文本信息。C标准库…

卫浴企业做网站的效果如何

卫浴产品无论工程还是家庭中都有较高需求度&#xff0c;相关品牌或经销商也不少&#xff0c;然而在实际经营中&#xff0c;卫浴品牌商家也面临着一些痛点&#xff1a; 1、品牌宣传拓客难 卫浴产品并不缺客户&#xff0c;但大小品牌众多&#xff0c;商家想要突围绝非易事&…

【Pytorch】学习记录分享2——Tensor基础,数据类型,及其多种创建方式

pytorch 官方文档 Tensor基础&#xff0c;数据类型&#xff0c;及其多种创建方式 1. 创建 Creating Tensor&#xff1a; 标量、向量、矩阵、tensor2. 三种方法可以创建张量&#xff0c;一是通过列表(list)&#xff0c;二是通过元组(tuple)&#xff0c;三是通过Numpy的数组(arra…

java 家教管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 家教管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

企业文档管理混乱?解密难题并找到高效解决方案!

由于大多数企业的内部文件都分散地存放在各员工电脑中&#xff0c;且没有使用文档管理系统&#xff0c;导致企业内部出现诸多文件安全隐患&#xff0c;例如&#xff1a; 1.文档分散存储在员工个人计算机中&#xff0c;当发生人事变动时文档常常遗失&#xff0c;且可能给企业造…