天天看点

KUBERNETES-1-4-控制器应用一

1.kubectl explain pods.spec.containers可以查看容器可以定义的相关参数。image    <string>用来定义所引用的镜像。imagePullPolicy    <string>用来定义镜像拉去的策略,默认是always,即系统每次都会去抓取镜像,但需要特变注意的是当我们的镜像标签为latest的时候,按照正常时肯定会抓取以确定是latest,有时候我们可能不想让系统去抓取,可以选择IfNotPresent。ports 主要用来选择Pod 要暴露的端口。 args  用来指定向容器传的参数。command  用来指定容器运行的程序,这里的command可能更类似于dockerl里面的ENTRYPOINT。附有一个dockerfile与kubernetes的对照说明。

[[email protected] ~]# kubectl explain pods.spec.containers

   image    <string>

     Docker image name. More info:

     https://kubernetes.io/docs/concepts/containers/images This field is

     optional to allow higher level config management to default or override

     container images in workload controllers like Deployments and StatefulSets.

   imagePullPolicy    <string>

     Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always

     if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.

     More info:

     https://kubernetes.io/docs/concepts/containers/images#updating-images

   ports    <[]Object>

     List of ports to expose from the container. Exposing a port here gives the

     system additional information about the network connections a container

     uses, but is primarily informational. Not specifying a port here DOES NOT

     prevent that port from being exposed. Any port which is listening on the

     default "0.0.0.0" address inside a container will be accessible from the

     network. Cannot be updated.

   args    <[]string>

     Arguments to the entrypoint. The docker image's CMD is used if this is not

     provided. Variable references $(VAR_NAME) are expanded using the

     container's environment. If a variable cannot be resolved, the reference in

     the input string will be unchanged. The $(VAR_NAME) syntax can be escaped

     with a double $$, ie: $$(VAR_NAME). Escaped references will never be

     expanded, regardless of whether the variable exists or not. Cannot be

     updated. More info:

     https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

   command    <[]string>

     Entrypoint array. Not executed within a shell. The docker image's

     ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME)

     are expanded using the container's environment. If a variable cannot be

     resolved, the reference in the input string will be unchanged. The

     $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME).

     Escaped references will never be expanded, regardless of whether the

     variable exists or not. Cannot be updated. More info:

     https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell

KUBERNETES-1-4-控制器应用一

2.我们可以通过kubectl get pods --show-labels来查看pod的标签信息。kubectl get pods -l 可以查看含有标签值含有某字段的相关信息。kubectl get pods -L可以查看含有标签名含有某字段的相关信息。

[[email protected] ~]# kubectl get pods

NAME                          READY     STATUS      RESTARTS   AGE

client                        0/1       Completed   0          2d

myapp-848b5b879b-7h254        1/1       Running     2          2d

myapp-848b5b879b-d7rjs        1/1       Running     2          2d

myapp-848b5b879b-wv5cz        1/1       Running     2          2d

nginx-deploy-5b595999-tj8ms   1/1       Running     2          2d

[[email protected] ~]# cd manifests/

[[email protected] manifests]# vim pod-demo.yaml 

[[email protected] manifests]# cat pod-demo.yaml

apiVersion: v1

kind: Pod

metadata:

  name: pod-demo

  namespace: default

  labels:

    app: myapp

    tier: frontend

spec:

  containers:

  - name: myapp

    image: ikubernetes/myapp:v1

    ports:

    - name: http

      containerPort: 80

    - name: https

      containerPort: 443

  - name: busybox

    image: busybox:latest

    imagePullPolicy: IfNotPresent

    command: 

    - "/bin/sh"

    - "-c"

    - "sleep 3600"

[[email protected] manifests]# kubectl create -f pod-demo.yaml 

pod/pod-demo created

[[email protected] manifests]# kubectl get pods --show-labels

NAME                          READY     STATUS      RESTARTS   AGE       LABELS

client                        0/1       Completed   0          2d        run=client

myapp-848b5b879b-7h254        1/1       Running     2          2d        pod-template-hash=4046164356,run=myapp

myapp-848b5b879b-d7rjs        1/1       Running     2          2d        pod-template-hash=4046164356,run=myapp

myapp-848b5b879b-wv5cz        1/1       Running     2          2d        pod-template-hash=4046164356,run=myapp

nginx-deploy-5b595999-tj8ms   1/1       Running     2          2d        pod-template-hash=16151555,run=nginx-deploy

pod-demo                      2/2       Running     0          51s       app=myapp,tier=frontend

[[email protected] manifests]# kubectl get pods -l app --show-labels

NAME       READY     STATUS    RESTARTS   AGE       LABELS

pod-demo   2/2       Running   0          4m        app=myapp,tier=frontend

[[email protected] manifests]# kubectl get pods -L app,run --show-labels

NAME                          READY     STATUS      RESTARTS   AGE       APP       RUN            LABELS

client                        0/1       Completed   0          2d                  client         run=client

myapp-848b5b879b-7h254        1/1       Running     2          2d                  myapp          pod-template-hash=4046164356,run=myapp

myapp-848b5b879b-d7rjs        1/1       Running     2          2d                  myapp          pod-template-hash=4046164356,run=myapp

myapp-848b5b879b-wv5cz        1/1       Running     2          2d                  myapp          pod-template-hash=4046164356,run=myapp

nginx-deploy-5b595999-tj8ms   1/1       Running     2          2d                  nginx-deploy   pod-template-hash=16151555,run=nginx-deploy

pod-demo                      2/2       Running     0          4m        myapp                    app=myapp,tier=frontend

3.kubectl label pods可以为pod增加标签值。对同一个标签再次赋值时会报错,需要使用--overwrite参数。

[[email protected] manifests]# kubectl label pods pod-demo release=canary

pod/pod-demo labeled

[[email protected] manifests]# kubectl get pods -l app --show-labels

NAME       READY     STATUS    RESTARTS   AGE       LABELS

pod-demo   2/2       Running   0          6m        app=myapp,release=canary,tier=frontend

[[email protected] manifests]# kubectl label pods pod-demo release=stable

error: 'release' already has a value (canary), and --overwrite is false

[[email protected] manifests]# kubectl label pods pod-demo release=stable --overwrite

pod/pod-demo labeled

[[email protected] manifests]# kubectl get pods -l app --show-labels

NAME       READY     STATUS    RESTARTS   AGE       LABELS

pod-demo   2/2       Running   0          11m       app=myapp,release=stable,tier=frontend

4.标签选择器中等值关系选择器的使用。kubectl get pods -l 后面附加等值筛选。或者后面加不等值筛选也可以实现。

[[email protected] manifests]# kubectl get pods -l release=stable --show-labels

NAME       READY     STATUS    RESTARTS   AGE       LABELS

pod-demo   2/2       Running   0          15m       app=myapp,release=stable,tier=frontend

[[email protected] manifests]# kubectl get pods -l release!=stable --show-labels

NAME                          READY     STATUS      RESTARTS   AGE       LABELS

client                        0/1       Completed   0          2d        run=client

myapp-848b5b879b-7h254        1/1       Running     2          2d        pod-template-hash=4046164356,run=myapp

myapp-848b5b879b-d7rjs        1/1       Running     2          2d        pod-template-hash=4046164356,run=myapp

myapp-848b5b879b-wv5cz        1/1       Running     2          2d        pod-template-hash=4046164356,run=myapp

nginx-deploy-5b595999-tj8ms   1/1       Running     2          2d        pod-template-hash=16151555,run=nginx-deploy

5.标签选择器中集合关系选择器的使用。kubectl get pods -l后面通过in来筛选标签属于某一集合。或者通过notin来筛选标签属于某一集合。对于字符串中间可能存在的空格,可以使用双引号。

[[email protected] manifests]# kubectl get pods -l "release in (stable,alpha,beta)"

NAME       READY     STATUS    RESTARTS   AGE

pod-demo   2/2       Running   0          25m

[[email protected] manifests]# kubectl get pods -l "release notin (stable,alpha,beta)"

NAME                          READY     STATUS      RESTARTS   AGE

client                        0/1       Completed   0          2d

myapp-848b5b879b-7h254        1/1       Running     2          2d

myapp-848b5b879b-d7rjs        1/1       Running     2          2d

myapp-848b5b879b-wv5cz        1/1       Running     2          2d

nginx-deploy-5b595999-tj8ms   1/1       Running     2          2d

6.标签选择器除了可以给Pod打标签,也可以用来给node等各种资源打标签。

[[email protected] manifests]# kubectl get nodes

NAME                 STATUS    ROLES     AGE       VERSION

master.example.com   Ready     master    3d        v1.11.1

node1.example.com    Ready     <none>    3d        v1.11.1

node2.example.com    Ready     <none>    2d        v1.11.1

[[email protected] manifests]# kubectl get nodes --show-labels

NAME                 STATUS    ROLES     AGE       VERSION   LABELS

master.example.com   Ready     master    3d        v1.11.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master.example.com,node-role.kubernetes.io/master=

node1.example.com    Ready     <none>    3d        v1.11.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node1.example.com

node2.example.com    Ready     <none>    2d        v1.11.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node2.example.com

[[email protected] manifests]# kubectl label nodes node1.example.com disktype=ssd

node/node1.example.com labeled

[[email protected] manifests]# kubectl get nodes --show-labels

NAME                 STATUS    ROLES     AGE       VERSION   LABELS

master.example.com   Ready     master    3d        v1.11.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master.example.com,node-role.kubernetes.io/master=

node1.example.com    Ready     <none>    3d        v1.11.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node1.example.com

node2.example.com    Ready     <none>    2d        v1.11.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node2.example.com

7.nodeSelector可以作为节点标签选择器,来对pod运行的节点进行筛选。例如在pod-demo.yaml中增加disktype: ssd的参数,则在创建资源的时候nodeSelector会自动筛选符合的节点。

[[email protected] manifests]# kubectl delete -f pod-demo.yaml 

pod "pod-demo" deleted

[[email protected] manifests]# vim pod-demo.yaml 

[[email protected] manifests]# cat pod-demo.yaml 

apiVersion: v1

kind: Pod

metadata:

  name: pod-demo

  namespace: default

  labels:

    app: myapp

    tier: frontend

spec:

  containers:

  - name: myapp

    image: ikubernetes/myapp:v1

    ports:

    - name: http

      containerPort: 80

    - name: https

      containerPort: 443

  - name: busybox

    image: busybox:latest

    imagePullPolicy: IfNotPresent

    command: 

    - "/bin/sh"

    - "-c"

    - "sleep 3600"

  nodeSelector:

    disktype: ssd

[[email protected] manifests]# kubectl create -f pod-demo.yaml

pod/pod-demo created

[[email protected] manifests]# kubectl describe pods pod-demo

Events:

  Type    Reason     Age   From                        Message

  ----    ------     ----  ----                        -------

  Normal  Scheduled  1m    default-scheduler           Successfully assigned default/pod-demo to node1.example.com

  Normal  Pulled     1m    kubelet, node1.example.com  Container image "ikubernetes/myapp:v1" already present on machine

  Normal  Created    1m    kubelet, node1.example.com  Created container

  Normal  Started    1m    kubelet, node1.example.com  Started container

  Normal  Pulled     1m    kubelet, node1.example.com  Container image "busybox:latest" already present on machine

  Normal  Created    1m    kubelet, node1.example.com  Created container

  Normal  Started    1m    kubelet, node1.example.com  Started container

8.资源注解。pod-demo.yaml脚本中通过annotations:来定义注解。kubectl describe pods查看innotation。

[[email protected] manifests]# kubectl delete -f pod-demo.yaml 

pod "pod-demo" deleted

[[email protected] manifests]# vim pod-demo.yaml 

[[email protected] manifests]# cat pod-demo.yaml 

apiVersion: v1

kind: Pod

metadata:

  name: pod-demo

  namespace: default

  labels:

    app: myapp

    tier: frontend

  annotations:

    example.com/created-by: "cluster admin"

spec:

  containers:

  - name: myapp

    image: ikubernetes/myapp:v1

    ports:

    - name: http

      containerPort: 80

    - name: https

      containerPort: 443

  - name: busybox

    image: busybox:latest

    imagePullPolicy: IfNotPresent

    command: 

    - "/bin/sh"

    - "-c"

    - "sleep 3600"

  nodeSelector:

    disktype: ssd

[[email protected] manifests]# kubectl create -f pod-demo.yaml

pod/pod-demo created

[[email protected] manifests]# kubectl describe pods pod-demo

Name:               pod-demo

Namespace:          default

Priority:           0

PriorityClassName:  <none>

Node:               node1.example.com/172.20.0.129

Start Time:         Mon, 10 Dec 2018 00:48:43 -0500

Labels:             app=myapp

                    tier=frontend

Annotations:        example.com/created-by=cluster admin

继续阅读