Kuberbetes(七)--使用yaml创建Pod

6,307 阅读6分钟

使用YAML创建Pod

创建Pod

---
apiVersion: v1
kind: Pod    //rc(副本数)  deployment(副本数)    service
metadata:
  name: kube100-site
  labels:
    app: web
    app1: abc234 #注意:labels里面的标签值不能是纯数字
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: flaskapp-demo
      image: jcdemo/flaskapp
      ports:
        - containerPort: 5000

上面定义了一个普通的Pod文件,简单分析下文件内容:

• apiVersion:此处值是v1,这个版本号需要根据安装的Kubernetes版本和资源类型进行变化,记住不是写死的。

• kind:此处创建的是Pod,根据实际情况,此处资源类型可以是Deployment、Job、Ingress、Service等。

• metadata:包含Pod的一些meta信息,比如名称、namespace、标签等信息。

• spec:包括一些container,storage,volume以及其他Kubernetes需要的参数,以及诸如是否在容器失败时重新启动容器的属性。可在特定Kubernetes API找到完整的Kubernetes Pod的属性。

典型容器的定义:

一个简单的最小定义:一个名字(front-end)、基于nginx的镜像,以及容器将会监听的指定端口号(80)。

…
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
…

容器可选的设置属性:

除了上述的基本属性外,还能够指定复杂的属性,包括容器启动运行的命令、使用的参数、工作目录以及每次实例化是否拉取新的副本。
还可以指定更深入的信息,例如容器的退出日志的位置。
容器可选的设置属性包括:
name、image、command、args、workingDir、ports、env、resource、volumeMounts、livenessProbe、readinessProbe、livecycle、terminationMessagePath、imagePullPolicy、securityContext、stdin、stdinOnce、tty

创建Pod:

"了解"了Pod的定义后,将上面创建Pod的YAML文件保存成pod.yaml,然后使用Kubectl创建Pod:

# kubectl create -f pod.yaml
pod "kube100-site" created

验证语法:

当你不确定声明的配置文件是否书写正确时,使用以下命令要验证:

# kubectl create -f ./hello-world.yaml --validate

注:使用--validate只是会告诉你它发现的问题,仍然会按照配置文件的声明来创建资源,除非有严重的错误使创建过程无法继续,如必要的字段缺失或者字段值不合法,不在规定列表内的字段会被忽略。

查看pod状态

通过get命令来查看被创建的pod。 如果执行完创建pod的命令之后,你的速度足够快,那么使用get命令你将会看到以下的状态:

# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
hello-world   0/1       Pending   0          0s

# kubectl get pods
NAME           READY     STATUS    RESTARTS   AGE
kube100-site   2/2       Running   0          1m
注: Pod创建过程中如果出现错误,可以使用kubectl describe 进行排查。

各字段含义:
    NAME: Pod的名称
    READY: Pod的准备状况,右边的数字表示Pod包含的容器总数目,左边的数字表示准备就绪的容器数目。
    STATUS: Pod的状态。
    RESTARTS: Pod的重启次数
    AGE: Pod的运行时间。

pod的准备状况指的是Pod是否准备就绪以接收请求,Pod的准备状况取决于容器,即所有容器都准备就绪了,Pod才准备就绪。这时候kubernetes的代理服务才会添加Pod作为分发后端,而一旦Pod的准备状况变为false(至少一个容器的准备状况为false),kubernetes会将Pod从代理服务的分发后端移除,即不会分发请求给该Pod。

一个pod刚被创建的时候是不会被调度的,因为没有任何节点被选择用来运行这个pod。调度的过程发生在创建完成之后,但是这个过程一般很快,所以你通常看不到pod是处于unscheduler状态的除非创建的过程遇到了问题。

pod被调度之后,分配到指定的节点上运行,这时候,如果该节点没有所需要的image,那么将会自动从默认的Docker Hub上pull指定的image,一切就绪之后,你就可以看到pod是处于running状态了:

[root@k8s-master ~]# kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
my-nginx-379829228-2zjv3     1/1       Running   0          1h
my-nginx-379829228-mm8f8     1/1       Running   0          1h

查看pods所在的运行节点:

# kubectl get pods -o wide
#输出结果比kubectl get pods多出IP、NODE两列,显示节点信息

查看pods定义的详细信息:

# 可以将每一个pod的信息以yaml的形式来输出
# kubectl get pods -o yaml
# kubectl get pod nginx-8v3cg --output yaml

kubectl get支持以Go Template方式过滤指定的信息,比如

查询Pod的运行状态

# kubectl get pods busybox --output=go-template --template={{.status.phase}}
Running

查看pod输出:

你可能会有想了解在pod中执行命令的输出是什么,和Docker logs命令一样,kubectl logs将会显示这些输出:

# kubectl logs hello-world
hello world

查看kubectl describe 支持查询Pod的状态和生命周期事件:

[root@k8s-master ~]# kubectl describe   pod  busybox
Name:       busybox
Namespace:  default
Node:       k8s-node-1/116.196.105.133
Start Time: Thu, 22 Mar 2018 09:51:35 +0800
Labels:     name=busybox
        role=master
Status:     Pending
IP:     
Controllers:    <none>
Containers:
  busybox:
    Container ID:   
    Image:      docker.io/busybox
    Image ID:       
    Port:       
    Command:
      sleep
      360000
    State:          Waiting
      Reason:           ContainerCreating
    Ready:          False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:  <none>
Conditions:
  Type      Status
  Initialized   True 
  Ready     False 
  PodScheduled  True 
No volumes.
QoS Class:  BestEffort
Tolerations:    <none>
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason      Message
  --------- --------    -----   ----            -------------   --------    ------      -------
  7m        7m      1   {default-scheduler }            Normal      Scheduled   Successfully assigne
d busybox to k8s-node-1  7m     1m      6   {kubelet k8s-node-1}            Warning     FailedSync  Error syncing pod, s
kipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
  6m    13s 27  {kubelet k8s-node-1}        Warning FailedSync  Error syncing pod, skipping: failed to "StartContain
er" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

各字段含义:
    Name: Pod的名称
    Namespace: Pod的Namespace。
    Image(s): Pod使用的镜像
    Node: Pod所在的Node。
    Start Time: Pod的起始时间
    Labels: Pod的Label。
    Status: Pod的状态。
    Reason: Pod处于当前状态的原因。
    Message: Pod处于当前状态的信息。
    IP: Pod的PodIP
    Replication Controllers: Pod对应的Replication Controller。

    Containers:Pod中容器的信息

            Container ID: 容器的ID。
            Image: 容器的镜像
            Image ID:镜像的ID。
            State: 容器的状态。
            Ready: 容器的准备状况(true表示准备就绪)。
            Restart Count: 容器的重启次数统计。
            Environment Variables: 容器的环境变量。
            Conditions: Pod的条件,包含Pod准备状况(true表示准备就绪)
            Volumes: Pod的数据卷。
            Events: 与Pod相关的事件列表。

进入Pod对应的容器内部

[root@k8s-master /]# kubectl exec -it myweb-76h6w /bin/bash

删除pod:

# kubectl delete pod pod名   //单个删除
# kubectl delete pod --all   //批量删除
例:
[root@k8s-master /]# kubectl  delete pod hello-world
pod "hello-world" deleted

重新启动基于yaml文件的应用

# kubectl delete -f XXX.yaml
# kubectl create -f XXX.yaml