k8s 概念 + 实操查看 pod 和工作节点

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s 概念 + 实操查看 pod 和工作节点相关的知识,希望对你有一定的参考价值。

文章目录

Pod 基本概念

Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。


Kubernetes中的Pod使用主要方式

  • Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。

  • Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位 - 一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。


Pods提供两种共享资源:网络和存储

网络
每个Pod被分配一个独立的IP地址,Pod中的每个容器共享网络命名空间,包括IP地址和网络端口。Pod内的容器可以使用localhost相互通信。当Pod中的容器与Pod 外部通信时,他们必须协调如何使用共享网络资源(如端口)。

存储
Pod可以指定一组共享存储volumes。Pod中的所有容器都可以访问共享volumes,允许这些容器共享数据。volumes 还用于Pod中的数据持久化,以防其中一个容器需要重新启动而丢失数据。


Pod 控制器类型 ReplicationController & ReplicaSet & Deployment

ReplicationController 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而如果异常多出来的容器也会自动回收。
在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationController。ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector。

虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet 不支持 rolling- update 但 Deployment 支持)

Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义 (declarative) 方法,用来替代以前的 ReplicationController 来方便的管理应用。

典型的应用场景包括:

定义 Deployment 来创建 Pod 和 ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续 Deployment

操作部分

前一篇我们部署了一个应用,接下来我们继续来获取有关已部署的应用程序及其环境的信息。 最常见的操作可以使用以下 kubectl 命令完成:

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

要查看 Pod 中有哪些容器,以及用于构建这些容器的镜像,我们运行“ describe pods ”命令:

Name:         kubernetes-bootcamp-fb5c67579-gvtzr
Namespace:    default
Priority:     0
Node:         minikube/172.17.0.65
Start Time:   Fri, 28 Jan 2022 09:52:25 +0000
Labels:       app=kubernetes-bootcamp
              pod-template-hash=fb5c67579
Annotations:  <none>
Status:       Running
IP:           172.18.0.2
IPs:
  IP:           172.18.0.2
Controlled By:  ReplicaSet/kubernetes-bootcamp-fb5c67579
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://ab737181e274e3320ea6f7ff149460008d5bd42789dadadd01cd408f3d85764c
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 28 Jan 2022 09:52:33 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-g44np (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-g44np:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-g44np
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  33m   default-scheduler  Successfully assigned default/kubernetes-bootcamp-fb5c67579-gvtzr to minikube
  Normal  Pulled     33m   kubelet            Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine
  Normal  Created    33m   kubelet            Created container kubernetes-bootcamp
  Normal  Started    33m   kubelet            Started container kubernetes-bootcamp

我们可以看到 Pod 容器的详细信息:IP地址、使用的端口以及与 Pod 生命周期相关的事件列表。

descripe命令可用于获取大多数kubernetes原语的详细信息:节点、POD、部署。


应用程序输出的任何内容都会成为 Pod 中容器的日志。我们可以使用kubectl logs命令检索这些日志:

kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2022-01-28T09:52:34.261Z | Running On:  kubernetes-bootcamp-fb5c67579-gvtzr 

Running On: kubernetes-bootcamp-fb5c67579-gvtzr | Total Requests: 1 | App Uptime: 2204.953 seconds | Log Time: 2022-01-28T10:29:19.214Z

查看环境变量:

$ kubectl exec $POD_NAME -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-fb5c67579-gvtzr
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root

接下来,让我们在Pod的容器中启动一个bash会话:

kubectl exec -ti $POD_NAME -- bash

不想玩了可以退出:

exit

以上是关于k8s 概念 + 实操查看 pod 和工作节点的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes学习记录:k8s的架构和基本概念

k8s的数据存储

Kubernetes-Pod基本概念(六)

k8s集群架构和概念简述

k8s 实践经验:实操中学 k8s 五种资源Pod

清除k8s中node节点无用的镜像