【Kubernetes 系列】一文带你吃透 K8S 应用pod结点

作者:半身风雪
上一节:创建K8s集群项目
简介:上一节我们一起学习了,如何去部署一个K8S 的应用程序,这一节,我们主要讲解一下,K8S 应用的框架结构。



目标

本节我将和大家一起学习Kubernetes 应用中的pod结点

  • 了解 Kubernetes Pod。
  • 了解 Kubernetes 工作节点。
  • 对已部署的应用故障排除。

一、Kubernetes Pods

在上一节中,我们一起学会了如何使用 kubectl 创建一个应用。这里我们一起来重温一遍。

  1. 启动minikube 集群

minikube start

  1. 打开 Kubernetes 仪表板(Dashboard)

minikube dashboard

在 dashboard 中,我们找到pods 结点,并打开

在这里插入图片描述

1.1、Kubernetes 中的pod 是做什么的

PodKubernetes 抽象出来的,表示一组一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源。这些资源包括:

  • 共享存储,当作卷
  • 网络,作为唯一的集群 IP 地址
  • 有关每个容器如何运行的信息,例如容器映像版本或要使用的特定端口。

Pod 是为应用程序的“logic host”建模,并且可以包含相对紧耦合的不同应用容器。例如,Pod 可能既包含带有 Node.js 应用的容器,也包含另一个不同的容器,用于提供 Node.js 网络服务器要发布的数据。Pod 中的容器共享 IP 地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行。

扫描二维码关注公众号,回复: 14344325 查看本文章

Pod是 Kubernetes 平台上的原子单元。 当我们在 Kubernetes 上创建 Deployment 时,该 Deployment 会在其中创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都与调度它的工作节点绑定,并保持在那里直到终止(根据重启策略)或删除。 如果工作节点发生故障,则会在集群中的其他可用工作节点上调度相同的 Pod。

通过运行起来的程序,我们可以在web 界面中,非常直观的看到pods 所有信息。

二、工作结点

首先,我们先来看一张图:

在这里插入图片描述

通过这张官方图,再结合我们自己的应用程序中的pods 结点的展示内容,你是不是也发现了什么呢?

每一个 pod 都是运行在 工作节点中。工作节点是 Kubernetes 中的参与计算的机器,可以是虚拟机或物理计算机,具体取决于集群。每个工作节点由主节点管理。工作节点可以有多个 pod ,Kubernetes 主节点会自动处理在集群中的工作节点上调度 pod 。 主节点的自动调度考量了每个工作节点上的可用资源。

每一个 Kubernetes 工作节点必须包含Kubelet容器:

  • Kubelet,负责 Kubernetes 主节点和工作节点之间通信的过程; 它管理 Pod 和机器上运行的容器。
  • 容器运行时(如 Docker)负责从仓库中提取容器镜像,解压缩容器以及运行应用程序。

在这里插入图片描述

三、故障排除

我们之前一直使用的Kubectl 命令来获取应用的相关信息,那么我们如何查看已经部署的项目的环境信息呢?当然还是使用Kubectl 相关命令咯。

3.1、常见kubectl 命令

下面我们一起来看看几个最常见的 kubectl 命令:

  • kubectl get - 列出资源
  • kubectl describe - 显示有关资源的详细信息
  • kubectl logs - 打印 pod 和其中容器的日志
  • kubectl exec - 在 pod 中的容器上执行命令

3.2、可视化界面

我们除了使用上面的 kubectl 命令 来查看及排查应用的故障之外, Kubernetes 仪表板(Dashboard)也为我们做出了最直观的展示。

点击应用名称,进入详情页面
在这里插入图片描述

  • Metadata - 元数据
    在这里插入图片描述

  • Resource information - 资源信息

在这里插入图片描述

  • Conditions - 条件

在这里插入图片描述

  • Controlled by - 管控器

在这里插入图片描述

  • Persistent Volume Claims - 资源体积

在这里插入图片描述

  • Events - 事件

在这里插入图片描述

  • 容器状态

在这里插入图片描述

四、pod 资源详情

看到这里,肯定大家也有一些困惑,我们能不能更直观的,查看整个pods 资源,并且做一些修改呢?下面我们一起来看一张图:

在这里插入图片描述

  1. 查看pods 日志。
  2. 在pod 中重新运行编译加载资源。
  3. pod 资源编辑,在这里可以修改当前pod 资源类似。
    在这里插入图片描述
  4. 删除当前pod 资源

pod 资源详细内容

kind: Pod
apiVersion: v1
metadata:
  name: hello-node-6b89d599b9-jdg2k
  generateName: hello-node-6b89d599b9-
  namespace: default
  uid: 52ca897e-8cf5-469c-a221-b19d1f5f8dfc
  resourceVersion: '1984'
  creationTimestamp: '2022-07-01T06:36:04Z'
  labels:
    app: hello-node
    pod-template-hash: 6b89d599b9
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: hello-node-6b89d599b9
      uid: 6fff5c66-6897-47f0-b531-c7f8c6d2acb3
      controller: true
      blockOwnerDeletion: true
  managedFields:
    - manager: kube-controller-manager
      operation: Update
      apiVersion: v1
      time: '2022-07-01T06:36:04Z'
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:generateName: {
    
    }
          f:labels:
            .: {
    
    }
            f:app: {
    
    }
            f:pod-template-hash: {
    
    }
          f:ownerReferences:
            .: {
    
    }
            k:{
    
    "uid":"6fff5c66-6897-47f0-b531-c7f8c6d2acb3"}: {
    
    }
        f:spec:
          f:containers:
            k:{
    
    "name":"echoserver"}:
              .: {
    
    }
              f:image: {
    
    }
              f:imagePullPolicy: {
    
    }
              f:name: {
    
    }
              f:resources: {
    
    }
              f:terminationMessagePath: {
    
    }
              f:terminationMessagePolicy: {
    
    }
          f:dnsPolicy: {
    
    }
          f:enableServiceLinks: {
    
    }
          f:restartPolicy: {
    
    }
          f:schedulerName: {
    
    }
          f:securityContext: {
    
    }
          f:terminationGracePeriodSeconds: {
    
    }
    - manager: Go-http-client
      operation: Update
      apiVersion: v1
      time: '2022-07-01T06:36:05Z'
      fieldsType: FieldsV1
      fieldsV1:
        f:status:
          f:conditions:
            k:{
    
    "type":"ContainersReady"}:
              .: {
    
    }
              f:lastProbeTime: {
    
    }
              f:lastTransitionTime: {
    
    }
              f:status: {
    
    }
              f:type: {
    
    }
            k:{
    
    "type":"Initialized"}:
              .: {
    
    }
              f:lastProbeTime: {
    
    }
              f:lastTransitionTime: {
    
    }
              f:status: {
    
    }
              f:type: {
    
    }
            k:{
    
    "type":"Ready"}:
              .: {
    
    }
              f:lastProbeTime: {
    
    }
              f:lastTransitionTime: {
    
    }
              f:status: {
    
    }
              f:type: {
    
    }
          f:containerStatuses: {
    
    }
          f:hostIP: {
    
    }
          f:phase: {
    
    }
          f:podIP: {
    
    }
          f:podIPs:
            .: {
    
    }
            k:{
    
    "ip":"172.17.0.3"}:
              .: {
    
    }
              f:ip: {
    
    }
          f:startTime: {
    
    }
      subresource: status
spec:
  volumes:
    - name: kube-api-access-79cmb
      projected:
        sources:
          - serviceAccountToken:
              expirationSeconds: 3607
              path: token
          - configMap:
              name: kube-root-ca.crt
              items:
                - key: ca.crt
                  path: ca.crt
          - downwardAPI:
              items:
                - path: namespace
                  fieldRef:
                    apiVersion: v1
                    fieldPath: metadata.namespace
        defaultMode: 420
  containers:
    - name: echoserver
      image: k8s.gcr.io/echoserver:1.4
      resources: {
    
    }
      volumeMounts:
        - name: kube-api-access-79cmb
          readOnly: true
          mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      terminationMessagePath: /dev/termination-log
      terminationMessagePolicy: File
      imagePullPolicy: IfNotPresent
  restartPolicy: Always
  terminationGracePeriodSeconds: 30
  dnsPolicy: ClusterFirst
  serviceAccountName: default
  serviceAccount: default
  nodeName: minikube
  securityContext: {
    
    }
  schedulerName: default-scheduler
  tolerations:
    - key: node.kubernetes.io/not-ready
      operator: Exists
      effect: NoExecute
      tolerationSeconds: 300
    - key: node.kubernetes.io/unreachable
      operator: Exists
      effect: NoExecute
      tolerationSeconds: 300
  priority: 0
  enableServiceLinks: true
  preemptionPolicy: PreemptLowerPriority
status:
  phase: Running
  conditions:
    - type: Initialized
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2022-07-01T06:36:04Z'
    - type: Ready
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2022-07-01T06:36:05Z'
    - type: ContainersReady
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2022-07-01T06:36:05Z'
    - type: PodScheduled
      status: 'True'
      lastProbeTime: null
      lastTransitionTime: '2022-07-01T06:36:04Z'
  hostIP: 192.168.49.2
  podIP: 172.17.0.3
  podIPs:
    - ip: 172.17.0.3
  startTime: '2022-07-01T06:36:04Z'
  containerStatuses:
    - name: echoserver
      state:
        running:
          startedAt: '2022-07-01T06:36:04Z'
      lastState: {
    
    }
      ready: true
      restartCount: 0
      image: k8s.gcr.io/echoserver:1.4
      imageID: >-
        docker-pullable://k8s.gcr.io/echoserver@sha256:5d99aa1120524c801bc8c1a7077e8f5ec122ba16b6dda1a5d3826057f67b9bcb
      containerID: >-
        docker://ad3680651ec9494578d3217606d040e1ce5469eb8ba7644f8efa4d8c0d5e8411
      started: true
  qosClass: BestEffort

总结

本节内容相对比较简单,但却很重要,还是需要花费一点时间,做一个详细的验证学习理解的。
那么本节内容到这里就结束了,下一节我们一起学习如何将 Pod 暴露给外部实现通信交互。

猜你喜欢

转载自blog.csdn.net/u010755471/article/details/125557728