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: aren

 kubectl 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: mysql
  namespace: aren
  labels:
    name: mysql
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    ports:
      - containerPort: 3306
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: "123456"
      - name: MYSQL_DATABASE
        value: "test"

2.创建一个多容器pod

[root@kube-master kubernetes]# vim test.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: aren
  labels:
    name: nginx
spec:
  restartPolicy: OnFailure
  containers:
   - name: centos
     imagePullPolicy: IfNotPresent
     image: 10.36.192.206:8088/library/centos:7.9.2009
     command: ["tail","-f","/dev/null"]
   - name: nginx
     imagePullPolicy: IfNotPresent
     image: 10.36.192.206:8088/library/nginx:1.20.2
     resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
     ports:
      - containerPort: 80
# nodeName: kube-node1
  nodeSelector:
    kubernetes.io/hostname: kube-node2


kubectl 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.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: centos
  name: centos
  namespace: default
spec:
  containers:
  - image: 10.36.192.206:8088/library/centos:7.9.2009
    name: centos
    command: 
        - "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/null

hostAliases:
在容器中的/etc/hosts文件中配置本地解析

进入容器可以看到

 4.2pod共享进程

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

[root@kube-master ~]# vim pod.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: website
  labels:
    app: website
  namespace: aren
spec:
  shareProcessNamespace: true
  containers:
    - name: test-web
      image: 10.36.192.206:8088/library/nginx:1.20.2
      ports:
        - containerPort: 80
    - name: busybox
      image: 10.36.192.206:8088/library/busybox
      stdin: true
      tty: 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: website
  labels:
    app: website
spec:
  hostNetwork: true 
  hostIPC: true
  hostPID: true
  containers:
    - name: test-web
      image: 10.36.192.206:8088/library/nginx:1.20.2
      ports:
        - containerPort: 80
    - name: busybox
      image: 10.36.192.206:8088/library/busybox
      stdin: true
      tty: 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-lifecycle
  namespace: default
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-lifecycle
      image: nginx:1.16.1
      ports:
        - containerPort: 80
          protocol: TCP
      lifecycle:
        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.mfbz.cn/a/242516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员的养生之道:延寿健康的十大秘诀(上)

目录 1. 了解程序员健康问题 1.1 程序员健康问题概述 1.2 长时间坐姿对身体的影响 1.3 眼睛健康与程序员 1.4 压力管理与心理健康 2. 合理安排工作与休息时间 2.1 工作与休息的平衡 2.2 时间管理技巧 2.3 活动间隙的小窍门 2.4 养成良好的睡眠习惯 3. 均衡饮食&a…

【算法题】密钥格式化 (js)

!](https://img-blog.csdnimg.cn/direct/bf9a3d781a8043c997593260c0a8306f.png) 第一部分的字符可以少于… const str "5F3Z-2e-9w"; const str1 "2-5g-3-J"; function solution(num, str) {const arr str.split("-");const head arr[0];…

658. 找到 K 个最接近的元素

658. 找到 K 个最接近的元素 Java代码&#xff1a;滑窗 class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {List<Integer> list new ArrayList<>();for (int i 0; i < arr.length; i) {arr[i] arr[i] - x;}for(i…

Unity 通过鼠标控制模拟人物移动和旋转视角

要通过鼠标控制并模拟人物移动和转换视角&#xff0c;将会使用射线检测、鼠标点击和鼠标水平移动&#xff0c;配合物体旋转和移动方法共同实现。 首先搭建个由一个Plane地板和若干cube组成的简单场景&#xff1a; 其次创建一个Capsule作为移动物体&#xff0c;并把摄像头拉到该…

thinkphp6入门(13)-- 一对多关联模型

定义一对一关联&#xff0c;例如&#xff0c;一个用户都有多个工作经历。 一、两表 1.用户表:user 2.工作经验表&#xff1a;work_experience user表的id关联work_experience表的user_id。 注意看&#xff0c;user_id1的有2条工作经验 二、数据模型 主表模型&#xff1a;…

多边形的裁剪:一种基于有效边表的有效多边形裁剪算法的分析

我们可以考虑有下面的多边形 黑色边框就是区域就是裁剪下来的多边形区域&#xff0c;我们可以将裁剪区域与多边形区域的端点看作有效边表&#xff0c;显然对于左边界来说我们是要选取边界x值大的点作为新的多边形的边界&#xff0c;对于右边界我们是要选择x值小的点作为多边形的…

通过fpmarkets与自媒体导师学习经验,避免踩坑

举一个例子&#xff0c;从fpmarkets与自媒体导师学习的负面经验&#xff0c;避免各位投资者踩坑。这个要从fpmarkets刚踏入外汇交易市场的第二年说起&#xff0c;偶然的一次&#xff0c;当fpmarkets看到一个可以不用花钱就可以学习交易培训课程时&#xff0c;就如同中了大奖一样…

Windows内存管理机制

文章目录 Windows内存管理机制Windows基本架构物理地址和虚拟地址内存空间布局物理内存和虚拟内存基本概念分页机制 总结从内存中获取数据的过程 Windows内存管理机制 Windows基本架构 在了解Window内存管理机制之前&#xff0c;先简单了解一下Windows的内核权限以及基本的架…

经典基本电路

USB电路 USB差分走线的阻抗为90欧:差分对10mil宽的走线以及5mil的间距,两边包地15/20mil以上厚度(SI9000计算阻抗) USB2.0接口电路&#xff1a; USB3.0接口电路&#xff1a; USB HUB电路: HDMI电路 HDMI差分走线的阻抗为100欧:差分对6mil宽的走线以及5mil的间距,两边包地15/20…

你都那么老了,还在每天写博客吗?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 白色便民网&#xff1a;我想多开一个公司会不会被税局查? 事件背景&#xff1a; 松松已创业9年&#xff0c;自媒体14年&#xff0c;经历过从0开公司、项目失败、赚钱等各种高光时刻。所以对于小微企业经营还是…

为什么QLC NAND才是ZNS SSD最大的赢家?-part3

在ZNS SSD设计中&#xff0c;也有很多的挑战&#xff1a; Open Zones 对写入缓冲区的需求&#xff1a;保持大量的 open zones&#xff08;例如 1K&#xff09;会增加对带宽的需求&#xff0c;并要求控制器提供足够的缓冲空间来管理并发写入请求。这需要较大的高带宽写入缓冲区以…

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal&#xff08;Ruizhou Sun、Yukun Su、Qingyao Wu&#xff09;[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…

ELK简单介绍一

任务背景 运维人员需要对系统和业务日志进行精准把控&#xff0c;便于分析系统和业务状态。日志分布在不同的服务器上&#xff0c;传统的使用传统的方法依次登录每台服务器查看日志&#xff0c;既繁琐又效率低下。所以我们需要集中化的日志管理工具将位于不同服务器上的日志收…

前端反向代理的神奇世界:加速、安全与缓存的秘密(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

3D Font

在游戏中使用3D文本 只需添加预制件并立即生成您的文本。 特点: *真实3D字母&#xff0c;可用作游戏对象*移动友好低聚 *VR兼容 *WebGL兼容 *30种以上不同字体 *材料和颜色可定制 WebGL演示 https://indiechest.itch.io/3d-font-engine 下载&#xff1a; ​​Unity资源商店链…

【lesson13】MySQL表的基本操作之create(创建),update(更新)和replace(替换)

文章目录 表的增删查改create测试建表基础测试 update测试建表基础测试 replace&#xff08;替换&#xff09;测试建表基础测试 表的增删查改 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; create 测试 建表…

opencl.dll如何修复?快速解决opencl.dll缺失总共有5种方案

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“opencl.dll缺失”。OpenCL&#xff08;Open Computing Language&#xff09;是一种开放的并行计算框架&#xff0c;用于编写高性能的并行程序。当opencl.dll文件丢失或损坏时&#xff0c;可…

Simple Water Caustic Pattern In Unity ShaderGpaph

shadertoy上有各种神奇的效果&#xff0c;以我的见识根本想象不到这些是怎么弄出来的。 不过不会做至少可以先会用。 这篇文章抓取一个shadertoy的示例以制作一个测试效果。 参考这篇shadertoy&#xff0c;使用自定义节点装填hlsl的noise代码 Shader - Shadertoy BETA 首先使…

生物芯片市场分析:预计2029年将达到180亿美元

生物芯片(biochip或bioarray)是根据生物分子间特异相互作用的原理&#xff0c;将生化分析过程集成于芯片表面&#xff0c;从而实现对DNA、RNA、多肽、蛋白质以及其他生物成分的高通量快速检测。狭义的生物芯片概念是指通过不同方法将生物分子(寡核苷酸、cDNA、genomic DNA、多肽…

Vue之Computed(计算属性)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…