💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
Pod 和其他 Kubernetes 资源通过向 Kubernetes REST API 提供 JSON 或 YAML 描述文件来创建,由于 YAML 格式具有更好的可读性,kubectl 在请求 API 时会从配置文件中读取 YAML 格式内容并转换为 JSON 格式后再发送给 API Server。 #### 编写 YAML 描述文件 编写一个 YAML 文件有 4 个重要的组成部分: * apiVersion: YAML 描述文件所使用的 Kubernetes API 版本 * kind: Kubernetes 对象/资源类型 * metadata: Pod 元数据(名称、命名空间、标签、注解等) * spec: Pod 规格/内容(容器列表、存储卷等) 在`/home/shiyanlou`目录下新建`nginx-manual.yaml`文件,并向该文件中写入如下内容: ~~~yaml apiVersion: v1 kind: Pod metadata: name: nginx-manual spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1 name: nginx ports: - containerPort: 80 protocol: TCP ~~~ 上面的这个 YAML 文件定义了我们要创建一个名为 nginx-manual 的 Pod,这个 Pod 中运行了一个基于 nginx:1.9.1 镜像构建的名为 nginx 的容器,默认监听在 80 端口。 大家在编写的时候如果不清楚有哪些可用属性,可以使用`kubectl explain`来查看: ~~~bash # 查看 pods 有哪些属性 kubectl explain pods # 查看具体的属性 kubectl explain pod.spec ~~~ #### 执行创建 使用如下命令可以创建 Pod: ~~~bash $ kubectl create -f nginx-manual.yaml pod/nginx-manual created ~~~ 在 Pod 列表中查看新创建的 Pod: ~~~bash $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-manual 0/1 ContainerCreating 0 4s $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-manual 1/1 Running 0 16s ~~~ 可以看到这个 Pod 已经创建成功并在运行中。 Pod 在整个生命周期中存在各种状态,常见的状态如下所示: | 状态 | 描述 | | --- | --- | | Pending | API Server 已经创建该 Pod,但在 Pod 内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程 | | Running | Pod 内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态 | | Succeeded | Pod 内所有容器均成功执行后退出,且不会再重启 | | Failed | Pod 内所有容器均已退出,但至少有一个容器退出为失败状态 | | Unknown | 由于某种原因无法获取该 Pod 的状态,可能由于网络通信不畅导致的 | 另外 Pod 的重启策略(RestartPolicy)有 3 种,分别为: * `Always`:默认策略,当容器失效时,kubelet 会自动重启该容器 * `OnFailure`:当容器终止运行且退出码不为 0 时,kubelet 会自动重启该容器 * `Never`:不论容器运行状态如何,kubelet 都不重启该容器 #### 查看运行中的 Pod 完整定义 查看一个 Pod 的 YAML 描述文件: ~~~bash kubectl get pod nginx-manual -o yaml # 也可以查看 json 格式的 # kubectl get pod nginx-manual -o json ~~~ 结果如下所示: ~~~yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: 2019-08-04T08:56:24Z name: nginx-manual namespace: default resourceVersion: '1384' selfLink: /api/v1/namespaces/default/pods/nginx-manual uid: bcf146de-b695-11e9-b712-ce9ce5f54bfa spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1 imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/run/secrets/kubernetes.io/serviceaccount name: default-token-ttqxg readOnly: true dnsPolicy: ClusterFirst nodeName: kube-node-1 restartPolicy: Always schedulerName: default-scheduler securityContext: {} serviceAccount: default serviceAccountName: default terminationGracePeriodSeconds: 30 tolerations: - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 volumes: - name: default-token-ttqxg secret: defaultMode: 420 secretName: default-token-ttqxg status: conditions: - lastProbeTime: null lastTransitionTime: 2019-08-04T08:56:24Z status: 'True' type: Initialized - lastProbeTime: null lastTransitionTime: 2019-08-04T08:56:34Z status: 'True' type: Ready - lastProbeTime: null lastTransitionTime: 2019-08-04T08:56:24Z status: 'True' type: PodScheduled containerStatuses: - containerID: docker://111b01507bed8b5b752529e778ee79895ebe60a5d73244f3ac84362634e85360 image: registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx:1.9.1 imageID: docker-pullable://registry.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/nginx@sha256:a42a428525996f3a84d466ee628a074cac568e0e8c99b5d6f7398be342337039 lastState: {} name: nginx ready: true restartCount: 0 state: running: startedAt: 2019-08-04T08:56:34Z hostIP: 10.192.0.3 phase: Running podIP: 10.244.2.3 qosClass: BestEffort startTime: 2019-08-04T08:56:24Z ~~~ 这个 Pod 是处于运行状态,最终获取到的信息会比较多,可以看到前面我们定义的 4 个部分都展示了出来,这里额外还显示了一个部分: * status: 运行中的 Pod 及其内容容器当前的详细状态(Pod 所处的条件、每个容器的状态、内部 IP 等) 注意:status 是运行的 Pod 在查询时刻的资源状态,所以在编写 YAML 文件的时候不需要这个属性。 #### 查看日志 如果 Pod 上只包含一个容器,想要查看该容器的日志,就可以通过如下命令查看日志: ~~~bash kubectl logs nginx-manual ~~~ 如果 Pod 上包含多个容器,在查询具体容器的日志时,需要指定参数`-c 容器名`进行查询,比如: ~~~bash kubectl logs nginx-manual -c nginx ~~~ 需要注意的是:每天或是每次日志文件达到 10M 大小之后,容器日志会自动轮替,kubectl logs 命令只显示最后一次轮替后的日志。 #### 测试 Pod 端口是否可用 Pod 运行之后想要测试(调试)一下是否可用,怎么办呢?可以使用`kubectl port-forward`命令来执行端口转发,将本地的 8080 端口转发到 nginx-manual 的 80 端口,执行如下命令: ~~~bash $ kubectl port-forward nginx-manual 8080:80 Forwarding from 127.0.0.1:8080 -> 80 ~~~ 使用 curl 命令向 pod 发送 HTTP 请求,新开一个标签,执行: ~~~bash $ curl http://localhost:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> ~~~