
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-volumeinitContainer
用于初始化工作,执行完就结束,可以理解为一次性任务
- 支持大部分应用容器配置,但不支持健康检查
- 优先应用容器执行
比容器先执行,可以拷贝镜像来实现共享存储。
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自动创建