k8s资源管理方法详解(陈述式、声明式)

目录

一:陈述式资源管理方法

二: 基本信息查看

1、查看信息

2、创建

 3、删除

4、service 的 type 类型

三:项目实例

1、创建    kubectl create命令

2、发布    kubectl expose命令

 3、在 node 节点上操作,查看负载均衡端口

 4、更新    kubectl set

5、 回滚    kubectl rollout 

6、 删除    kubectl delete

四:声明式管理方法

总结


一:陈述式资源管理方法

1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口
2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径
3.kubectl 的命令大全
kubectl --help
k8s中文文档:http://docs.kubernetes.org.cn/683.html
4.对资源的增、删、查操作比较方便,但对改的操作就不容易了

//查看版本信息    kubectl version

//查看资源对象简写    kubectl api-resources

//查看集群信息    kubectl cluster-info

//配置kubectl自动补全    source <(kubectl completion bash)

 

//node节点查看日志     journalctl -u kubelet -f

 

二: 基本信息查看

kubectl get <resource> [-o wide|json|yaml] [-n namespace]
获取资源的相关信息,-n 指定命令空间,-o 指定输出格式
resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all(仅展示几种核心资源,并不完整)
--all-namespaces 或 -A :表示显示所有命名空间,
--show-labels :显示所有标签
-l app :仅显示标签为app的资源
-l app=nginx :仅显示包含app标签,且值为nginx的资源

1、查看信息

//查看 master 节点状态
kubectl get componentstatuses
kubectl get cs

//查看命名空间
kubectl get namespace
kubectl get ns
//命令空间的作用:用于允许不同 命名空间 的 相同类型 的资源 重名的

//查看default命名空间的所有资源
kubectl get all [-n default]

//查看命名空间kube-public 中的pod 信息
kubectl get pods -n kube-public
NAME                       READY   STATUS    RESTARTS   AGE
nginx-a1-d47f99cb6-hv6gz   1/1     Running   0          24m

//kubectl exec可以跨主机登录容器,docker exec 只能在容器所在主机上登录
kubectl exec -it nginx-a1-d47f99cb6-hv6gz bash -n kube-public

2、创建

//创建命名空间app
kubectl create ns app
kubectl get ns

//在命名空间kube-public 创建副本控制器(deployment)来启动Pod(nginx-wl)
kubectl create deployment nginx-wl --image=nginx  -n kube-public


//扩缩容
kubectl scale deployment nginx-wl --replicas=2 -n kube-public	# 扩容
kubectl scale deployment nginx-wl --replicas=1 -n kube-public	# 缩容

 3、删除

//删除命名空间app
kubectl delete namespace app
kubectl get ns	

//删除(重启)pod资源,由于存在deployment/rc之类的副本控制器,删除pod也会重新拉起来
kubectl delete pod nginx-wl-d47f99cb6-hv6gz -n kube-public

//若pod无法删除,总是处于terminate状态,则要强行删除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示过渡存活期,默认30s,在删除pod之前允许pod慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod
		
//删除副本控制器
kubectl delete deployment nginx-a1 -n kube-public
kubectl delete deployment/nginx-a1 -n kube-public

4、service 的 type 类型

●ClusterIP:提供一个集群内部的虚拟IP以供Pod访问(service默认类型)

●NodePort:在每个Node上打开一个端口以供外部访问,Kubernetes将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过 NodeIp:NodePort 的方式Kubernetes集群外部的程序可以访问Service。
每个端口只能是一种服务,端口范围只能是 30000-32767。

●LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。
在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

●externalName:将service名称映射到一个DNS域名上,相当于DNS服务的CNAME记录,用于让Pod去访问集群外部的资源,它本身没有绑定任何的资源。

targetPort是容器映射端口 在集群内部,客户端通过clusterIP:port 转发 targetPort 再转发给容器内部;在外部客户端访问,通过 nodeIP:nodePort 转发到 targetPort 再转发给容器内部

containerPort是容器内部的端口 也是 kubectl create deployment --port (clusterip的端口) --target-port (容器端口) --name <自定义资源名称> --type (svc资源类型)

三:项目实例

项目的生命周期:创建-->发布-->更新-->回滚-->删除

1、创建    kubectl create命令

●创建并运行一个或多个容器镜像。
●创建一个deployment 或job 来管理容器。
kubectl create --help

//启动 nginx 实例,暴露容器端口 80,设置副本数 3
kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3
 
kubectl get pods
kubectl get all

2、发布    kubectl expose命令

●将资源暴露为新的 Service。
kubectl expose --help

//为deployment的nginx创建service,并通过Service的80端口转发至容器的80端口上,Service的名称为nginx-service,类型为NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort

------------------------------------------------------------------------------------------
Kubernetes 之所以需要 Service,一方面是因为 Pod 的 IP 不是固定的(Pod可能会重建),另一方面则是因为一组 Pod 实例之间总会有负载均衡的需求。
Service 通过 Label Selector 实现的对一组的 Pod 的访问。
对于容器应用而言,Kubernetes 提供了基于 VIP(虚拟IP) 的网桥的方式访问 Service,再由 Service 重定向到相应的 Pod。

//查看pod网络状态详细信息和 Service暴露的端口
kubectl get pods,svc -o wide

/查看关联后端的节点
kubectl get endpoints

//查看 service 的描述信息
kubectl describe svc nginx

 3、在 node 节点上操作,查看负载均衡端口


//在 node01 节点上操作,查看负载均衡端口
yum install ipvsadm -y
ipvsadm -Ln
//外部访问的IP和端口
TCP  192.168.80.11:44847 rr
  -> 172.17.26.3:80               Masq    1      0          0         
  -> 172.17.36.2:80               Masq    1      0          0         
  -> 172.17.36.3:80               Masq    1      0          0     
//pod集群组内部访问的IP和端口
TCP  10.0.0.189:80 rr
  -> 172.17.26.3:80               Masq    1      0          0         
  -> 172.17.36.2:80               Masq    1      0          0         
  -> 172.17.36.3:80               Masq    1      0          0         
  
//在 node02 节点上操作,同样方式查看负载均衡端口
yum install ipvsadm -y
ipvsadm -Ln
TCP  192.168.80.12:44847 rr
  -> 172.17.26.3:80               Masq    1      0          0         
  -> 172.17.36.2:80               Masq    1      0          0         
  -> 172.17.36.3:80               Masq    1      0          0         
 
TCP  10.0.0.189:80 rr
  -> 172.17.26.3:80               Masq    1      0          0         
  -> 172.17.36.2:80               Masq    1      0          0         
  -> 172.17.36.3:80               Masq    1      0          0         

curl 10.0.0.189
curl 192.168.80.11:44847
//在master01操作 查看访问日志
kubectl logs nginx-cdb6b5b95-fjm2x
kubectl logs nginx-cdb6b5b95-g28wz
kubectl logs nginx-cdb6b5b95-x4m24

 

 4、更新    kubectl set

●更改现有应用资源一些信息。
kubectl set --help

//获取修改模板
kubectl set image --help
Examples:
  # Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.
  kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1

//查看当前 nginx 的版本号
curl -I http://192.168.80.11:44847
curl -I http://192.168.80.12:44847

//将nginx 版本更新为 1.15 版本
kubectl set image deployment/nginx nginx=nginx:1.15

//处于动态监听 pod 状态,由于使用的是滚动更新方式,所以会先生成一个新的pod,然后删除一个旧的pod,往后依次类推
kubectl get pods -w

---------------------------------------------------------------------------------------------
#滚动更新详解:
kubectl get all
DESIRED:表示期望的状态是 10 个 READY 的副本
CURRENT:表示当前副本的总数: 即8 个日副本 + 5 个新副本
UP_TO-DATE:表示当前已经完成更新的副本数: 即 5个新副本
AVAILABLE:表示当前处于 READY 状态的副本数: 即8个日副本。

kubectl describe deployment/nginx
滚动更新通过参数 maxSurge 和 maxUnavailable 来控制副本替换的数量
maxSurge:此参数控制滚动更新过程中副本总数的超过 DESIRED 的上限。maxSurge 可以是具体的整数(比如 3),也可以是百分百,向上取整。maxSurge 默认值为 25%。
例如,DESIRED 为 10,那么副本总数的最大值为 10 + 10 * 25% = 13,即 CURRENT 为 13。

maxUnavailable:此参数控制滚动更新过程中,不可用的副本相占 DESIRED 的最大比例。maxUnavailable 可以是具体的整数(比如 3),也可以是百分百,向下取整。 maxUnavailable 默认值为 25%。
例如,DESIRED 为 10,那么可用的副本数至少要为 10 - 10 * 25% = 8,即 AVAILABLE 为 8。

因此 maxSurge 值越大,初始创建的新副本数量就越多;maxUnavailable 值越大,初始销毁的旧副本数量就越多。

理想情况下,DESIRED 为 10 的滚动更新的过程应该是这样的:
首先创建 3 个新副本使副本总数达到 13 个。
然后销毁 2 个旧副本使可用的副本数降到 8 个。
当这 2 个旧副本成功销毁后,可再创建 2 个新副本,使副本总数保持为 13 个。
当新副本通过 Readiness 探测后,会使可用副本数增加,超过 8。
进而可以继续销毁更多的旧副本,使可用副本数回到 8。
旧副本的销毁使副本总数低于 13,这样就允许创建更多的新副本。
这个过程会持续进行,最终所有的旧副本都会被新副本替换,滚动更新完成。
---------------------------------------------------------------------------------------------

//再看更新好后的 Pod 的 ip 会改变
kubectl get pods -o wide

//再看 nginx 的版本号
curl -I http://192.168.80.11:44847
curl -I http://192.168.80.12:44847

5、 回滚    kubectl rollout 

●对资源进行回滚管理
kubectl rollout --help

//查看历史版本
kubectl rollout history deployment/nginx 

//执行回滚到上一个版本
kubectl rollout undo deployment/nginx

//执行回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1

//检查回滚状态
kubectl rollout status deployment/nginx

6、 删除    kubectl delete

//删除副本控制器
kubectl delete deployment/nginx

//删除service
kubectl delete svc/nginx-service

kubectl get all

四:声明式管理方法

1.适合于对资源的修改操作
2.声明式资源管理方法依赖于资源配置清单文件对资源进行管理
资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)
3.对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
4.语法格式:kubectl create/apply/delete -f xxxx.yaml
 

//查看资源配置清单
kubectl get deployment nginx -o yaml

//解释资源配置清单
kubectl explain deployment.metadata

kubectl get service nginx -o yaml
kubectl explain service.metadata

//修改资源配置清单并应用
方法一:离线修改:
修改yaml文件,并用 kubectl apply -f xxxx.yaml 文件使之生效
注意:当apply不生效时,先使用delete清除资源,再apply创建资源

kubectl get service nginx -o yaml > nginx-svc.yaml
vim nginx-svc.yaml				#修改port: 8080
kubectl delete -f nginx-svc.yaml
kubectl apply -f nginx-svc.yaml
kubectl get svc

方法二:在线修改:
直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改


//删除资源配置清单
陈述式删除:
kubectl delete service nginx

声明式删除:
kubectl delete -f nginx-svc.yaml


 

 

 

总结

陈述式资源管理
kubectl create <资源类型> <资源名称> -n 命名空间  [选项]
                                                  --image=镜像  --replicas=副本数  --port=容器端口

kubectl get <资源类型|all> [资源名称] -n 命名空间 -o wide|yaml|json  -w

kubectl describe <资源类型> <资源名称> -n 命名空间

kubectl delete  <资源类型> <资源名称>|--all  -n 命名空间  [--force --grace-period=0]
                                                           立即终止Pod运行,强制删除资源

kubectl exec -it -n 命名空间  <Pod资源名称>  [-c 容器名称]  sh|bash

kubectl logs -n 命名空间  <Pod资源名称>  [-c 容器名称] [-p]

kubectl scale -n 命名空间 deployment <资源名称> --replicas=副本数   

kubectl expose -n 命名空间 deployment <资源名称> --name <自定义svc资源名称> --port <clusterIP的端口> --target-port <容器的端口> --type <svc的类型>
kubectl create svc <svc资源类型> <资源名称> --tcp=<clusterIP的端口>:<容器的端口>

kubectl set image deployment <资源名称> <容器名>=<镜像名>

kubectl rollout history deployment <资源名称>
kubectl rollout undo deployment <资源名称>  [--to-revision= ]
kubectl rollout status deployment <资源名称>


service 的 4 种类型:
ClusterIP:默认的service资源的类型,提供clusterIP供K8S集群内部访问
NodePort:会在每个Node节点上开启一个端口,K8S集群内部和外部的用户都可以通过NodeIP:NodePort访问service以及其关联的Pod
LoadBalancer:使用公有云的LB服务和service做映射,用户可以使用公有云LB服务的IP地址即可将请求转发到Node节点,再通过NodeIP:NodePort访问service以及其关联的Pod
ExternalName:相当于给一个域名或IP做别名,Pod可以通过这个service访问相关的外部服务


service 的端口:
port :service 资源的 clusterIP 所使用的端口
nodePort :在NodePort类型的service所定义的,在每个Node节点上开启的端口(默认范围为30000~32767)
targetPort :service 将发送给 port 或 nodePort 的请求转发到后端的 Pod 的容器端口

containerPort :创建 Pod 时所指定的容器端口

K8S集群内部 http://clusterIP:port  -->  podIP:containerPort
K8S集群外部 http://nodeIP:nodePort  -->  podIP:containerPort


应用的发布策略:
蓝绿发布
滚动发布
灰度发布/金丝雀发布
kubectl set image deployment <资源名称> <容器名>=<镜像名>  &&  kubectl rollout pause deployment <资源名称>
kubectl rollout resume deployment <资源名称>

25% max unavailable   滚动更新过程中,销毁的Pod数量不超过期望副本数的25%,向下取整
25% max surge         滚动更新过程中,新增的Pod数量不超过期望副本数的25%,向上取整

期望的Pod副本数是10个,销毁的数量2,新增3        整个更新过程中Pod的数量会一致保持在 8 ~ 13

声明式资源管理
kubectl apply|create -f XXX.yaml
kubectl delete -f XXX.yaml

kubectl edit <资源类型> <资源名称>

kubectl explain <资源类型>.<一级字段>.<二级字段>...
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/66339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Celery嵌入工程的使用

文章目录 1.config 1.1 通过app.conf进行配置1.2 通过app.conf.update进行配置1.3 通过配置文件进行配置1.4 通过配置类的方式进行配置2.任务相关 2.1 任务基类(base)2.2 任务名称(name)2.3 任务请求(request)2.4 任务重试(retry) 2.4.1 指定最大重试次数2.4.2 设置重试间隔时间…

Mac终端利器:Homebrew + iTerm2 + Oh My Zsh 教程

引言 前段时间调整了一下 iTerm2 的环境&#xff0c;感觉比以前好看多了&#xff0c;并且更加高效&#xff0c;这里做一个记录&#xff0c;希望能给大家一些启发。 工具介绍 brew&#xff1a;Mac OS 下强大的包管理工具。iTerm2&#xff1a;iTerm2是 Mac OS 终端的替代品&am…

Detecting Everything in the Open World: Towards Universal Object Detection

1. 论文简介 论文题目《Detecting Everything in the Open World: Towards Universal Object Detection》发表情况&#xff0c;CVPR2023[论文地址][https://arxiv.org/pdf/2303.11749.pdf][代码地址][https://github.com/zhenyuw16/UniDetector] 2.背景与摘要 本文旨在解决通…

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

Spring集成Seata

Seata的集成方式有&#xff1a; 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-All演示&#xff1a; 第一步&#xff1a;下载Seata 第二步&#xff1a;为了更好看到效果&#xff0c;我们将Seata的数据存储改为db 将seata\sc…

【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

一、数据传输 1.1 APP和驱动 APP和驱动之间的数据访问是不能通过直接访问对方的内存地址来操作的&#xff0c;这里涉及Linux系统中的MMU&#xff08;内存管理单元&#xff09;。在驱动程序中通过这两个函数来获得APP和传给APP数据&#xff1a; copy_to_usercopy_from_user …

电脑自动关机是什么原因?1分钟弄懂!

“好奇怪啊&#xff0c;我在使用电脑时&#xff0c;电脑总是莫名其妙就会自动关机&#xff0c;有时候我文件都来不及保存。这是为什么呢&#xff1f;有什么解决方法吗&#xff1f;” 电脑自动关机是一个令人头疼的问题&#xff0c;可能会对我们的工作和生活带来影响。电脑自动关…

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

电商数据获取:网络爬虫还是付费数据接口?

随着电商行业的迅速发展&#xff0c;对电商数据的需求也越来越大。在获取电商数据时&#xff0c;常常面临一个选择&#xff1a;是自己编写网络爬虫进行数据爬取&#xff0c;还是使用现有的付费数据接口呢&#xff1f;本文将从成本、可靠性、数据质量等多个角度进行分析&#xf…

【果树农药喷洒机器人】Part1:研究现状分析以及技术路线介绍

本专栏介绍&#xff1a;付费专栏&#xff0c;持续更新机器人实战项目&#xff0c;欢迎各位订阅关注。 关注我&#xff0c;带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章&#xff01; 文章目录 一、项目背景二、国内外研究现状2.1 国内研究现状2.2 国外研究现状 三…

C语言内嵌汇编

反编译&#xff08;二进制文件或者so库&#xff09; objdump --help objdump -M intel -j .text -ld -C -S out > out.txt #显示源代码同时显示行号, 代码段反汇编-M intel 英特尔语法-M x86-64-C:将C符号名逆向解析-S 反汇编的同时&#xff0c;将反汇编代码和源代码交替显…

Python自动化测试用例:如何优雅的完成Json格式数据断言

目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客&#xff0c;记录当时获取一个多级json中指定key的数据&#xff1a; #! /usr/bin/python # coding:utf-8 """ aut…

3分钟创建新生分班查询二维码,无需技术、0成本

作为教师&#xff0c;我们深知分班是一项极其重要的任务&#xff0c;需要综合考虑学生的性格、能力和兴趣等多个方面&#xff0c;以确保每个学生都能够获得最佳的学习环境和成绩。在本文中&#xff0c;我将分享一种便捷的方式来告知家长有关分班录取情况的方法。 通常&#xf…

2. 软件需求 面向对象分析

目录 1. 软件需求 1.1 需求分类 1.2 需求获取 1.3 需求分析 2. 面向对象分析&#xff08;OOA&#xff09; 2.1 统一建模语言 UML 2.2 用例模型 2.2.1 用例图的元素 2.2.2 识别参与者 2.2.3 合并需求获得用例 2.2.4 细化用例描述 2.3 分析模型 2.3.1 定义概念类 …

深入JVM - JIT分层编译技术与日志详解

深入JVM - JIT分层编译技术与日志详解 文章目录 深入JVM - JIT分层编译技术与日志详解1. 背景简介2. JIT 编译器2.1. 客户端版本的编译器: C12.2. 服务端版本的编译器: C22.3. Graal JIT 编译器 3. 分层编译技术(Tiered Compilation)3.1. 汇聚两种编译器的优点3.2. 精准优化(Ac…

Redis内网主从节点搭建

Redis内网主从节点搭建 1、文件上传2、服务安装3、服务启动4、配置主从复制 1、文件上传 内网环境手动上传gcc-c、redis.tar文件 2、服务安装 # 解压 unzip gcc-c.zip unzip gcc_rpm.zip tar -zxvf redis-6.2.13.tar.gz# 安装 cd gcc_rpm/ rpm -ivh *.rpm --nodeps --force…

gitlab 503 错误的解决方案

首先使用 sudo gitlab-ctl status 命令查看哪些服务没用启动 sudo gitlab-ctl status 再用 gitlab-rake gitlab:check 命令检查 gitlab。根据发生的错误一步一步纠正。 gitlab-rake gitlab:check 查看日志 tail /var/log/gitlab/gitaly/current删除gitaly.pid rm /var/opt…

Webpack怎么使用?

Webpack 使用 前几篇文章中已经介绍了如何初始化包管理器 package.json 这里不再重复介绍&#xff0c;如有需要请查看 搭建工程化项目。 安装 :::warning 注意 请确保你已经安装了 yarn&#xff0c;如有需要请查看 搭建工程化开发环境。 ::: 通过命令 yarn add webpack web…

三天吃透Java面试八股文(2023最新整理),面试通过率高达90%

什么样的求职者能够获得面试官的青睐&#xff1f;求职者需要准备哪些内容来面对形形色色的面试官&#xff1f;这两份资料是我在几十场面试中被面试官问到的问题&#xff0c;比其他复制粘贴的面试题强一百倍&#xff0c;堪称全网最强&#xff08;我不太喜欢“全网最强”这样的字…

mybatis打印sql语句出现多余的limit关键字

1、事情起因 在项目中使用了PageHelper分页插件&#xff0c;由于需求特殊&#xff0c;需要自定义分页&#xff0c;代码编写完成后&#xff0c;事故出现了。 前端传参: {pageNum: 1,pageSize: 10, }已知表中数据10条&#xff0c;但是每次分页查询只有10条数据&#xff0c;排查…