使用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