Kubernetes基础--Pod用法

TOC
  1. 1. 常用命令
  2. 2. 标签

Pod 是 Kubernetes 调度的最小单元。一个 Pod 可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机。Pod 有控制器管理的 Pod 和自主式 Pod 两种用法,本文介绍的是自主式 Pod。自主式 Pod 也就是没有控制器参与的 Pod,删除后无法再次创建。
首先下载镜像到本地 Docker 仓库,用来演示创建 Pod 的过程。

1
2
docker pull tutum/hello-world    
docker images

tutum/hello-world是在 dockerHub 上找到的一个镜像,开放 80 端口。
编写生成 Pod 的 YAML

1
2
3
4
5
6
7
8
9
10
11
12
master@master:/data/k8s/conf$ cat kubia-manual.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual
spec:
containers:
- image: tutum/hello-world
name: hello
ports:
- containerPort: 80
protocol: TCP
参数名 字段类型 说明
apiVersion String K8S API 的版本,目前是 v1
kind String YAML 文件定义的资源类型和角色,比如:Pod
metadata Object 元数据对象,固定值写 metadata
metadata name String 元数据对象的名字,这里由我们编写,比如命名 Pod 的名字
metadata namespace String 元数据对象的命名空间,有我们自身定义
spec Object 详细定义对象,固定值写 Spec
spec.containers[] list 这里是 Spec 对象的容器列表定义,是一个列表
spec.containers[].name String 这里定义容器的名字
spec.containers[].image String 这里定义要用到的镜像名称
spec.containers[].imagePullPolicy String 定义镜像的拉取策略,有 Always、Never、IfNotPresent 三个值。Always:每次都尝试重新拉取镜像;Never 表示仅使用本地镜像;IfNotPresent:本地有镜像就使用本地镜像,默认为 Always
spec.containers[].command[] List 指定容器启动命令,因为是数据可以指定多个,不指定则使用镜像打包时使用的启动命令
spec.containers[].args[] List 指定容器启动命令参数
spec.containers[].workingDir String 指定容器的工作目录
spec.containers[].volumeMounts[] List 指定容器内部的存储卷配置
spec.containers[].volumeMounts[].name String 指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPath String 指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnly String 设置存储卷路径的读写模式,true 或者 false,默认为读写模式
spec.containers[].ports[] List 指定端口名称
spec.containers[].ports[].name String 指定端口名称
spec.containers[].ports[].containerPort String 指定容器需要监听的端口号
spec.containers[].ports[].hostPort String 指定容器所在主机需要监听的端口号,默认跟上面的 containerPort 相同,注意设置了 hostPort 同一台主机无法启动该容器的相同副本,因为端口号相同会冲突
spec.containers[].ports[].protocol String 指定端口协议,支持 TCP 和 UDP,默认为 TCP
spec.containers[].env[] List 指定容器运行前需设置的环境变量列表
spec.containers[].env[].name String 指定环境变量名称
spec.containers[].env[].value String 指定环境变量值
spec.containers[].resource Object 指定资源限制和资源请求的值
spec.containers[].resource.limits Object 指定设置容器运行时资源的运行上限
spec.containers[].resource.limits.cpu String 指定 CPU 的限制,单位为 core 数,将用于 docker run –cpu-shares 参数
spec.containers[].resource.limits.memory String 指定 MEM 内存的限制,单位为 MlB,GiB
spec.containers[].resource.requests Object 指定容器启动和调度时的限制设置
spec.containers[].resource.requests.cpu String CPU 请求,单位为 core 数,容器启动时初始化可用数量
spec.containers[].resource.requests.memory String 内存请求,单位为 MlB,GiB,容器启动的初始化可用数量
spec.restartPolicy String 定义 Pod 的重启策略,可选值为 Always、OnFailure、Never,默认值为 Always。Always:Pod 一旦终止运行,kubelet 服务都会重启。OnFailure:只有 Pod 以非零退出吗终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为 0),则不会重启。Never:Pod 终止后,kubelet 将退出码报告给 Master,不会重启该 Pod
spec.nodeSelector Object 定义 Node 的 Label 过滤标签,以 name:value 格式指定
spec.imagePullSecrets Object 定义 pull 镜像时使用 secret 名称,以 name:secretkey 格式指定
spec.hostNetWork Boolean 定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true 将无法在同一台宿主机上启动第二个副本

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
# 根据yaml文件创建pod
kubectl create -f kubia-manual.yaml
# 查看kubia-manual的详细yaml
kubectl get po kubia-manual -o yaml
# 查看k8s中所有pod
kubectl get pods
# 删除pod
kubectl delete pod kubia-manual
# 查看Pod日志
kubectl logs kubia-manual
# 查看Pod中的hello容器的日志,这里的容器名称为spec.containers[].name定义的名字
kubectl logs kubia-manual -c hello

正常需要通过 Service 和 Pod 通信,也可以直接将配置端口转发到 pod,可以使用 kubectl port-forward 命令转发,下面的指令将本地端口的 8888 转发到 pod 的 80 端口。然后使用 curl 命令即可查看容器返回的消息。

1
2
kubectl port-forward kubia-manual 8888:80
curl localhost:8888

标签

修改 YAML 文件,将 labels 信息加入,此时 pod 多了两个标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual-v1
labels:
creation_method: manual
env: prod
spec:
containers:
- image: tutum/hello-world
name: hello
ports:
- containerPort: 80
protocol: TCP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 使用 --show-labels参数,可以看到pod中的标签。
kubectl get po --show-labels

master@master:/data/k8s/conf$ kubectl get po --show-labels
NAME READY STATUS RESTARTS AGE LABELS
kubia-manual 1/1 Running 0 14m <none>
kubia-manual-v1 1/1 Running 0 49s creation_method=manual,env=prod

# -L命令可以分别查看标签的两列
kubectl get po -L creation_method,env
master@master:/data/k8s/conf$ kubectl get po -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
kubia-manual 1/1 Running 0 17m
kubia-manual-v1 1/1 Running 0 4m1s manual prod

# kubectl label参数可以修改标签
master@master:~$ kubectl label po kubia-manual env=dev
pod/kubia-manual labeled
master@master:~$ kubectl get po -L creation_method,env
NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV
kubia-manual 1/1 Running 0 23m dev
kubia-manual-v1 1/1 Running 0 9m16s manual prod

# 使用-l命令筛选env=dev的标签
master@master:~$ kubectl get po -l env=dev
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 34m

# 使用-l命令筛选存在env的标签,不管值多少
master@master:~$ kubectl get po -l env
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 36m
kubia-manual-v1 1/1 Running 0 22m

# 列出不包含creation_method标签的pod
master@master:~$ kubectl get po -l '!creation_method'
NAME READY STATUS RESTARTS AGE
kubia-manual 1/1 Running 0 37m

# 按标签删除Pod
master@master:~$ kubectl delete po -l creation_method=manual
pod "kubia-manual-v1" deleted