• 【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 地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行。

    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
    
    • 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
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178

    总结

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

  • 相关阅读:
    电脑如何去掉u盘写保护的状态
    C/C++如何写调试宏
    c语言 二分查找(迭代与递归)
    Chat GPT:智能对话的下一步
    李春葆、严蔚敏关于KMP算法的next数组值差1
    ctfshow-ssti
    浅谈倍增法求解LCA
    在 ASP.NET Core 应用程序中,Program.cs、Startup.cs 和 Module.cs区别作用
    Spark---介绍及安装
    L57.linux命令每日一练 -- 第九章 Linux进程管理命令 -- ps和pstree
  • 原文地址:https://blog.csdn.net/u010755471/article/details/125557728