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部署上),这些以后再做说明。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4月前
|
Kubernetes 监控 前端开发
Kubernetes 集群管理
8月更文挑战第26天
50 2
|
2月前
|
应用服务中间件 调度 nginx
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
|
4月前
|
存储 Kubernetes 应用服务中间件
如何在 Kubernetes 中创建 Pod
【8月更文挑战第11天】
101 1
如何在 Kubernetes 中创建 Pod
|
Kubernetes 算法 调度
13-Kubernetes-Pod详解-调度
13-Kubernetes-Pod详解-调度
|
Kubernetes 安全 API
【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象(下)
【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象(下)
122 0
|
编解码 运维 Kubernetes
【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象(上)
【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象(上)
147 0
|
Kubernetes 网络安全 容器
使用Kubespray部署Kubernetes集群
Kubespray是Google开源的一个部署生产级别的Kubernetes服务器集群的开源项目,它整合了Ansible作为部署的工具。项目地址:github.com/kubernetes-… 部署历程 目前为止,对于Kubernetes集群的部署,我只谈的上是一个入门者,涉及到了众多的运维知识,对于一个开发来说,确实挺难的。
3512 0
|
关系型数据库 MySQL 调度
kubrnetes集群管理系列之pod详解(3.2)
kubrnetes集群管理系列之pod详解
277 0
|
Kubernetes 应用服务中间件 API
Kubernetes集群管理工具kubectl
Kubernetes集群管理工具kubectl
189 0
|
消息中间件 Kubernetes 监控
Kubernetes-Pod介绍(三)-Pod调度
不同的Pod之间的亲和性问题,例如主从MySQL数据库不能够分配到同一个节点上或者两种Pod必须调度到同一个节点上,实现本地网路、文件共享等等; 有状态的集群,例如Zookeeper、Kafka等有状态的集群,每个节点看起来都是差不多,但是每个节点都必须明确主节点,而且节点启动有严格的顺序要求,此外集群中的数据也需要持久化存储,每个工作节点挂点的时候,如何按照持计划的信息进行恢复等等问题; 每个Node上调度仅仅创建一个Pod,例如对Node节点的监控,主机节点日志、性能采集节点只能部署一个节点; 批量调度的任务以及定时调度的任务,调用完成的时候要求Pod就销毁;