Pod
Pod是k8s处理的最基本单元。容器本身不会直接分配到主机上,封装为Pod对象,是由一个或多个关系紧密的容器构成。她们共享 IPC、Network、和UTS namespace
pod的特征
- 包含多个共享IPC、Network和UTC namespace的容器,可直接通过loaclhost通信
- 所有Pod内容器都可以访问共享的Volune可以访问共享数据
- 无容错性;直接创建的Pod一旦被调度后跟Node绑定,即使Node挂掉也不会重新调度
创建Pod
使用yaml文件定义Pod
apiVersion: v1
kind: Pod
metadata:
name: examplepod
spec:
containers:
- name: examplepod-container
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c']
args: ['echo "Hello Kubernetes!"; sleep 3600']
apiVersion: 表示使用的API版本。v1表示使用k8s API的稳定版本
**kind:**表示要创建的资源对象,使用关键字Pod
**metadata:**表示该资源对象的元数据。一个资源对象可拥有多个元数据,name表示当前资源的名称
Spec:表示该资源对象的具体设置。containers表示容器的集合,设置容器属性
- name:要创建的容器名称
- image:容器的镜像地址
- imagePullPolicy:镜像的下载策略,支持三种下载策略
- ALways:不管镜像是否存在都会进行一次拉取
- Nerver:不管镜像是否存在都不会进行拉取
- IfNotPresent:只有镜像不存在时,才会进行拉取
- command:容器的启动命令
- args:启动参数列表
使用kubectl创建Pod
kubectl apply -f *.yaml
apply声明式对象配置命令。-f表示用文件名作为参数,apply既便于跟踪,又具备很好的可读性
查看pod
kubectl get pod
可以在查询命令中带上参数-w,以对Pod状态进行持续监控
$ kubectl get pod {Pod名称} -o wide
还可以在查询命令中带上-o wide参数,输出Pod的更多概要信息(如调度到哪台机器上,Pod本身的虚拟IP等信息
$ kubectl get pod {Pod名称} -o wide
可以用describe命令查看详情,格式如下。
$ kubectl describe pods {Pod名称}
如果要查询Pod本身输出的日志信息,还可以使用logs命令
$ kubectl logs {Pod名称}
Pod模板
apiVersion: v1 #版本,必填,v1代表稳定版本 kind: pod #类型,必填,Pod metadata: #元数据,表示资源的标识信息 name: String #元数据,必填,Pod的名字 namespace: String #元数据,Pod的命名空间 labels: #元数据,标签列表 - key: value #元数据,可定义多个标签的键/值对 annotations: #元数据,自定义注解列表 - key: value #元数据,可定义多个注解的键/值对 spec: #Pod中容器的详细定义,必填 containers: #Pod中的容器列表,必填,可以有多个容器 - name: String #容器名称,必填 image: String #容器中的镜像地址,必填 imagePullPolicy: [Always|Never|IfNotPresent]#获取镜像的策略,Always表示下载镜像; #IfNotPresent表示优先使用本地镜像,否则下载镜像;Never表示仅使用本地镜像 command: [String] #容器的启动命令列表(不配置的话,使用镜像内部的命令) args: [String] #启动命令参数列表 workingDir: String #容器的工作目录 volumeMounts: #挂载到容器内部的存储卷设置 - name: String #为了引用Pod定义的共享存储卷的名称,要用volumes[]部分定义的卷名 mountPath: String #存储卷在容器内挂载的绝对路径,应少于512个字符 readOnly: boolean #是否为只读模式 ports: #容器需要暴露的端口号列表 - name: String #端口名称 containerPort: int #容器要暴露的端口 hostPort: int #容器所在主机监听的端口(把容器暴露的端口映射到宿主机的端口) protocol: String #端口协议,支持TCP和UDP,默认为TCP env: #容器运行前要设置的环境变量列表 - name: String #环境变量名称 value: String #环境变量值 resources: #资源限制和请求的设置 limits: #资源限制的设置 cpu: String #CPU的限制,单位为CPU内核数。将用于docker run --cpu-quota 参数, #也可以使用小数,例如0.1,0.1等价于表达式100m,表示100milicpu memory: String #内存限制,单位可以为MiB/GiB/MB/GB(1MiB=1024×1024B, #1MB=1000×1000B),将用于docker run --memory参数 requests: #资源请求的设置 cpu: String #CPU请求,容器启动时的初始可用数量,将用于docker run --cpu-shares参数 memory: String #内存请求,容器启动时的初始可用数量 livenessProbe: #Pod内容器健康检查的设置,当探测几次无响应后将自动重启该容器, #检查方法有exec、httpGet和tcpSocket,对一个容器只要设置一种方法即可 exec: #通过exec方式来检查Pod内各容器的健康状况 command: [String] #exec方式需要指定的命令或脚本 httpGet: #通过httpGet方式来检查Pod中各容器的健康状况,需要指定path、port path: String port: number host: String scheme: String httpHeaders: - name: String value: String tcpSocket: #通过tcpSocket检查Pod中各容器的健康状况 port: number initialDelaySeconds: 0 #容器启动完成后,首次探测的时间(单位为秒) timeoutSeconds: 0 #对容器进行健康检查时探测等待响应的超时时间(单位为秒,默认为1s) periodSeconds: 0 #对容器监控检查的定期探测时间设置(单位为秒),默认10s一次 successThreshold: 0 failureThreshold: 0 securityContext: #安全配置 privileged: false restartPolicy: [Always|Never|OnFailure]#Pod的重启策略,Always表示不管以何种方式终止 #运行,kubelet都将重启;OnFailure表示只有Pod以非0码退出才重启;Never表示不再重启该Pod nodeSelector: object #节点选择,设置nodeSelector表示将该Pod调度到包含这个标签的 #节点上,以key:value格式来指定 imagePullSecrets: #拉取镜像时使用的secret名称,以key:secretkey格式指定 - name: String hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络 volumes: #在该Pod上定义共享存储卷列表 - name: String #共享存储卷名称 emptyDir: {} #类型为emptyDir的存储卷,与Pod有相同生命周期的一个临时目录,为空值 hostPath: #类型为hostPath的存储卷,将会挂载Pod所在宿主机的目录 path: string #Pod所在宿主机的目录,该目录将在容器中挂载 secret: #类型为secret的存储卷,在容器内部挂载集群中预定义的secret对象 secretName: String items: - key: String path: String configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部 name: String items: - key: String path: String ``