1-Pod概述

1.Pod概述

pod概述

1.每个Pod都有一个Pause容器,也称为“根容器”。除了Pause容器,每个Pod还包含一个或多个业务容器。
2.Pod中的容器共用pause容器的网络栈和存储卷。同一个pod中的两个容器只要localhost:端口就可以互相访问,同一个pod中端口不能重复
3.每个Pod都分配了唯一的IP地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP地址
4.K8S中,一个Pod里的容器与另外主机上的Pod容器能够直接通信。

pod的类型

静态pod和普通pod

静态pod概述
静态Pod比较特殊,它并没被存放在Kubernetes的etcd存储里,而是被存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动、运行
静态pod无需api server和其他集群组件干预,由kubelet自行创建管理,并在静态pod崩溃之后尝试重新启动

普通pod
* 普通Pod一旦被创建,就会被放入etcd中存储,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器并启动。

K8S中的三种IP

Node IP:  Node节点的IP地址,即物理网卡的IP地址
Pod IP:     Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址
Cluster IP:Service的IP地址,此为虚拟IP地址

静态pod

静态pod的创建
使用 --config 配置kubelet的启动参数,指定kubelet需要监控的静态pod文件所在的目录,kubelet会定期扫描该目录,并根据该目录下的.yaml或.json文件进行创建操作。

示例
1、确定kubelet的配置文件是什么
vim systemctl status kubelet.service
......
--config=/var/lib/kubelet/config.yaml
......

2、在上述配置文件中指定静态pod文件放置目录为/etc/kubelet.d/
vim /var/lib/kubelet/config.yaml
......
staticPodPath: /etc/kubelet.d/
......

3、重启服务,使配置生效
systemctl daemon-reload
systemctl restart kubelet.service

4、在在目录/etc/kubelet.d中放入static-nginx-pod.yaml文件
vim /etc/kubelet.d/static-nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-nginx-pod
  labels:
    app: static-nginx-pod
spec:
  containers:
  - name: test-nginx-container
    image: nginx:latest
    imagePullPolicy: Never
    command: ["/usr/sbin/nginx", "-g", "daemon off;"]
    ports:
    - containerPor

5、删除静态pod
rm -f /etc/kubernetes/manifests/static-nginx-pod.yaml

由于静态Pod无法通过API Server直接管理,所以在Master上尝试删除这个Pod时,会使其变成Pending状态,不会被删除,然后会自动重建
要删除该Pod,只能到其所在Node上将其定义文件static-nginx-pod.yaml从/etc/kubelet.d/目录下删除

常见的静态pod
etcd
kube-apiserver
kube-controller-manager
kube-scheduler

http方式创建静态pod
* 通过设置kubelet的启动参数“--manifest-url”,kubelet将会定期从该URL地址下载Pod的定义文件,并以.yaml或.json文件的格式进行解析,然后创建Pod。其实现方式与配置文件方式是一致的。

pod容器共享volume

* 同一个Pod中的多个容器能够共享Pod级别的存储卷Volume。
* Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录

* 在下面的例子中,在Pod内包含两个容器:nginx和busybox,在Pod级别设置Volume“app-logs”,用于nginx向其中写日志文件,busybox读日志文件。配置文件pod-volume-applogs.yaml的内容如下:
    * 这里设置的Volume名为app-logs,类型为emptyDir,挂载到nginx容器内的/var/log/nginx/目录,同时挂载到busybox容器内的/log/目录。
    * nginx容器在启动后会向/var/log/nginx/目录写文件,busybox容器就可以读取其中的文件了。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-nginx-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: busybox-nginx-pod
  replicas: 2
  template:
    metadata:
      labels:
        app: busybox-nginx-pod
    spec:
      imagePullSecrets:
      - name: svharborwx
      volumes:
      - name: app-logs
        emptyDir: {}
      containers:
      - name: test-busybox-container
        image: busybox:1.28
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "tail -f /log/error.log"]
        ports:
        - containerPort: 54321
        volumeMounts:
        - mountPath: /log/
          name: app-logs
      - name: test-nginx-container
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        command: ["/usr/sbin/nginx", "-g", "daemon off;"]
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /var/log/nginx/
          name: app-logs

pod定义的完整yaml文件

apiVersion: v1              #必选,版本号,例如v1
kind: Pod                   #必选,Pod
metadata:                   #必选,元数据
  name: string              #必选,Pod名称
  namespace: string         #必选,Pod所属的命名空间
  labels:                   #自定义标签
    - name: string          #自定义标签名字
  annotations:              #自定义注释列表
    - name: string
spec:                       #必选,Pod中容器的详细定义
  containers:               #必选,Pod中容器列表
  - name: string            #必选,容器名称
    image: string           #必选,容器的镜像名称
    imagePullPolicy: [Always | Never | IfNotPresent]    #获取镜像的策略:Alawys表示总是下载镜像,IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
    command: [string]       #容器的启动命令列表。如不指定,则使用镜像打包时指定的启动命令
    args: [string]          #容器的启动命令参数列表
    workingDir: string      #容器的工作目录
    volumeMounts:           #挂载到容器内部的存储卷配置
    - name: string          #引用pod定义的共享存储卷的名称,需要使用volumes[]部分定义的卷名
      mountPath: string     #存储卷在容器内mount的绝对路径,应少于512字符
      readOnly: boolean     #是否为只读模式,默认值为读写模式
    ports:                  #需要暴露的端口号列表
    - name: string          #端口的名称
      containerPort: int    #容器需要监听的端口号
      hostPort: int         #容器所在主机需要监听的端口号,默认与Container相同。设置hostPort 时,同一台宿主机将无法启动该容器的第2 份副本
      protocol: string      #端口协议,支持TCP和UDP,默认TCP
    env:                    #容器运行前需设置的环境变量列表
    - name: string          #环境变量名称
      value: string         #环境变量的值
    resources:              #资源限制和资源请求的设置
      limits:               #资源限制的设置
        cpu: string         #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
        memory: string      #内存限制,单位可以为Mib、Gib,将用于docker run --memory参数
      requests:             #资源请求的设置
        cpu: string         #Cpu请求,单位为core数,容器启动的初始可用数量
        memory: string      #内存请求,单位可以为Mib、Gib,容器启动的初始可用数量
    livenessProbe:          #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
      exec:                     #对Pod容器内检查方式设置为exec方式
        command: [string]         #exec方式需要制定的命令或脚本
      httpGet:                  #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
        path: string              #http服务器上的访问URI
        port: number              #容器上要访问端口号或名称
        host: string              #要连接的主机名,默认为Pod的IP,可以在http request head中设置host头部。
        scheme: string            #用于连接host的协议,默认为HTTP
        HttpHeaders:              #自定义HTTP请求headers,HTTP允许重复headers
        - name: string
          value: string
      tcpSocket:                #对Pod内个容器健康检查方式设置为tcpSocket方式
        port: number
      initialDelaySeconds: 0    #容器启动后要等待多少秒后探针才开始工作(单位是秒),默认是0秒,最小值是0
      timeoutSeconds: 1         #探针执行检测请求后,等待响应的超时时间(单位是秒),默认为1s,最小值是 1
      periodSeconds: 10         #执行探测的时间间隔(单位是秒),默认为10s,最小值是1
      successThreshold: 1       #(失败-->就绪)探针检测失败后认为成功的最小连接成功次数,默认为1s,最小值为1s。(在Liveness和startupProbe探针中必须为1s)
      failureThreshold: 3       #(就绪-->失败)探测失败的重试次数,重试一定次数后将认为失败,默认为3s,最小值为1s。(在readiness探针中,Pod会被标记为未就绪)
  securityContext:
    privileged:false
  restartPolicy: [Always | Never | OnFailure]    #Pod的重启策略。Always(默认值)表示一旦不管以何种方式终止运行,kubelet都将重启。OnFailure表示只有Pod以非0退出码退出才重启。Nerver表示Pod终止后,kubelet将退出码报告给Master,不会再重启该Pod
  nodeSelector: obeject   #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
  imagePullSecrets:       #Pull镜像时使用的secret名称,以key:secretkey格式指定
  - name: string
  hostNetwork:false       #是否使用主机网络模式,默认为false。如果设置为true,表示使用宿主机网络,不再使用Docker网桥,该Pod将无法在同一台宿主机上启动第2个副本。
  volumes:                #在该pod上定义共享存储卷列表
  - name: string          #共享存储卷名称 (volumes类型有很多种)。容器定义部分的containers[].volumeMounts[].name将引用该共享存储卷的名称。可以定义多个volume ,每个volume的name保持唯一。
    emptyDir: {}          #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
    hostPath: string      #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      path: string        #Pod所在宿主机的目录,将被用于同期中mount的目录
    secret:               #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
      scretname: string
      items:    
      - key: string
        path: string
    configMap:            #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
      name: string
      items:
      - key: string
        path: string
posted @   立勋  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示