K8S之Pod对象

Pod是一组紧密关联的容器组合,共享PID,NETWORK,UTS namespace。一个Pod
里可以运行多个容器。一个Pod里多个容器共享网络和文件系统

原理

K8S真正处理的还是宿主机操作系统上的namespace和Cgroups,而不存在一个
Pod边界或者隔离环境。Pod里所有的容器共享的是同一个Network NameSpace
并且可以共享同一个volume。 在K8S项目里需要一个中间容器,这个容器叫
Infra容器,在这个Pod里,Infra容器永远是第一个被创建的容器,其他用户定义
容器则是通过join network NameSpace方式与Infra容器建立关联

Infra容器占用很小的资源,是一个特殊的镜像,名称:http://k8s.gcri/pause
这个镜像处于一个暂停的状态。在Infra容器hold住Network NameSapce后,用户
容器就可以加入到Infra容器的Network NameSpace中

示例

  • 创建Pod
apiVersion: v1
kind: Pod
metadata:
  name: pod-test
  labels:
    name: redis-master
spec:
  containers:
  - name: master01
    image: redis
    ports:
    - containerPort: 6379
      hostPort: 6388
  - name: master02
    image: paubo/sshd
    ports:
    - containerPort: 22
      hostPort: 8888        

执行命令: kubectl apply -f pod-test.yaml

对于同一个Pod里所有容器,它们进出的流量可以认为都是通过Infra容器完成的。在配置网络
只需关注Pod的网络还不是容器的网络即Infra的Network NameSpace即可。共享volume也只需
把volume定于在Pod层。一个volume对应的宿主机的目录对于Pod来说只有一个,Pod容器只需声明
挂载这个volume即可共享这个volume对应的宿主极目录

apiVersion: v1
kind: Pod
metadata:
  name: java-web
spec:
  restartPolicyL: Never
  volumes:
  - name: shared-data
    hostPath:
      path: /data
  containers:
  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  - name: debian-container
    image: debian
    volumeMounts:
    - name:shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]         
    args: ["-c","echo hello from debian container > /pod-data/index.html"]

如上Pod中有两个容器nginx-container,debian-container,都声明挂载同一个volume
而这个volume是一个hostPath类型,也就是宿主机上的目录/data,这样两个容器都挂载了这个
宿主机目录/data。这样设计可以在一个容器跑多个不相关应用


apiVersion: v1
kind: Pod
metadata:
  name: java-web
spec:
  initContainers:
  - image: geetime/sample:v2
    name: war
    command: ["cp", "/sample.war", "/app"]  
    volumeMouts:
    - mountPath: /app
      name: app-volume
  containers:
  - image: geetime/tomcat:7.0
    name: tomcat
    command: ["sh","-c","/tomcat/bin/start.sh"]    
    volumeMounts:
    - mountPath: /tomcat/webapps
      name: app-volume
    ports:
    - containerPort: 8080
      hostPort: 8001
  volumes:
  - name: app-volume
    emptyDir: {}      

定义两个容器,第一个容器只有一个war包放在根目录下,声明initContainers将war包
拷贝到/app目录下,第二个容器的作用是启动一个tomcat,和initContainers挂载同一
个volume,而且initContainers一定逼containers里的容器先启动。这样在tomcat启动时
其webapps目录下就有war包

Pod重要参数说明

  1. NodeSelector 提供Node和Pod绑定
apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    disktype:ssd
  1. NodeName 如果Pod该参数被赋值,K8S就会认为这个Pod已经经过调度了,调度的结果
    就是赋值的节点名称,一般由调度器负责设置

  2. HostAliases 定义Pod的hosts文件里的内容

  3. shareProcessNamespace 如果设置为true,表示开启共享Pid NameSpace

  4. LivenessProbe 健康检测

apiVersion: v1
kind: Pod
metadata:
  name: pod-health-check
  labels:
    name: pod-health-check
  namespace: default
spec:
  containers:
  - name: xx-health-check
    image: xx
    command:
    - "/bin/sh"    
    - "-c"
    - "touch /tmp/health; sleep 30; rm -f /tmp/health; sleep 600"
    livenessProbe:
      exec:
        command:
        - "/bin/sh" 
        - "-c"
        - "cat /tmp/health"
      initialDelaySeconds: 5
      periodSeconds: 5  

容器启动后exec进入容器执行cat /tmp/health命令,如果文件存在则返回0表示健康,如果返回值不为0,
则表示异常。容器启动5秒后开始检测,并且每5秒检查一次
除了在容器执行命令外,livenessProbe也可以定义发起http和TCP请求

livenessProbe:
  httpGet:
    path: /xxx-url
    port: xxx
    httpHeaders:
    - name:X-Custom-Header
      value: xxx
    initialDelaySeconds: 3
    periodSeconds: 3  
livenessProbe:
  tcpSocket:
    port: xxx
    httpHeaders:
    initialDelaySeconds: 5
    periodSeconds: 10  
  1. restartPolicy 指的是容器的恢复机制,有以下几种恢复策略

6.1 Always 任何情况下,只要容器不在运行状态,就会自动重启容器
6.2 OnFailure 只在容器异常的情况下才会重启容器
6.3 Never 从来不重启容器

加入一个Pod里只有一个容器,这个容器异常推出了,只有当restartPolicy=Nerver时
Pod才会进入Failed状态。而其他情况下,因为有重启策略存在,这个Pod会一直保持
running状态。而如果这个Pod有多个容器,如果只有一个容器异常退出,即使restartPolicy=never
只有当这个Pod里所以的容器都异常的情况下,这个Pod才会进入Failed状态

  1. ReadinessProbe 就绪性检查,检查我们应用是否就绪。ReadinessProbe 的健康检测和 LivenessProbe 一样
apiVersion: v1
kind: Pod
metadata:
  name: httpget-readinessprobe
  namespace: default
spec:
  containers:
  - name: httpget-pod
    image: nginx
    ports:
    - name: nginx-port
      containerPort: 80
    readinessProbe:
      httpGet:
        path: /index.html
        port: nginx-port
      initialDelaySeconds: 3
  1. lifecycle用于容器启动后,停止前的操作

postStart 容器启动后立即执行
preStop 容器停止前立即执行

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-test
  namespace: default
spec:
  containers:
  - name: lifecycle-test
    image: busybox
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "mkdir -p /data/web/html; echo 'lifecycle test' >> /data/web/html/index.html "]
    command:
    - "/bin/sh"
    - "-c"
    - "sleep 3600"
posted @   秋水秋色  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2019-08-23 thymeleaf常用模板方法收集
点击右上角即可分享
微信分享提示