在Kubernetes中,Pod是调度的最小元素,它有网络,有存储。一个Pod封装一个或多个应用容器、存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod中的每个容器共享网络命名空间(包括IP与端口),Pod内的容器可以使用localhost相互通信。Pod可以指定一组共享存储卷Volumes,Pod中所有容器都可以访问共享的Volumes,Volumes用于数据持久化,防止容器重启丢失数据。
Pod并不提供保证正常运行的能力,因为可能遭受Node节点的物理故障、网络分区等等的影响,整体的高可用是Kubernetes集群通过在集群内调度Node来实现的。通常情况下我们不要直接创建Pod,一般都是通过Controller来进行管理
Pod存在意义
(1)创建容器使用docker, docker一个容器中包含一个进程,一个进程对应一个应用程序。Pod是多进程设计,运行多个容器,多个应用程序。
(2)Pod存在为了亲密性应用
像单独的容器应用一样,Pod并不是持久运行的。Pod创建后,Kubernetes为其分配一个UID,并且通过Controller调度到Node中运行,然后Pod一直保持运行状态直到运行正常结束或者被删除。在Node发生故障时,Controller负责将其调度到其他的Node中。Kubernetes为Pod定义了几种状态,分别如下:
Kubernetes利用Handler功能,可以对容器的状况进行探测,有以下三种形式。
Pod的配置信息中有几个重要部分,apiVersion、kind、metadata、spec以及status。其中apiVersion和kind是比较固定的,status是运行时的状态,所以最重要的就是metadata和spec两个部分。
以下为demo配置文件, demo.yml
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
labels:
app: bash
tir: backend
spec:
containers:
- name: bash-container
image: docker.io/busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
利用kubectl命令行管理工具,我们可以直接在命令行通过配置文件创建。如果安装了Dashboard图形管理界面,还可以通过图形界面创建Pod。因为最终Pod的创建都是落在命令上的,这里只介绍如何使用kubectl管理工具来创建。
使用配置文件的方式创建Pod。
kubectl create -f demo.yml
如果想了解一个正在运行的Pod的配置,可以通过以下命令获取。
kubectl get pod first-pod -o yaml
kubectl logs demo-pod
如果Pod中有多个容器,查看特定容器的日志需要指定容器名称
kubectl logs pod-name -c container-name
标签是Kubernetes管理Pod的重要依据,我们可以在demo.yaml文件中 metadata 中指定,也可以通过命令行进行管理。
kubectl get pods --show-labels
kubectl get pods -l tir=backend --show-labels
kubectl label pod demo-pod tir=frontend
kubectl label pod demo-pod tir=unkonwn --overwrite
kubectl get pods -L app,tir
标签是Kubernetes中非常强大的一个功能,Node节点也可以增加标签,再利用Pod的标签选择器,可以将Pod分配到不同类型的Node上。
kubectl delete pods demo-pod
也可以根据标签选择器删除
kubectl delete pods -l tir=backend
利用这个特性,可以在Pod启动过程中向Pod中注入密码 Secrets、存储 Volumes、挂载点 Volume Mounts和环境变量。通过标签选择器来指定Pod。利用这个特性,Pod Template的维护人员就不需要为每个Pod显示的提供相关的属性。
具体的工作步骤
podpreset.admission.kubernetes.io/podpreset--preset name>: ""
对于 Env、EnvFrom、VolumeMounts Kubernetes修改Container Spec,对于Volume修改Pod Spec。
sepc
containers:
- name: db
image: mysql
resources:
requests: #调度限制,根据request找到足够的node节点进行调度
memory: "64Mi"
cpu: "250m"
limits: #最大限制0
memory: "128Mi"
cpu: "500m"
sepc
nodeSelector:
env_role:dev #k8s标签