pod管理和资源清单
一、前言
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。pod可以理解为是花生壳,一个pod中好几个花生豆(container),也可能一个pod中一个container,里面的container共享pod内的IP、Network和ns(namespace)等资源,这样就存在容器的多个副本不能直接放在一个pod里的问题,必须靠端口不同来区分一个pod中的不同容器。所有功能都是通过api接口实现。

一个pod有唯一的ip,pod中的副本共享这一个ip,共享一个ip不冲突,但不能在一个pod里启动同一容器的多个副本
二、pod管理
(1)、pod信息查看
1、查看namespace,默认为defalut
[root@server2 network-scripts] kubectl get namespaces

2、查看系统服务组建
[root@server2 network-scripts] kubectl get pod -n kube-system
查看到系统个各个组件都是正常状态

3、查看集群节点
[root@server2 network-scripts] kubectl get node -o wide

[root@server2 network-scripts] kubectl get node

4、查看flanner网络插件的分配的地址
server2

server3

server4

5、查看所有服务
[root@server2 network-scripts] kubectl get all

(2)、创建pod查看信息
运行一个名为demo的服务,启用镜像myapp:v1(已经上传在了harbor仓库)
[root@server2 ~] kubectl run demo --image=myapp:v1
[root@server2 ~] kubectl get pod
[root@server2 ~] kubectl get pod -o wide
[root@server2 ~] kubectl describe pod demo
[root@server2 ~] kubectl delete pod demo 删除pod节点demo


(3)、利用控制器创建pod
1、创建deployment控制器,这种方式可以使用–replicas参数指定创建副本的个数,集群会自动创建Pod,此时查看pod信息可以看到pod中有两个随机调度生成的容器副本
[root@server2 ~] kubectl create deployment demo --image=myapp:v1 --replicas=2
[root@server2 ~] kubectl get pod -o wide
[root@server2 ~] curl 10.244.141.195
[root@server2 ~] kubectl get all
[root@server2 ~] kubectl delete deployments.apps demo 删除控制器下的demo进程

2、自动维持副本数量
(这里删除了刚刚的控制控制器,重新创建的控制器在进行以下操作,所以ip和vip都变了)
删除pod中的某个容器副本后,RS副本控制器自动检测到容器副本数量不足,会重新拉起一个容器副本

3、暴露端口
[root@server2 pod] kubectl expose deployment demo --port=80 --target-port=80 将此pod里面的容器的80端口暴露出来,映射到pod的80端
暴露deployment控制器创建service,设定暴露端口,此时k8s集群会为pod自动分配总的虚拟IP即vip。

4、访问这一vip会轮询pod中的两个容器副本,实现自动负载均衡

5、查看SVC服务
(service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。)
查看到暴露的是pod里面各个副本的80端口

7、自动健康检测
删除pod中的某个容器副本,RS副本控制器重新拉起一个容器副本,可以看到新建容器分配到的ip改变,此时再次查看service的详细属性信息可以看到其包含的两个访问后端的ip也自动进行了更新,我们可以将其理解为另一种形式的健康检测。

svc的端口进行了自动更新

(4)、扩容
创建两个副本,可以看到这里正好两个副本都在server3

我们删除一个副本,查看发现,数量还是两个,但是对应的名字改变了。这是因为Deployment控制器的机制,他发现副本数量不足2时,他会自动创建,补足两个副本。

集群内部任意节点可以访问Pod,但集群外部无法直接访问。
kubectl expose deployment demo --port=80 --target-port=80,此时pod客户端可以通过service的名称或ip访问后端的两个Pod,设定可供集群外部访问的虚拟IP

访问该虚拟ip,可以看到负载均衡的落在两个后端上

kubectl describe svc demo 可以详细的看到demo这个服务的虚拟ip和两个后端

Pod扩容,从2个副本变为6个副本

可以看到有六个后端服务

同理,缩容也很简单,多余的副本会被回收(缩容时,最新创建pod的会被最先删除)

(5)、更新、回滚
1、将镜像从myapp:v1更新为myapp:v2

2、可以看到更新的容器获得了ip

3、查看集群中所有已存在的资源可以发现,原来的RS副本控制器不会删掉,会创建新的RS控制器,这样便于镜像版本回滚,当pod中镜像回滚到原来的版本时,原来的控制器又会再次运行

4、使用deployment控制器回滚pod中容器副本的镜像版本,查看Pod资源的额外信息得到容器分配到的ip, curl访问查询到的ip可以看到生成容器所使用的镜像版本已回滚,这里也可以通过访问service的虚拟vip看到生成容器所使用的镜像版本已回滚,原来的RS控制器再次运行,同理新的RS控制器不会删掉


三、资源清单介绍
(1)、资源清单分类
K8s中所有的内容都抽象为资源,资源实例化之后,叫做对象。集群资源分为:名称空间级别、集群级别、元数据型。
名称空间级别:
工作负载型资源:service,pod,Redeployment(控制器,我们很少直接操作pod,而是通过控制器来操作Pod)、ReplicaSet、StatefilSet、Job、Cronjob
服务发现及服务均衡资源型资源:Service、Ingress
配置与存储型资源:Volume、CSI(容器存储接口,可以扩展各种第三方的存储卷)、ConfigMap、Secret、DownwardAPI
特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器)
集群级别:
集群级资源:Namespace、Node、Role、rolebinding、clusterrolebinding
元数据型:
元数据型资源:HPA、podtemplate、limitrange(限制资源的如cpu、内存等)
(2)、资源清单解释
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| version | String | 这里是指的是K8S API的版本,可以用”kubectl api-versions“命令查询 |
| kind | string | 这是指的是yaml文件定义的资源类型和角色,比如:pod |
| metadata | Object | 元数据对象,固定值就写metedata |
| metadata.name | string | 元数据对象的名字,这里由我们编写,比如命名Pod的名字 |
| metadata.namespace | string | 元数据对象的命名空间,由我们自身定义 |
| Spec | Object | 详细定义对象,固定值就写Spec |
| spec.containers[] | list | 这里是Spec对象的容器列表定义,是个列表 |
| spec.containers[].name | string | 这里定义容器的名字 |
| spec.containers[].image | string | 这里定义要用到的镜像名称 |
| spec.containers[].imagePullPolicy | string | 定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选(1)Always:意思是每次都尝试重新拉取镜像(2)Never:表示仅适用本地镜像(3)IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。上面三个值都没设置的话,默认是Always。 |
| spec.containers[].command[] | list | 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。 |
| spec.containers[].args[] | list | 指定容器启动命令参数,因为是数组可以指定多个。 |
| spec.containers[].workingDir | string | 指定容器的工作目录 |
| spec.containers[].volumeMounts[] | list | 指定容器内部的存储卷配置 |
| spec.containers[].volumeMounts[].name | string | 指定可以被容器挂载的存储卷的名称 |
| spec.containers[].volumeMounts[].mountPath | string | 指定可以被容器挂载的存储卷的路径 |
| spec.containers[].volumeMounts[].readOnly | string | 设置存储卷路径的读写模式,ture或者false,默认是读写模式 |
| spec.containers[].ports[] | list | 指定容器需要用到的端口列表 |
| spec.containers[].ports[].name | string | 指定端口的名称 |
| spec.containers[].ports[].containerPort | string | 指定容器需要监听的端口号 |
| spec.containers[].ports[].hostPort | string | 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
| spec.containers[].ports[].protocol | string | 指定端口协议,支持TCP和UDP,默认值为TCP |
| spec.containers[].env[] | list | 指定容器运行前需设置的环境变量列表 |
| spec.containers[].env[].name | string | 指定环境变量名称 |
| spec.containers[].env[].value | string | 指定环境变量值 |
| spec.containers[].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
| spec.containers[].resources.limits | Object | 指定设置容器运行时资源的运行上限 |
| spec.containers[].resources.limits.cpu | string | 指定CPU的限制,单位为Core数,将用于docker run –cpu-shares参数 |
| spec.containers[].resources.limits.memory | string | 指定mem内存的限制,单位为MIB、GiB |
| spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制设置 |
| spec.containers[].resources.requests.cpu | string | CPU请求,单位为core数,容器启动时初始化可用数量 |
| spec.containers[].resources.requests.memory | string | 内存请求,单位为MIB、GiB,容器启动的初始化可用数量 |
| spec.restartPolicy | string | 定义pod的重启策略,可选值为Always、OnFailure、Never,默认值为Always。 1.Always:pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。2.OnFailure:只有pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubectl将不会重启它。3.Never:Pod终止后,kubelet将退出码报告给master,不会重启该pod |
| spec.nodeSelector | Object | 定义Node的label过滤标签,以key:value格式指定 |
| spec.imagePullSecrets | Object | 定义pull镜像时使用secret名称,以name:secretkey格式指定 |
| spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为false。设置True表示使用宿主机网络,不使用docker网桥,同时设置了True将无法在同一台宿主机上启动第二个副本 |
(3)、yam清单
1)、应用yaml清单安装pod
1、在使用API接口时可以查询有哪些API接口的群组和版本

2、创建pod目录并在该目录下编写文件构建资源清单pod.yaml(.yaml文件与.yml文件无区别),应用资源清单,此时可以查看到生成的pod,其中包含了由myapp镜像生成的一个副本
[root@server2 ~] mkdir pod
[root@server2 ~] cd pod/
[root@server2 pod] vim pod.yaml 图1
//////////////////
apiVersion: v1 %指明api资源属于哪个群组和版本,同一个组可以有多个版本
kind: Pod %标记创建的资源类型,k8s主要支持以下资源类别(Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob)
metadata: %元数据
name: pod-example %此pod服务的名称
spec: %定义目标资源的期望状态
containers:
- name: myapp %container容器名字
image: myapp:v1 %指定镜像
////////////////////////////
[root@server2 pod] kubectl apply -f pod.yaml %执行二进制文件
[root@server2 pod] kubectl describe pod pod-example 图2
查看api安装状态
[root@server2 pod] kubectl get pod 图3、查看目前pod节点的运行情况
图1

图2此服务启用在server3上,server3上的操作如下

图3发现pod-example这个pode节点已经启用

3、在刚才基础上添加一个镜像文件
在一个pod里面拥有了两个镜像文件,此时连接进入pod中busybox容器的bash环境,访问地址看到的是pod中myapp容器的发布页面,这是因为pod中所有的副本共享一个ip
vim pod.yaml
///////////////////////////////////
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
- name: busybox 新添加的镜像文件
image: busybox:latest
tty: true
stdin: true
////////////////////////////


2)、镜像拉取策略
1、应用资源清单,发现会从仓库拉取镜像


2、编辑资源清单,设置拉取策略imagePullPolicy为IfNOtPresent,当本地不存在时再拉取镜像。
删除生成的pod,读取应用资源清单重新创建pod,此时查看pod的详细信息可以看到未重复拉取镜像(资源清单创建的pod不会自动更新,需要读取清单删除后再重建)
[root@server2 pod] cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox:latest
tty: true
stdin: true
imagePullPolicy: IfNotPresent


3)、containerPort+hostPort容器端口映射
编辑资源清单,指定生成的pod中容器暴露的端囗号containerPort,指定容器所在主机映射的端口hostPort,默认跟上面containerPort相同
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
容器运行在server4上面,查看server4的端口发现了容器的映射


4) 、hostNetwork主机网络模式
1、删除由资源清单生成的pod,编辑资源清单,设置主机网络模式hostNetwork值为true即使用宿主机网络,读取应用资源清单重新创建pod
[root@server2 pod] cat pod.yaml
/////////////////////////////////////////
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
hostNetwork: true 使用宿主机网络
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 80
2、发现其ip为正式主机的ip

3、查看Pod资源的额外信息可以看到pod的ip为其运行节点主机的ip,curl访问该ip,可以成功访问pod中容器副本的默认发布页面
注意:设置了hostNetwork值为true将无法在同一台宿主机上启动该容器的第二个副本

5)、yaml对容器的运行内存进行限制
[root@server2 pod] vim pod.yaml
////////////////////////////
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
//////////////////////////////
查看到cpu和内存的限制

6)、指定nodeName
[root@server2 pod]# cat pod.yaml
////////////////////////////
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
nodeName: server4 %使用server4作为后端
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
//////////////

本文详细介绍了Kubernetes中Pod的管理,包括信息查看、创建与删除、利用控制器创建与更新、扩容和回滚。此外,还探讨了资源清单的分类、解释和示例,涉及镜像拉取策略、端口映射、主机网络模式以及内存限制等关键配置。通过对Pod的深入理解和实践,可以更好地掌握Kubernetes集群的日常运维。
594

被折叠的 条评论
为什么被折叠?



