命令记不住

登陆

k8s 的 Pod 和容器

Pod和容器

1.抽象Pod

由于容器实际上是一个“单进程”模型,所以如果你在容器里启动多个进程,只有一个可以作为 PID=1 的进程,而这时候,如果这个 PID=1 的进程挂了,或者说失败退出了,那么其他三个进程就会自然而然的成为孤儿,没有人能够管理它们,没有人能够回收它们的资源,这是一个非常不好的情况。

Pod = “进程组”

在 kubernetes 里面,Pod 实际上正是 kubernetes 项目为你抽象出来的一个可以类比为进程组的概念。

前面提到的,由四个进程共同组成的一个应用 Helloworld,在 Kubernetes 里面,实际上会被定义为一个拥有四个容器的 Pod,这个概念大家一定要非常仔细的理解。

就是说现在有四个职责不同、相互协作的进程,需要放在容器里去运行,在 Kubernetes 里面并不会把它们放到一个容器里,因为这里会遇到两个问题。那么在 Kubernetes 里会怎么去做呢?它会把四个独立的进程分别用四个独立的容器启动起来,然后把它们定义在一个 Pod 里面。

所以当 Kubernetes 把 Helloworld 给拉起来的时候,你实际上会看到四个容器,它们共享了某些资源,这些资源都属于 Pod,所以我们说 Pod 在 Kubernetes 里面只有一个逻辑单位,没有一个真实的东西对应说这个就是 Pod,不会有的。真正起来在物理上存在的东西,就是四个容器。这四个容器,或者说是多个容器的组合就叫做 Pod。并且还有一个概念一定要非常明确,Pod 是 Kubernetes 分配资源的一个单位,因为里面的容器要共享某些资源,所以 Pod 也是 Kubernetes 的原子调度单位。

2.Pod基本概念

最小单元,一个或者多个容器组成

特点
  • 一个Pod可以理解为是一个应用实例
  • Pod中容器始终部署在一个Node上
  • Pod中容器共享网络、存储资源
共享网络

Infra Container:将业务容器网络加入到“负责网络的容器”实现网络共享

共享存储

Volume:容器通过数据卷共享数据

  volumeMounts:
  - name: log
    mountPath: /data
volumes:
- name: log
  emptyDir: {}

.

3.主要用法

运行多个容器:

Sidecar 边车模式,通过在Pod中定义专门容器,来执行主业务容器需要的辅助工作,这样的好处是将辅助功能同主业务容器解耦,实现独立发布和能力重用。

4.initContainer

apiVersion: v1
kind: Pod
metadata:
name: java-demo
spec:
initContainers:
- image: xxx/xxx:v2
 name: war
 command: ["cp","/a.war","/app"]
 volumeMounts:
 - mountPath: /app
   name: tomcat
containers:
- image: xx/tomcat:7.0
 name: tomcat
 command: ["cp","/a.war","/app"]
 volumeMounts:
 - mountPath: /root/webapps
   name: app-volume
 port:
 - containerPort: 8080
   hostPort: 8001
volumes:
- name: app-volume
initContainer

用于初始化工作,执行完就结束,可以理解为一次性任务

  • 支持大部分应用容器配置,但不支持健康检查
  • 优先应用容器执行

比容器先执行,可以拷贝镜像来实现共享存储。

Init Container,它只做一件事情,就是把 WAR 包从镜像里拷贝到一个 Volume 里面,它做完这个操作就退出了,所以 Init Container 会比用户容器先启动,并且严格按照定义顺序来依次执行。

一个通过组合两个不同角色的容器,并且按照这样一些像 Init Container 这样一种编排方式,统一的去打包这样一个应用,把它用 Pod 来去做的非常典型的一个例子。像这样的一个概念,在 Kubernetes 里面就是一个非常经典的容器设计模式,叫做:“Sidecar”。

应用场景:

  • 环境检查:例如确保应用容器依赖的服务启动后再启动应用容器
  • 初始化配置:例如给应用容器准备配置文件

5.Pod管理命令

进入容器终端

kubectl exec -it $pod -c $container -- bash

创建

kubectl  run   nginx  --image=nginx

查看pod

kubectl  get  pods
kubectl  describe  pod   $pod

日志

kubectl  logs  $pod  -c  $container
kubectl  logs -f $pod  -c  $container 

删除

kubectl  delete  pod  $pod

.

6.静态Pod

静态Pod特点:

  • Pod由特定节点上的kubelet管理
  • 不能使用控制器
  • Pod名称标识当前节点名称

在kubelet配置文件启动静态Pod的参数

cat /var/lib/kubelet/config.yaml
...
staticPodPath: /etc/kubernetes/manifests
...

将部署的pod yaml文件放到该目录会由kubelet自动创建

推荐阅读