06-Kubernetes Pod控制器应用进阶一

一、Pod资源的spec字段中的containers字段中的字段

[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>

 

二、Pod资源的spec字段中的hostNetwork字段

[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              

 

三、dokcer中的Entrypoint、Cmd和kubernetes中的command、args之间的关系—修改镜像的默认应用

  • https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
  •   args <[]string>
      command      <[]string>

06-Kubernetes Pod控制器应用进阶一_第1张图片

 

四、资源与标签之间的关系是多对多的关系—Pod的metadata字段中的labels字段

  • 一个资源对象可以有多个标签;同时,一个标签也可以被多个资源对象使用
  • 标签既可以在资源创建的时候被指定,也可以在资源创建之后,使用命令来管理(既包括添加,删除,也可以包括修改)
  • 在指定标签时,既可以指定一个标签,也可以指定多个标签
[root@master manifests]# kubectl explain pod.metadata
    labels            
          1、该字段是key=value的类型,其中key和value的长度必须小于63个字符;
          2、key只能使用字母、数字、下划线、.号、-,并且只能以字母或数字开头。
          3、key的名字也可以使用键前缀,比如把dns的域名作为前缀来使用。但是加前缀后,总长度不能超过253个字符。
          4、value的值可以为空,只能以字母或数字开头及结尾,中间可以使用字母、数字、下划线、.号和-。

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. =
  2. ==
  3. !=
  • 基于集合关系的标签选择器:
  1. KEY  in  (VALUE1,VALUE2,...)
  2. KEY  notin  (VALUE1,VALUE2,...)
  3. KEY    表示存在这个键就可以,不用关注其Value值
  4. !KEY    表示存在这个键就可以,不用关注其Value值
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

 

五、许多资源支持内嵌字段定义其使用的标签选择器(Pod资源控制器和Service会用到)

  • matchLabels:直接给定键值—基于等值关系的标签选择器
  • matchExpressions:基于给定的表达式来定义使用标签选择器(格式为:{key:"KEY",operator:"OPERATOR",values:[VALUE1,VALUE2...]})——基于集合关系的标签选择器
  1. OPERATOR操作符:In,NotIn,Exists,NotExists(使用In和NotIn时,values列表必须是个非空列表;而使用Exists和NotExists时,values列表必须是个空列表)

 

 

  • Pod资源控制器支持两种:matchLabels和matchExpressions
  • Service只支持一种:matchLabels

 

六、节点标签选择器—不仅能给Pod资源打标签,也可以给Node资源打标签

[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     节点标签选择器,在运行Pod时,可以指定该Pod运行在那类node上。
    nodeName          在运行Pod时,可以指定该Pod运行在哪个node上。

 

七、注解—annotations

  • annotations与labels不同的地方在于:它不能用于挑选资源对象,仅用于为对象提供“元数据”
  • annotations没有键长度和值长度的限制
[root@master manifests]# kubectl explain pod.metadata
    annotations  

 

八、Pod的生命周期:

Pod声明周期中的重要行为:

  • 初始化容器
  • 容器探测:liveness probe、readiness probe(定时发送这两个信号)
  • post start、pre stop

06-Kubernetes Pod控制器应用进阶一_第2张图片

上图中的probe(不管是liveness probe还是readiness probe)支持三种探测行为:

  1. 执行自定义命令
  2. 向指定的tcp 套接字发送请求
  3. 向指定的http 服务发送请求(Get请求)

 

九、常见的Pod的状态(是master节点上的Apiserver组件,与运行Pod的Node上的Kubelet组件通信,来获取Pod的状态)

  1. Pending:挂起状态(在请求创建Pod时,发现条件未满足—没有任何一个node节点能够满足Pod运行的条件)
  2. Running:运行状态
  3. Failed:失败
  4. Succeeded:成功,但是运行的时间比较短
  5. Unknown:未知状态(运行Pod的Node上的Kubelet组件运行失败)

 

十、Pod的创建过程

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组件中。

 

十一、Pod的重启策略

[root@master ~]# kubectl explain pod.spec
    restartPolicy              #One of Always, OnFailure(只有其状态为错误时,才会重启。如果容器是正常结束的,那么不会重启), Never. Default to Always. 
  • 如果把容器的重启策略设置为Always,那么会对系统产生莫名的压力,所以,反复重启的策略是这样的:比如第一次重启是立即完成的,第二次重启需要延时(比如等10秒再重启),第三次重启需要再延时(比如等20秒再重启)......。其中300秒(5分钟)是最长的延时时间。

 

十二、Pod的终止策略

  • Pod的终止不是直接kill掉来删除的。而是,向Pod内的所有容器发送终止信号(15信号),让Pod中的容器正常终止,这个终止会给一个默认的宽限期(通常都是30秒)。如果宽限期到了,还有容器没有正常终止,那这时,会发送kill信号,强行进行终止。

你可能感兴趣的:(kubernetes)