kubrnetes集群管理系列之pod详解(3.1)

简介: kubrnetes集群管理系列之pod详解

前言


k8s集群的最重要的管理工作都是围绕着pods这个资源来进行的,可以说是最根本的东西,没有之一,pods的地位可以简单理解为docker里的容器,但和容器又有所不同(当然是有所不同了嘛,要不干嘛还叫pods,直接叫容器得了,不是更方便???),因此,在进行管理工作前,我们需要明确pods到底是什么玩意,能干什么,为什么要用它,然后才是对pods的增删改查等等这些具体的管理工作了。

正文


一,什么是pods?


pod是一组并置的容器,代表了Kubernetes中的基本构建模 块。在实际应用中我们并不会单独部署容器,更多的是针对组pod 的容器进行部署和操作。然而这并不意味着一个pod总是要包含多个容器---实际上只包含一个单独容器的pod也是非常常见的。值得注意的是,当一个pod 包含多个容器时 这些容器总是运行于同一个工作节点上----- pod绝不会跨越多个工作节点。(能跨越多个节点是多个pod,由控制器控制,概念不要搞混)

Kubernetes中调度的最基本单位Pod。

kube-controller-manager用来控制Pod的状态和生命周期。

Pod代表着集群中运行的进程。

Kubernetes中调度的最基本单位Pod。

kube-controller-manager用来控制Pod的状态和生命周期。

Pod代表着集群中运行的进程。

Pod组成

每个pod都有一个根容器,Pause容器。

Pause容器,又叫Infra容器,官方使用的是gcr.io/google_containers/pause-amd64:3.0容器,我这里使用的版本是3.2,也可以自己定义。kubernetes中的pause容器主要为每个业务容器提供以下功能:

  • 在pod中担任Linux命名空间共享的基础;
  • 启用pid命名空间,开启init进程。
[root@master ~]# docker images|grep pause
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2                     80d28bedfe5d        2 years ago         683kB
[root@master ~]# docker ps -a |grep pause
70b80eef504a        registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2   "/pause"                 2 hours ago          Up 2 hours                                          k8s_POD_kube-proxy-zwmwf_kube-system_055b81ab-1864-41b6-8ea6-67e20a5d99c8_7
04345567dcb2        registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2   "/pause"                 2 hours ago          Up 2 hours                                          k8s_POD_kube-flannel-ds-f5gtd_kube-system_2cebc7e4-1b42-48d2-b82e-aec483bb2e06_6
e67d52bc07cf        registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2   "/pause"                 2 hours ago          Up 2 hours                                          k8s_POD_kube-scheduler-c7n.cnn_kube-system_a6027b1f6daab26774a6b1ac0d429c42_2
db7c20a67b42        registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2   "/pause"                 2 hours ago          Up 2 hours                                          k8s_POD_etcd-c7n.cnn_kube-system_2fc062b383bf9b19b5234863fe24378a_7
503a3ec3e34d        registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2   "/pause"                 2 hours ago          Up 2 hours                                          k8s_POD_kube-controller-manager-c7n.cnn_kube-system_91a8e81c4456077e1454c500dc053f85_3
6a352e1fd1f1        registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2   "/pause"                 2 hours ago          Up 2 hours                                          k8s_POD_kube-apiserver-c7n.cnn_kube-system_3b878073ee112db3bcd66a296b786735_6

以上表示使用的是pause这个镜像生成了k8s的很多组件容器,注意了,这里是说pause是根容器!!!!!!!!!!不是根pod,没有这个说法,可以看到的是像什么apiserver这些都是通过pause镜像启动的。

Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pasuse容器,每个Pod还包含一个或多个紧密相关的用户业务容器。用户业务容器可以只有一个也可以有多个:

  • 一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
  • 在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。

Kubernetes为每个Pod都分配了IP,为Pod IP,一个Pod里的多个容器共享Pod IP地址。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,通过虚拟二层网络技术来实现,因此,一个Pod里的容器与另外主机上的Pod容器可以直接通信。

[root@master ~]# k get po -A -o wide
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE     IP               NODE      NOMINATED NODE   READINESS GATES
database      mysql2-5db57c8bc8-7bwbg                   1/1     Running   5          4d18h   10.244.1.16      slave1    <none>           <none>
default       nfs-client-provisioner-6fc484bd4f-pjxm7   1/1     Running   4          3d23h   10.244.2.16      slave2    <none>           <none>
default       nginx-7b54d48599-x2zc5                    1/1     Running   2          23h     10.244.1.15      slave1    <none>           <none>
default       test-pod                                  0/1     Pending   0          3d22h   <none>           <none>    <none>           <none>
kube-system   coredns-6c76c8bb89-tfcrm                  1/1     Running   6          27d     10.244.1.17      slave1    <none>           <none>
kube-system   coredns-6c76c8bb89-vnlwg                  1/1     Running   6          27d     10.244.2.15      slave2    <none>           <none>
kube-system   etcd-c7n.cnn                              1/1     Running   7          28d     192.168.217.16   c7n.cnn   <none>           <none>
kube-system   kube-apiserver-c7n.cnn                    1/1     Running   6          4d15h   192.168.217.16   c7n.cnn   <none>           <none>
kube-system   kube-controller-manager-c7n.cnn           1/1     Running   3          25h     192.168.217.16   c7n.cnn   <none>           <none>
kube-system   kube-flannel-ds-djwmq                     1/1     Running   5          4d18h   192.168.217.17   slave1    <none>           <none>
kube-system   kube-flannel-ds-f5gtd                     1/1     Running   7          4d18h   192.168.217.16   c7n.cnn   <none>           <none>
kube-system   kube-flannel-ds-k5jpf                     1/1     Running   5          4d18h   192.168.217.18   slave2    <none>           <none>
kube-system   kube-proxy-7v5mj                          1/1     Running   6          28d     192.168.217.18   slave2    <none>           <none>
kube-system   kube-proxy-mtttm                          1/1     Running   6          28d     192.168.217.17   slave1    <none>           <none>
kube-system   kube-proxy-zwmwf                          1/1     Running   7          28d     192.168.217.16   c7n.cnn   <none>           <none>
kube-system   kube-scheduler-c7n.cnn                    1/1     Running   2          25h     192.168.217.16   c7n.cnn   <none>           <none>

我的测试集群里有失败的pod,可以看到,它没有IP,启动成功的pod,例如10.244.1.16和10.244.2.16是可以直接通信的。

二,pods有什么用处,它的优缺点是什么?


  • 创建容器使用docker,一个docker对应一个容器,一个容器运行一个应用进程
  • Pod是多进程设计,运用多个应用程序,也就是一个Pod里面有多个容器,而一个容器里面运行一个应用程序
  • Pod的存在是为了亲密性应用
    两个应用之间进行交互
    网络之间的调用【通过127.0.0.1 或 socket】
    两个应用之间需要频繁调用
  • 总的来说,pod的底层是docker容器,可看做一个或者多个容器得集合。

优点:

(1)docker本身的网络机制比较复杂,需要自己调节部署,而k8s的pod不存在这个问题,pods之间的网络拓扑关系是自动化的,从而实现了微服务的敏捷部署,也就是说,网络方面pods更为强大,简单,易用。

(2)pods所对应的部署的应用相对docker来说,更容易升级,回滚,并且定制化服务更为容易。

缺点:

相比于docker,更为复杂,想使用是比较简单的,但如果想达到使用好这个目的,无疑需要做的工作可能会更多一些。

三,对于pods的具体管理工作---增----pods的建立方式详解


pods的生成也就是建立,通常有两种方式,第一个方式是通过kubectl命令行方式直接生成pods,第二种方式是通过资源清单文件生成pods。

(1)kubectl命令行方式生成pods

这个方式适用于比较简单的服务,没有什么特殊的定制化要求,通常用在测试环境,比如,集群部署完毕后,检测集群是否工作正常,那么,我们可以以这样的简单方式快速的生成一个测试用pods,例如,某个集群刚部署完毕,想要看看这个集群能不能正常的生成pods,那么, 无疑,比如快速生成一个可提供web服务的nginx的pods是比较好得选择:

kubectl create deployment nginx --image nginx:1.19
k expose deployment nginx --port 80 --type NodePort

以上的命令执行完毕后,我们就可以得到一个简单的由集群内的一个pods提供的web服务了,此时,在任意一个同网络段的机器内打开浏览器输入集群的ip+端口号30067就可以看到nginx的首页啦。(端口号通过kubectl get svc -A 可以查询出来,第三行就是对应的那个nginx的pods端口)

[root@master ~]# k get svc -A
NAMESPACE     NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
database      mysql2           NodePort    10.106.38.0     <none>        3306:32222/TCP           5d2h
default       kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP                  28d
default       nginx            NodePort    10.96.201.101   <none>        80:30067/TCP             31h

当然,命令行方式创建pods可以做到和资源清单文件一样的效果,但,命令不好回溯问题,不方便管理,因此,通常是用在测试的时候。

(2)资源清单文件

这里的资源清单文件通常是yaml或者yml或者json格式的文件,kubernetes只支持这两种文件,kubernetes主要是围绕各种资源来进行配置进而生成pods,也就是resources,在K8S 中所有的内容都抽象为了资源,资源实例化之后就叫做对象。。而资源清单文件就是向k8s说明要使用何种资源,资源之间的关系如何配置,进而创建出一个可对外提供服务的pods。

例如这个资源清单文件:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
spec:
  containers:
    - name: myapp-1
      image: hub.escapelife.site/library/nginx-test:v1
    - name: busybox-1
      image: busybox:latest
      command:
        - "/bin/sh"
        - "-c"
        - "sleep 3600"

该清单文件定义了将要运行一个pod,这个pod里有两个docker镜像,分别是nginx和busybox,那么,如果网络通畅的话,很快将会看到一个pod运行。

那么,这个pod里运行了两个镜像,如果删除这个pod,将不会再次生成pod,如果采用deploymen方式,删除pod后会自动再次生成pod。

还是以上面的这个pod文件为例,将它修改成deployment方式部署(三个副本,这里随意写的):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-demo
  namespace: default
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

此时将会生成三个pod,但三个pod是删除不了的,即使delete仍然会自动生成,因此,删除 时可以两种方式,第一,kubectl delete -f  文件名,第二,kubectl delete deployment pod-demo  这样的方式删除。

当然,pod的建立方式还有statefulsets这样的方式(通常用在有状态pods部署上),这些以后再做说明。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
SQL 弹性计算 分布式计算
TiDB计算层详解:分布式计算框架与查询优化机制
【2月更文挑战第26天】本文将深入剖析TiDB的计算层,详细解析其分布式计算框架和查询优化机制。通过了解计算层的核心组件和工作原理,我们可以更好地理解TiDB如何高效处理SQL查询和计算任务。本文将从计算层的架构、任务分发、查询优化等方面展开介绍,帮助读者全面掌握TiDB计算层的关键技术和优势。
|
存储 消息中间件 容器
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
当一个 Pod 中包含多个容器时,容器间共享一些重要的资源和环境,这使得它们能够更有效地协同工作和交互。
|
SQL druid 数据库
如何进行数据库连接池的参数优化?
数据库连接池参数优化包括:1) 确定合适的初始连接数,考虑数据库规模和应用需求;2) 调整最大连接数,依据并发量和资源状况;3) 设置最小空闲连接数,平衡资源利用和响应速度;4) 优化连接超时时间,确保系统响应和资源利用合理;5) 配置连接有效性检测,定期检查连接状态;6) 调整空闲连接回收时间,适应访问模式并配合数据库超时设置。
|
前端开发 JavaScript API
组件化设计有哪些缺点吗
【10月更文挑战第22天】组件化设计有哪些缺点吗
|
存储 Kubernetes 开发工具
k8s学习--ConfigMap详细解释与应用
ConfigMap 是 Kubernetes 中用于管理非机密配置数据的 API 对象,可将应用配置与容器分离,便于动态管理和更新。它支持四种创建方式:命令行参数、多个文件、文件内的键值对以及 YAML 资源清单文件。ConfigMap 可通过环境变量或挂载为卷的方式传递给 Pod,并且当通过卷挂载时支持热更新。这使得配置管理更加灵活和安全,无需重新部署应用即可更新配置。
873 0
|
存储 Kubernetes 调度
关于Pod的基础知识概览
【6月更文挑战第19天】Pod是Kubernetes的基本执行单元,是最小部署和管理的粒度,包含一个或多个共享网络和存储的容器,常比喻为豆荚中的豆子。Pod中的容器共享IP和端口,便于协作,支持Docker等容器运行时。
|
SQL 数据管理 关系型数据库
数据管理DMS操作报错合集之同步时一直报错:SQLException: No operations allowed after statement closed。该怎么解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
593 3
|
Kubernetes API 容器
k8s教程(基础篇)-kubectl详解(上)
k8s教程(基础篇)-kubectl详解(上)
520 0
|
Kubernetes 应用服务中间件 调度
kubernetes Ingress、Ingress controller
kubernetes Ingress、Ingress controller
|
机器学习/深度学习 缓存 分布式计算

热门文章

最新文章