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