[root@master ~]# kubectl explain pod.spec.containers #输入的命令
spec.containers <[]Object>
- name -required-
image
imagePullPolicy 1、三种策略:Always, Never, IfNotPresent。2、该字段的值默认为Always。3、该字段的值,一旦指定了,启动之后,就再也修改不了。4、其中,如果镜像的标签是latest,那么该字段基本就是Always;如果镜像的标签是其他的,那么该字段的值应当设置为IfNotPresent。
ports <[]Object> 1、暴露一个端口仅仅就是提供一个额外的信息,但不能限制系统是不是真的会暴露该端口,因为Pod所管理的容器对应的镜像中会限制该容器所监听的端口,这跟docker不一样。
containerPort -required-
hostIP
hostPort
name
protocol
args <[]string>
command <[]string>
[root@master manifests]# kubectl explain pods.spec
hostNetwork #用来共享宿主机的网络命名空间
1、设置hostNetwork字段的实例
[root@master manifests]# vim hostnetwork-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: hostnetwork-pod
namespace: default
spec:
hostNetwork: true
containers:
- name: hostnetwork-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
[root@master manifests]# kubectl apply -f hostnetwork-demo.yaml
pod/hostnetwork-pod created
[root@master manifests]# kubectl get pods -o wide #可以看到此Pod的Ip地址是node01节点的Ip地址
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hostnetwork-pod 1/1 Running 0 5s 10.0.2.3 node01
[root@master manifests]# kubectl explain pod.metadata
labels
1、查看标签
[root@master manifests]# kubectl get pods --show-labels #显示pod资源的同时,显示标签
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 2 177m app=myapp,tier=frontend
[root@master manifests]# kubectl get pods -l app #显示带有app标签的pod资源(相当于过滤)
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 2 177m
[root@master manifests]# kubectl get pods -l app --show-labels #显示带有app标签的pod资源的同时,显示标签的具体值(相当于过滤)
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 2 178m app=myapp,tier=frontend
[root@master manifests]# kubectl get pods -L app #显示指定类别的资源对象时,对每一个资源对象的此标签显示其标签值。
NAME READY STATUS RESTARTS AGE APP
pod-demo 2/2 Running 2 178m myapp
2、增加/修改标签
1、增加标签
[root@master manifests]# kubectl label pods pod-demo release=canary #增加release=canary的标签
pod/pod-demo labeled
[root@master manifests]# kubectl get pods --show-labels -l app
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 2 3h14m app=myapp,release=canary,tier=frontend
2、修改标签
[root@master manifests]# kubectl label pods pod-demo release=stable #将release=canary这个标签修改为release=stable。
error: 'release' already has a value (canary), and --overwrite is false
[root@master manifests]# kubectl label pods pod-demo release=stable --overwrite #需要增加--overwrite这个参数(为了与增加标签的命令做区分)
pod/pod-demo labeled
[root@master manifests]# kubectl get pods --show-labels -l app
NAME READY STATUS RESTARTS AGE LABELS
pod-demo 2/2 Running 2 3h16m app=myapp,release=stable,tier=frontend
3、标签选择器:
1、基于等值关系的标签选择器
[root@master manifests]# kubectl get pods -l release=stable,app=myapp
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 2 3h23m
[root@master manifests]# kubectl get pods -l release!=stable
No resources found in default namespace.
2、基于集合关系的标签选择器
[root@master manifests]# kubectl get pods -l "release in (canary,beta,alpha)"
No resources found in default namespace.
[root@master manifests]# kubectl get pods -l "release notin (canary,beta,alpha)"
NAME READY STATUS RESTARTS AGE
pod-demo 2/2 Running 2 3h30m
[root@master manifests]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 8d v1.18.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01 Ready 8d v1.18.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02 Ready 8d v1.18.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux
[root@master manifests]# kubectl label nodes node01 disktype=ssd
node/node01 labeled
[root@master manifests]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 8d v1.18.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node01 Ready 8d v1.18.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
node02 Ready 8d v1.18.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux
[root@master manifests]# kubectl explain pod.spec
nodeSelector
[root@master manifests]# kubectl explain pod.metadata
annotations
Pod声明周期中的重要行为:
上图中的probe(不管是liveness probe还是readiness probe)支持三种探测行为:
1、创建Pod的请求交给Apiserver组件
2、Apiserver组件先把创建请求的目标状态,保存在etcd组件中
3、Apiserver组件请求Scheduler组件,进行调度,并且把成功调度结果(运行在哪个Node之上)保存在etcd的Pod资源的状态信息中
4、目标Node上的Kubelet组件通过Apiserver组件中的Pod资源的状态信息变化,得知自己有一个新的任务。此时,此Kubelet会从Apiserver组件上拿到Pod资源创建的清单信息,根据清单在当前节点上运行Pod。并将运行Pod的结果(运行成功或者运行失败)发送给Apiserver组件,Apiserver组件会将该信息存在etcd组件中。
[root@master ~]# kubectl explain pod.spec
restartPolicy #One of Always, OnFailure(只有其状态为错误时,才会重启。如果容器是正常结束的,那么不会重启), Never. Default to Always.