3.2 Creating pods from YAML or JSON descriptors


pod 和其他 Kubernetes 资源通常是通过向 Kubernetes REST API 提供JSON或YAML描述文件来创建的 。同样,你也可以用其他更简单的方法创建资源,例如您在前面使用的 kubectl run 命令,但它们通常只允许您配置一组有限的属性。

因此,为了配置每种类型资源的各种属性,我们需要了解并理解 Kubernetes API 对象定义。

Kubernetes API 参考文档:http://kubernetes.io/docs/reference/

3.2.1 检查现有 pod 的 YAML 描述文件

Usage:

使用-o ymal选项获取 pod 的 YAML 定义:
kubectl get pods -o yaml
image.png
image.png

  1. #pod的基本组成部分:
  2. apiVersion:
  3. kind: REST resource
  4. metadata:
  5. spec: Specification
  6. status: #运行时才有这个数据

status 部分包含只读的运行时数据,该数据展示了给定时刻的资源状态。而在创建新的 pod 时,永远不需要提供 status 部分。

3.2.2 为 pod 创建一个简单的 YAML 描述文件

image.png

指定容器端口

在pod定义中指定端口纯粹是展示性的(informational)。忽略它们对于客户端是否可以通过端口连接到pod不会带来任何影响。但明确定义端口仍是有意义的,在端口定义下,每个使用集群的人都可以快速查看每个pod对外暴露的端口,可允许你为每个端口指定一个名称方便我们使用。

使用 kubectl explain 来发现可能的 API 对象字段

API对象支持属性参考文档:http://kubernetes.io/docs/api

Usage:

kubectl explain

查看pod的属性:
kubectl explain pods

查看spec的属性:
kubectl explain pod.spec

3.2.3 使用 kubectl create 来创建 pod

cd /root/k8s/

cat >kubia-manual.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: 10.0.0.10:5000/luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP
EOF

kubectl create -f kubia-manual.yaml

从YAML或JSON文件创建任何资源(不只是pod)

Usage:

kubectl create -f FILENAME

得到运行中 pod 的完整定义

pod创建完成后, 可以请求 Kubernetes 来获得完整的描述文件,并不区分创建时用哪种格式。

Usage:

kubectl get TYPE NAME -o (yaml | json)

查看YMAL格式的描述文件
kubectl get pods -o yaml
-o, —output=’’: Output format.

查看JSON格式的描述文件
kubectl get pods -o json

在 pod 列表中查看新创建的 pod

kubectl get pods

3.2.4 查看应用程序日志

容器化的应用程序通常会将日志记录到标准输出和标准错误流, 而不是将其写入文件, 这就允许用户可以通过简单、 标准的方式查看不同应用程序的日志。

容器运行时(在我们的例子中为Docker)将这些流重定向到文件, 并允许我们运行以下命令来获取容器的日志:(容器所在节点上执行)
docker logs <容器>

使用 kubectl logs 命令获取 pod 日志

Usage:

查看pod的日志(更准确地说是容器的日志), 只需要在本机上运行以下命令(适用于单容器)(master上执行)
kubectl logs

注意:每天或者每次日志文件达到10MB大小时, 容器日志都会自动轮替。
kubectl logs 命令仅显示最后一次轮替后的日志条目。

获取多容器 pod 的日志时指定容器名称

Usage:

kubectl logs -c
-c, —container=’’

注意:我们只能获取仍然存在的pod的日志。当一个pod被删除时,它的日志也会被删除。 如果希望在pod删除之后仍然可以获取其日志, 我们需要设置中心化的、 集群范围的日志系统, 将所有日志存储到中心存储中。

3.2.5 向pod发送请求

将本地网络端口转发到 pod 中的端口

如果想要在不通过service的情况下与某个特定的pod 进行通信(出于调试或
其他原因),Kubemetes将允许我们配置端口转发到该pod:

Usage:

kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT […[LOCAL_PORT_N:]REMOTE_PORT_N]

#将机器的本地(Master)端口8888转发到pod/kubia-manual 的端口8080:
kubectl port-forward kubia-manual 8888:8080

#转发时会夯在那里,需要另开终端测试连接
curl localhost:8888

image.png