k8s基础 随笔

  写个笔记,后面再完善

部署第一个应用

为什么先实战水平扩缩?因为这个最简单,首先来部署一个喜闻乐见的nginx

kubectl create deployment web --image=nginx:1.14 --dry-run -o yaml > web.yaml
  • --dry-run表示试运行,试一下看行不行,但是不运行
  • -o yaml表示以yaml格式输出
  • > web.yaml表示将输出的内容重定向到web.yaml文件中

这句话可以放心执行了,执行之后看看web.yaml文件里面有些啥

apiVersion: apps/v1        # 表示资源版本号为apps/v1 
kind: Deployment           # 表示这是一个Deployment
metadata:                  # 一些元数据信息creationTimestamp: nulllabels:                  # 标签,可以随便定义app: webname: web                # 这个资源的名字
spec:                      # 资源的描述或者规格replicas: 1              # 副本数量selector:                # 选择器matchLabels:           # 需要匹配的标签app: web             # 标签的具体键值对strategy: {}template:                # 模板。表示Pod的生成规则metadata:creationTimestamp: nulllabels:app: webspec:                  containers:- image: nginx:1.14  #指定镜像文件name: nginxresources: {}
status: {}

用下面的命令应用web.yaml,web.yaml声明了一个Deployment和一个Pod

kubectl apply -f web.yaml

执行完后以后可以通过以下命令查看Deployment和Pod

kubectl get deploy,po -o wide

结果如下

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES       SELECTOR
deployment.apps/web   1/1     1            1           2m40s   nginx        nginx:1.14   app=webNAME                       READY   STATUS    RESTARTS   AGE     IP               NODE    ...
pod/web-5bb6fd4c98-lg555   1/1     Running   0          2m40s   10.100.255.120   my-node ...

可以看到资源已经建立起来了,运行在Worker节点中,尝试访问一下Pod的IP

curl 10.100.255.120

有如下nginx的标准返回说明应用已经部署完毕

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
</html>

有没有感觉这一路下来挺麻烦的,yaml文件还那么长,还不如无脑docker run呢,别急,在后面扩缩容的时候就可以看到它的威力了,当然也可以用最开始的命令来执行kubectl create deployment web --image=nginx:1.14,测试可以,在生产环境中强烈不建议这么做。

但是现在还不能在外面访问

先要创建一个Service

要访问部署在 Kubernetes 中的应用程序,你通常需要使用 Service 对象来公开应用程序,以便从外部网络访问。以下是创建一个 Service 来访问你的 web deployment 的一般步骤:

  1. 创建一个 Service 对象:
kubectl create service nodeport web --tcp=80:80

这将创建一个 NodePort 类型的 Service,它将监听节点上的某个端口(通常在30000-32767之间),并将流量转发到你的 web deployment 的端口80。

  1. 获取 Service 的访问端口:
kubectl get service web

查找 "PORT(S)" 部分,你会看到 Service 的访问端口,其中 NodePort 是你可以使用的外部端口。

  1. 访问应用程序:

现在,你可以使用集群的任何节点的 IP 地址和上面步骤中找到的 NodePort 访问你的应用程序。例如,如果你的集群节点的 IP 地址是 192.168.1.100,NodePort 是 31000,你可以在浏览器中输入 http://192.168.1.100:31000 来访问应用程序。

请注意,NodePort Service 在生产环境中可能不是最佳选择,通常会使用 Ingress 控制器来管理外部访问。但对于测试和学习的目的,NodePort 可以用作一种简单的方法来访问应用程序

节点污点

Taint 污点:节点不做普通分配调度,是节点属性,属性值有三个

  • NoSchedule:一定不被调度
  • PreferNoSchedule:尽量不被调度(也有被调度的几率)
  • NoExecute:不会调度,并且还会驱逐Node已有Pod

也就是说,给节点打上污点,那么调度的时候就会根据上面的属性来进行调度,一般来说Master节点的污点值是NoSchedule,查看Master污点值

kubectl describe node my-master | grep Taints

可以看到如下输出

Taints:             node-role.kubernetes.io/master:NoSchedule

这表明无论如何,Pod都不会被调度到Master节点上,也可以用上面弹性伸缩的列子来证明,无论副本多少个,都是在Worker节点上,现在将Master节点上的污点给去掉,用下面的命令

kubectl taint node my-master node-role.kubernetes.io/master:NoSchedule-

回显如下,说明污点已经去掉

node/my-master untainted

再来扩容一下,为了大概率调度到Master节点上,可以将副本设置多一点

kubectl scale deploy web --replicas=20

在查看Pod:kubectl get po -o wide

web-5bb6fd4c98-9rrp2   1/1     Running   0          5m19s   10.100.255.108   my-node     <none> ...
web-5bb6fd4c98-fgsfn   1/1     Running   0          5m19s   10.100.0.200     my-master   <none> ...
web-5bb6fd4c98-g7p4w   1/1     Running   0          5m19s   10.100.255.112   my-node     <none> ...

可以看到,一部分节点调度到Master上面去了

先缩容,将污点加回去(用下面的命令)再扩容试试看,可以发现新增加的节点都在Worker节点上了

kubectl taint node my-master node-role.kubernetes.io/master:NoSchedule

节点标签选择器

首先删除deploy:kubectl delete deploy web

给master节点打上标签test123_env=prod,标签就是键值对,随便起名儿

kubectl label node my-master test123_env=prod

然后在web.yaml中新增nodeSelector声明

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: webname: web
spec: replicas: 10 # 副本改多一点selector: matchLabels:app: web             strategy: {}template:                metadata:labels:app: webspec:containers:- image: nginx:1.14name: nginx# 新增的内容nodeSelector:test123_env: prod
status: {}

最后执行,理论上所有Pod都应该被调度到Master节点上,但是发现所有的Pod都被挂起了,没有被调度

web-6897865b86-sp6fh   0/1     Pending   0          30s   <none>   <none>   <none>           <none>
web-6897865b86-vkcx2   0/1     Pending   0          30s   <none>   <none>   <none>           <none>
web-6897865b86-wvdk6   0/1     Pending   0          30s   <none>   <none>   <none>           <none>

这是什么原因呢?这是污点在作祟,别忘记了,Master节点的污点值默认是NoSchedule,不允许被调度的,查看一下Master节点的污点值

[root@my-master ~]# kubectl describe node my-master | grep Taints
Taints:             node-role.kubernetes.io/master:NoSchedule

果然是NoSchedule,先去掉污点值

kubectl taint node my-master node-role.kubernetes.io/master:NoSchedule-

机器突然有点卡,这应该是在调度Pod了,查看一下果不其然,节点都被调度到了Master上

web-6897865b86-sp6fh   1/1     Running   0          4m2s   10.100.0.208   my-master   <none> ...
web-6897865b86-vkcx2   1/1     Running   0          4m2s   10.100.0.209   my-master   <none> ...
web-6897865b86-wvdk6   1/1     Running   0          4m2s   10.100.0.213   my-master   <none> ...

这里还可以得出一个结论,在Pod被调度的时候,节点污点值的优先级是高于节点标签的

最后还原现场

# 删除deploy
kubectl delete deploy web# 删掉标签
kubectl label node my-master test123_env-# 恢复污点
kubectl taint node my-master node-role.kubernetes.io/master:NoSchedule

节点亲和性

亲和性和节点选择器类似,多了操作符表达式:In、NotIn、Exists、Gt、Lt、DoesNotExists,此处就不再演示了,感兴趣的同学自行尝试一下

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: webname: web
spec: replicas: 10 # 副本改多一点selector: matchLabels:app: web             strategy: {}template:                metadata:labels:app: webspec:containers:- image: nginx:1.14name: nginx# 新增的内容affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: test123_envoperator: Invalues:- dev- testpreferreDuringSchedulingIgnoredDuringExecution:- weight: 1preference:- matchExpressions:- key: groupoperator: Invalues:- ttttest   
status: {}

上面的亲和性表示如下含义

  • requiredDuringSchedulingIgnoredDuringExecution:硬亲和,test123_env等于dev或者test,必须满足
  • preferreDuringSchedulingIgnoredDuringExecution:软亲和,group等于ttttest,非必须满足

K8S搞这么多策略有啥用呢?又是节点污点、节点标签、Pod调度策略之类的,目的当然是提供最大的灵活性,最终提高整体资源利用率,这就是自动装箱

这里的 affinity 部分用于定义容器在调度到节点时的偏好设置。具体来说,这个配置包括两部分:

  1. requiredDuringSchedulingIgnoredDuringExecution:这是一个必需的亲和性规则,它要求容器只能被调度到满足指定条件的节点上。在这个示例中,它要求节点的 test123_env 标签的值必须是 "dev" 或 "test",否则容器将不会被调度到这些节点。

  2. preferreDuringSchedulingIgnoredDuringExecution:这是一个偏好的亲和性规则,它定义了容器倾向于被调度到满足指定条件的节点上。在这个示例中,它定义了一个权重为1的偏好规则,要求节点的 group 标签的值应为 "ttttest",以增加容器被调度到这些节点的可能性。这并不是一个硬性要求,只是一个偏好设置。

总之,这些亲和性设置帮助 Kubernetes 调度器在将 Pod 调度到节点时考虑节点的标签和属性,以满足或偏好某些条件。这有助于优化应用程序的性能和资源利用。😺

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Chrome浏览器进行网页截图

在需要截图的网页上&#xff0c;按F12打开开发调试页面&#xff0c;再按下ShiftCtrlP&#xff0c;打开命令输入框&#xff0c;输入Capture&#xff0c; 此时会弹出4中截图模式&#xff0c;我个人比较喜欢用Capture full size screenshot Capture area screenshot&#xff0c;…

2023年中国纸箱机械优点、市场规模及发展前景分析[图]

纸箱机械行业是指涉及纸箱生产和加工的机械设备制造、销售和相关服务的产业。这个行业的主要任务是设计、制造和提供用于生产各种类型和规格纸箱的机械设备&#xff0c;以满足包装行业对纸箱的不同需求。 纸箱机械行业优点 资料来源&#xff1a;共研产业咨询&#xff08;共研网…

将语义分割的标注mask转为目标检测的bbox

1. 语义分割标签 1.1 labelme工具 语义分割的标签是利用labelme工具进行标注的,标注的样式如下: 1.2 语义分割的标签样式 2. 转换语义分割的标注到目标检测的bbox 实现步骤 (1) 利用标注的json文件生成mask图片(2) 在mask图片中找到目标的bbox矩形框的左上角点和右下角点(…

d3dx9_43.dll丢失怎么解决,四个解决方法帮你解决d3dx9_43.dll丢失

随着科技的不断发展&#xff0c;我们越来越依赖各种软件和硬件设备来提高生活和工作效率。然而&#xff0c;有时候我们可能会遇到一些技术问题&#xff0c;如“d3dx9_43.dll丢失”的问题。这个问题可能导致某些程序无法正常运行&#xff0c;给我们的生活带来诸多不便。因此&…

java中的容器(集合),HashMap底层原理,ArrayList、LinkedList、Vector区别,hashMap加载因子0.75原因

一、java中的容器 集合主要分为Collection和Map两大接口&#xff1b;Collection集合的子接口有List、Set&#xff1b;List集合的实现类有ArrayList底层是数组、LinkedList底层是双向非循环列表、Vector&#xff1b;Set集合的实现类有HashSet、TreeSet&#xff1b;Map集合的实现…

优化销售策略,突破企业全面预算管理难题

传统的企业年度销售计划往往会消耗企业内部人员很多精力和时间&#xff0c;比如需要收集数据、处理电子表格、确定项目优先级、预测未来发展以及为次年的费用制定预算等。然而随着这些繁琐的工作不断进行&#xff0c;其中的准确性和价值也受到了一定的怀疑。虽然销售计划仍按着…

【API篇】五、Flink分流合流API

文章目录 1、filter算子实现分流2、分流&#xff1a;使用侧输出流3、合流&#xff1a;union4、合流&#xff1a;connect5、connect案例 分流&#xff0c;很形象的一个词&#xff0c;就像一条大河&#xff0c;遇到岸边有分叉的&#xff0c;而形成了主流和测流。对于数据流也一样…

网络安全评估(网络安全评估)

讨论了基于互联网的网络安全评估和渗透测试的基本原理&#xff0c;网络安全服务人员&#xff0c;安全运营人员&#xff0c;通过评估来识别网络中潜在的风险&#xff0c;并对其进行分类分级。 黑客通常采取的攻击方式如下&#xff1a; 突破目标外围系统&#xff0c;比如主站拿…

智能电表上的模块发热正常吗?

智能电表是一种可以远程抄表、计费、控制和管理的电力计量设备&#xff0c;它可以实现智能化、信息化和网络化的电力用电管理。智能电表的主要组成部分包括电能计量模块、通信模块、控制模块和显示模块等。其中&#xff0c;通信模块和控制模块是智能电表的核心部件&#xff0c;…

量子信息处理器可能能够提供高度压缩的生成对抗学习任务的版本

量子信息处理在生成对抗学习任务中的应用可能性&#xff0c;以及量子信息处理器在表示高维向量和执行线性代数运算上的优势。 举个例子 假设底层数据由M个在N维实数或复数空间中的归一化向量~vj组成&#xff0c;使得数据的&#xff08;归一化&#xff09;协方差矩阵为C (1/M…

虹科 | 解决方案 | 机械免拆压力测试方案

对于发动机的气门卡滞或气门开闭时刻错误、活塞环磨损、喷油嘴泄漏/堵塞等故障&#xff0c;往往需要解体发动机或拆卸部件才能发现&#xff1b;而对于某些轻微的故障&#xff0c;即使解体了发动机后也经常难于肉眼判别 虹科Pico提供的WPS500压力测试方案&#xff0c;可以动态测…

Leetcode 15:三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 解题思…

Golang 泛型的介绍

引言 Golang是一种现代的编程语言&#xff0c;以其简洁的语法和高效的性能而闻名。然而&#xff0c;与其他一些编程语言相比&#xff0c;Golang在语言层面上缺乏泛型的支持&#xff0c;这使得在处理不同类型的数据时变得有些困难。在本文中&#xff0c;我们将介绍Golang泛型的…

三元组(C++ 实现矩阵快速转置)

三元组稀疏矩阵是一种高效存储稀疏矩阵的方法。它通过记录矩阵中非零元素的行、列和值来表示一个稀疏矩阵。我们在三元组里存储的是每个元素的行、列以及值。 题目&#xff1a; 任意输入一个稀疏矩阵M&#xff0c;用三元组顺序表压缩存储该稀疏矩阵M&#xff0c;然后求其转置矩…

为什么索引要用B+树来实现呢,而不是B树

首先&#xff0c;常规的数据库存储引擎&#xff0c;一般都是采用 B 树或者 B树来实现索引的存储。 B树 因为 B 树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对于数据库来说&#xff0c;所有…

Oracle如何插入图片数据?

1、创建表&#xff0c;注意&#xff1a;插入图片的列要定义成BLOB类型 create table image_lob(t_id varchar2(5) not null,t_image blob not null);2、创建图片目录&#xff0c;images为目录名 create or replace directory "images" as f:\pic\;3、创建存储过程&am…

修改echarts的tooltip样式 折线图如何配置阴影并实现渐变色和自适应

图片展示 一、引入echarts 这里不用多解释 vue里使用 import echarts from “echarts”; html页面引用js文件或用script标签引用 二、定义一个具有宽高的dom div <div id"echart-broken" style"width:400px;height: 200px;"></div>三、定义…

layui框架实战案例(21):layui table单元格显示图片导致复选框冗余的解决方案

图片自适应表格CSS 为防止单元格内的图片不能正常显示&#xff0c;需本地重写CSS。 /*layui-table图片自适应*/ .layui-table-cell {height: auto;line-height: 20px;}.layui-table-cell img {height: 50%;max-width: 50%; }列代码 , cols: [[{type: checkbox,fixed:left, w…

非科班,补基础

大家好&#xff0c;我是大彬~ 今天跟大家分享知识星球小伙伴关于【非科班转码如何补基础】的提问。 往期星球提问整理&#xff1a; 读博&#xff1f;找工作&#xff1f; 性格测试真的很重要 想找一份实习工作&#xff0c;需要准备什么 球友提问&#xff1a; 大彬大佬&#xf…

Rust 语法笔记

变量绑定&#xff08;声明变量&#xff09; let 变量名: 类型 变量值; let 变量名 变量值[类型]; // 整型 默认 i32&#xff1b;浮点 默认 f64所有的 let 绑定都必须尾接;&#xff0c;代码块也不例外。 mut 可以通过重新声明的方式来改变变量类型 可以下划线改善数字的可读…