热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【项目实战16】k8s(2)—pod管理和资源清单

pod管理和资源清单一、前言二、pod管理(1)、pod信息查看(2)、创建pod查看信息(3)、利用控制器创建pod(4)、扩容(5)、更新、回滚三、资源清单介绍(1)、资源清单

pod管理和资源清单

  • 一、前言
  • 二、pod管理
    • (1)、pod信息查看
    • (2)、创建pod查看信息
    • (3)、利用控制器创建pod
    • (4)、扩容
    • (5)、更新、回滚
  • 三、资源清单介绍
    • (1)、资源清单分类
    • (2)、资源清单解释
    • (3)、yam清单
      • 1)、应用yaml清单安装pod
      • 2)、镜像拉取策略
      • 3)、containerPort+hostPort容器端口映射
      • 4) 、hostNetwork主机网络模式
      • 5)、yaml对容器的运行内存进行限制
      • 6)、指定nodeName


一、前言

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)、资源清单解释


参数名字段类型说明
versionString这里是指的是K8S API的版本,可以用”kubectl api-versions“命令查询
kindstring这是指的是yaml文件定义的资源类型和角色,比如:pod
metadataObject元数据对象,固定值就写metedata
metadata.namestring元数据对象的名字,这里由我们编写,比如命名Pod的名字
metadata.namespacestring元数据对象的命名空间,由我们自身定义
SpecObject详细定义对象,固定值就写Spec
spec.containers[]list这里是Spec对象的容器列表定义,是个列表
spec.containers[].namestring这里定义容器的名字
spec.containers[].imagestring这里定义要用到的镜像名称
spec.containers[].imagePullPolicystring定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选(1)Always:意思是每次都尝试重新拉取镜像(2)Never:表示仅适用本地镜像(3)IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。上面三个值都没设置的话,默认是Always。
spec.containers[].command[]list指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[]list指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDirstring指定容器的工作目录
spec.containers[].volumeMounts[]list指定容器内部的存储卷配置
spec.containers[].volumeMounts[].namestring指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathstring指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlystring设置存储卷路径的读写模式,ture或者false,默认是读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].namestring指定端口的名称
spec.containers[].ports[].containerPortstring指定容器需要监听的端口号
spec.containers[].ports[].hostPortstring指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolstring指定端口协议,支持TCP和UDP,默认值为TCP
spec.containers[].env[]list指定容器运行前需设置的环境变量列表
spec.containers[].env[].namestring指定环境变量名称
spec.containers[].env[].valuestring指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpustring指定CPU的限制,单位为Core数,将用于docker run –cpu-shares参数
spec.containers[].resources.limits.memorystring指定mem内存的限制,单位为MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpustringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memorystring内存请求,单位为MIB、GiB,容器启动的初始化可用数量
spec.restartPolicystring定义pod的重启策略,可选值为Always、OnFailure、Never,默认值为Always。 1.Always:pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。2.OnFailure:只有pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubectl将不会重启它。3.Never:Pod终止后,kubelet将退出码报告给master,不会重启该pod
spec.nodeSelectorObject定义Node的label过滤标签,以key:value格式指定
spec.imagePullSecretsObject定义pull镜像时使用secret名称,以name:secretkey格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为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: myappimage: myapp:v1- name: busybox 新添加的镜像文件image: busybox:latesttty: truestdin: 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: myappimage: myapp:v1imagePullPolicy: IfNotPresent- name: busyboximage: busybox:latesttty: truestdin: trueimagePullPolicy: IfNotPresent

在这里插入图片描述

在这里插入图片描述

3)、containerPort+hostPort容器端口映射

编辑资源清单,指定生成的pod中容器暴露的端囗号containerPort,指定容器所在主机映射的端口hostPort,默认跟上面containerPort相同

apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:containers:- name: myappimage: myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80hostPort: 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: myappimage: myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80hostPort: 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: myappimage: myapp:v1imagePullPolicy: IfNotPresentresources: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: myappimage: myapp:v1imagePullPolicy: IfNotPresentresources:requests: cpu: "100m"memory: "50Mi"limits: cpu: "200m"memory: "100Mi"
//

在这里插入图片描述


推荐阅读
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • Docker 中创建 CentOS 容器并安装 MySQL 进行本地连接
    本文详细介绍了如何在 Docker 中创建 CentOS 容器,并在容器中安装 MySQL 以实现本地连接。文章内容包括镜像拉取、容器创建、MySQL 安装与配置等步骤。 ... [详细]
  • 在JUnit测试框架中,确保@Test注解的方法按特定顺序执行是常见的需求。本文总结了三种实现这一目标的策略。首先,介绍了通过方法名称排序来控制执行顺序的基本方法。其次,推荐了一种利用依赖管理插件的方式,这种方法更为灵活且易于维护。最后,探讨了使用第三方库如TestNG或Jupiter扩展来实现更复杂的顺序控制。每种方法都有其适用场景和优缺点,开发者可以根据具体需求选择最合适的方案。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
author-avatar
mimiku2z_818
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有