K8s学习十(高级调度)

高级调度

CronJob计划任务

  • 在 k8s 中周期性运行计划任务,与 linux 中的 crontab 相同
  • 注意点:CronJob 执行的时间是 controller-manager 的时间,所以一定要确保 controller-manager 时间是准确的
  • cron表达式如下:

在这里插入图片描述

  • 配置如下:

apiVersion: batch/v1
kind: CronJob
metadata:name: cron-job
spec:concurrencyPolicy: Allow # 并发调度策略:Allow 允许并发调度,Forbid:不允许并发执行,Replace:如果之前的任务还没执行完,就直接执行新的,放弃上一个任务failedJobsHistoryLimit: 1 # 保留多少个失败的任务successfulJobHistoryLimit: 3 # 保留多少个成功的任务suspend: false # 是否挂起任务,若为 true 则该任务不会执行
#  startingDeadlineSeconds: 30 # 间隔多长时间检测失败的任务并重新执行,时间不能小于 10schedule: "* * * * *" # 调度策略,因为都是*,所以是每分钟执行一次jobTemplate:spec:template:spec:containers:- name: busyboximage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure

初始化容器 initcontainer

  • 在真正的容器启动之前,先启动 InitContainer,在初始化容器中完成真实容器所需的初始化操作,完成后再启动真实的容器。参考上面有一张图就是容器初始化还有钩子函数
  • 相对于 postStart 来说,首先 InitController 能够保证一定在 EntryPoint 之前执行,而 postStart 不能,其次 postStart 更适合去执行一些命令操作,而 InitController 实际就是一个容器,可以在其他基础容器环境下执行更复杂的初始化功能。
  • 在 pod 创建的模板中配置 initContainers 参数:
spec:initContainers:- image: nginximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 10;echo 'inited' >> /.init"]name: init-test

污点和容忍

  • 比如一般不在主节点master上派任务,所以在master节点上有一个污点,容忍是对pod而言,在pod上打上可以容忍xx污点,就可以部署到节点上。
污点
  • 污点:是标注在节点上的,当我们在一个节点上打上污点以后,k8s 会认为尽量不要将 pod 调度到该节点上,除非该 pod 上面表示可以容忍该污点,且一个节点可以打多个污点,此时则需要 pod 容忍所有污点才会被调度该节点。

  • 为节点打上污点kubectl taint node k8s-master key=value:NoSchedule

  • 移除污点kubectl taint node k8s-master key=value:NoSchedule-

  • 查看污点kubectl describe no k8s-master
    污点的影响

  • NoSchedule:不能容忍的 pod 不能被调度到该节点,但是已经存在的节点不会被驱逐

  • NoExecute:不能容忍的节点会被立即清除,能容忍且没有配置 tolerationSeconds 属性,则可以一直运行,设置了 tolerationSeconds: 3600 属性,则该 pod 还能继续在该节点运行 3600 秒

NoSchedule

  • 如果不能容忍该污点,那么 Pod 就无法调度到该节点上

NoExecute

  • 如果 Pod 不能忍受这类污点,Pod 会马上被驱逐。
  • 如果 Pod 能够忍受这类污点,但是在容忍度定义中没有指定 tolerationSeconds, 则 Pod 还会一直在这个节点上运行。
  • 如果 Pod 能够忍受这类污点,而且指定了 tolerationSeconds, 则 Pod 还能在这个节点上继续运行这个指定的时间长度。

操作

  • 可以执行kubectl taint node master node-role.kubernetes.io/master:NoSchedule-去掉污点

  • 给node-2打上污点,执行kubectl taint node node-2 memory=low:NoSchedule就打上了相应的污点,然后执行kubectl describe no node-2,就可以找到污点标签,是不能调度,原有的pod也没被驱逐

在这里插入图片描述

容忍
  • 容忍:是标注在 pod 上的,当 pod 被调度时,如果没有配置容忍,则该 pod 不会被调度到有污点的节点上,只有该 pod 上标注了满足某个节点的所有污点,则会被调度到这些节点

  • pod 的 spec 下面配置容忍

tolerations:
- key: "污点的 key"value: "污点的 value"effect: "NoSchedule" # 污点产生的影响operator: "Equal" # 表是 value 与污点的 value 要相等,也可以设置为 Exists 表示存在 key 即可,此时可以不用配置 value

Equal

  • 比较操作类型为 Equal,则意味着必须与污点值做匹配,key/value都必须相同,才表示能够容忍该污点

Exists

  • 容忍与污点的比较只比较 key,不比较 value,不关心 value 是什么东西,只要 key 存在,就表示可以容忍。

亲和力

  • 跟上面的污点相对,表示希望什么过来
NodeAffinity
  • 节点亲和力:进行 pod 调度时,优先调度到符合条件的亲和力节点上
  • 这里分为 RequiredDuringSchedulingIgnoredDuringExecution和PreferredDuringSchedulingIgnoredDuringExecution两种,分别是硬亲和力和软亲和力
  • RequiredDuringSchedulingIgnoredDuringExecution:硬亲和力,即支持必须部署在指定的节点上,也支持必须不部署在指定的节点上
  • PreferredDuringSchedulingIgnoredDuringExecution:软亲和力,尽量部署在满足条件的节点上,或尽量不要部署在被匹配的节点上
  • 匹配类型如下:
In:部署在满足条件的节点上
NotIn:匹配不在条件中的节点,实现节点反亲和性,这里是匹配key的值
Exists:只要存在 label 名字就可以,不关心值是什么
DoesNotExist:匹配指定 label 名不存在的节点,实现节点反亲和性
Gt:value 为数值,且节点上的值小于指定的条件
Lt:value 为数值,且节点上的值大于指定条件
  • 配置:
apiVersion: v1
kind: Pod
metadata:name: with-node-affinity
spec:affinity: # 亲和力配置nodeAffinity: # 节点亲和力requiredDuringSchedulingIgnoredDuringExecution: # 节点必须匹配下方配置nodeSelectorTerms: # 选择器- matchExpressions: # 匹配表达式- key: topology.kubernetes.io/zone # 匹配节点 label 的 keyoperator: In # 匹配方式,只要匹配成功下方的一个 value 即可values:- antarctica-east1 # 匹配的 value- antarctica-west1 # 匹配的 valuepreferredDuringSchedulingIgnoredDuringExecution: # 节点尽量匹配下方配置- weight: 1 # 权重[1,100],按照匹配规则对所有节点累加权重,最终之和会加入优先级评分,优先级越高被调度的可能性越高preference:matchExpressions: # 匹配表达式- key: another-node-label-key # label 的 keyoperator: In # 匹配方式,满足一个即可values:- another-node-label-value # 匹配的 value
#      - weight: 20......containers:- name: with-node-affinityimage: pause:2.0
PodAffinity和PodAntiAffinity
  • 跟上面一样,也是具有RequiredDuringSchedulingIgnoredDuringExecution和PreferredDuringSchedulingIgnoredDuringExecution两种
  • 对于PodAffinity,分别是必须将应用部署到一起和尽量部署到一起
  • 对于PodAntiAffinity是必须不部署到一起和尽量不部署到一起
  • 配置:

apiVersion: v1
kind: Pod
metadata:name: with-pod-affinity
spec:affinity: # 亲和力配置podAffinity: # pod 亲和力配置requiredDuringSchedulingIgnoredDuringExecution: # 当前 pod 必须匹配到对应条件 pod 所在的 node 上- labelSelector: # 标签选择器matchExpressions: # 匹配表达式- key: security # 匹配的 keyoperator: In # 匹配方式values: # 匹配其中的一个 value- S1topologyKey: topology.kubernetes.io/zone #这里是匹配节点上的,节点上必须要有这个标签,也就是有两个匹配条件podAntiAffinity: # pod 反亲和力配置preferredDuringSchedulingIgnoredDuringExecution: # 尽量不要将当前节点部署到匹配下列参数的 pod 所在的 node 上- weight: 100 # 权重podAffinityTerm: # pod 亲和力配置条件labelSelector: # 标签选择器matchExpressions: # 匹配表达式- key: security # 匹配的 keyoperator: In # 匹配的方式values:- S2 # 匹配的 valuetopologyKey: topology.kubernetes.io/zonecontainers:- name: with-pod-affinityimage: pause:2.0

身份认证与权限

  • Kubernetes 中提供了良好的多租户认证管理机制,如 RBAC、ServiceAccount 还有各种策略等。
  • 通过该文件可以看到已经配置了 RBAC 访问控制/usr/lib/systemd/system/kube-apiserver.service
认证
  • 所有 Kubernetes 集群有两类用户:由 Kubernetes 管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。
User Accounts
  • 普通账户是假定被外部或独立服务管理的,由管理员分配 keys,用户像使用 Keystone 或 google 账号一样,被存储在包含 usernames 和 passwords 的 list 的文件里。
  • 需要注意:在 Kubernetes 中不能通过 API 调用将普通用户添加到集群中。
    • 普通帐户是针对(人)用户的,服务账户针对 Pod 进程。
    • 普通帐户是全局性。在集群所有namespaces中,名称具有惟一性。
    • 通常,群集的普通帐户可以与企业数据库同步,新的普通帐户创建需要特殊权限。服务账户创建目的是更轻量化,允许集群用户为特定任务创建服务账户。
    • 普通帐户和服务账户的审核注意事项不同。
    • 对于复杂系统的配置包,可以包括对该系统的各种组件的服务账户的定义。
Service Accounts
  • Service Account自动化

Service Account Admission Controller

  • 通过 Admission Controller 插件来实现对 pod 修改,它是 apiserver 的一部分。创建或更新 pod 时会同步进行修改 pod。当插件处于激活状态(在大多数发行版中都默认情况)创建或修改 pod 时,会按以下操作执行:
    • 如果 pod 没有设置 ServiceAccount,则将 ServiceAccount 设置为 default。
    • 确保 pod 引用的 ServiceAccount 存在,否则将会拒绝请求。
    • 如果 pod 不包含任何 ImagePullSecrets,则将ServiceAccount 的 ImagePullSecrets 会添加到 pod 中。
    • 为包含 API 访问的 Token 的 pod 添加了一个 volume。
    • 把 volumeSource 添加到安装在 pod 的每个容器中,挂载在 /var/run/secrets/kubernetes.io/serviceaccount。它包含了 Pod 的 ServiceAccount 令牌和服务证书。

Token Controller

  • TokenController 作为 controller-manager 的一部分运行。异步行为:
    • 观察 serviceAccount 的创建,并创建一个相应的 Secret 来允许 API 访问。
    • 观察 serviceAccount 的删除,并删除所有相应的ServiceAccountToken Secret
    • 观察 secret 添加,并确保关联的 ServiceAccount 存在,并在需要时向 secret 中添加一个 Token。
    • 观察 secret 删除,并在需要时对应 ServiceAccount 的关联

Service Account Controller

  • Service Account Controller 在 namespaces 里管理ServiceAccount,并确保每个有效的 namespaces 中都存在一个名为 “default” 的 ServiceAccount。
授权(RBAC:基于角色的访问控制)
  • 下面的role只是定义了权限,没有绑定起来,后两个binding是实现绑定的操作

Role

  • 代表一个角色,会包含一组权限,没有拒绝规则,只是附加允许。它是 Namespace 级别的资源,只能作用与 Namespace 之内。
  • 查看已有的角色信息kubectl get role -n ingress-nginx -o yaml
  • 配置文件:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxname: nginx-ingressnamespace: ingress-nginx
roles:
- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get
- apiGroups:- ""resourceNames:- ingress-controller-label-nginxresources:- configmapsverbs:- get- update
- apiGroups:- ""resources:- configmapsverbs:- create

ClusterRole

  • 功能与 Role 一样,区别是资源类型为集群类型,而 Role 只在 Namespace

  • 查看某个集群角色的信息kubectl get clusterrole view -oyaml,因为是集群的,所以不用-n指定命名空间

RoleBinding

  • Role 或 ClusterRole 只是用于制定权限集合,具体作用与什么对象上,需要使用 RoleBinding 来进行绑定。

  • 作用于 Namespace 内,可以将 Role 或 ClusterRole 绑定到 User、Group、Service Account 上。

  • 查看 rolebinding 信息kubectl get rolebinding --all-namespaces

  • 查看指定 rolebinding 的配置信息kubectl get rolebinding <role_binding_name> --all-namespaces -oyaml

  • 配置:


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:......
roleRef: #跟角色绑定apiGroup: rbac.authorization.k8s.iokind: Rolename nginx-ingress-role
subjects: # 主体是sa
- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx

ClusterRoleBinding

  • 与 RoleBinding 相同,但是作用于集群之上,可以绑定到该集群下的任意 User、Group 或 Service Account

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

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

相关文章

Axios 使用教程

Axios 是什么? Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 特性 从浏览器创建 XM…

【ZZULIOJ】1046: 奇数的乘积(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 给你n个整数&#xff0c;求他们中所有奇数的乘积。 输入 第一个数为n&#xff0c;表示本组数据一共有n个&#xff0c;接着是n个整数&#xff0c;你可以假设每组数据必定至少存在一个奇数。 输出…

五年经验,还不懂小表驱动大表

小表驱动大表&#xff0c;也就是说用小表的数据集驱动大表的数据集。假如有order和user两张表&#xff0c;其中order表有10000条数据&#xff0c;而user表有100条数据。 这时如果想查一下&#xff0c;所有有效的用户下过的订单列表。可以使用in关键字实现&#xff1a; select…

软件设计师——数据库

数据库 三级模式两级映像关系模型基本术语关系模型中的关系完整性约束 三级模式两级映像 概念模式&#xff08;也称模式&#xff09;对应基本表 外模式&#xff08;也称用户模式或子模式&#xff09;对应视图 内模式&#xff08;也称存储模式&#xff09;对应存储文件 两级映像…

Linux 5.10 Pstore 功能测试

目录 简介环境配置内核配置参考备注 简介 Pstore(Persistent store support)是用于系统发生oops或panic时&#xff0c;自动保存内核log buffer中的日志。随着功能不断完善&#xff0c;Duo S使用Linux 5.10已经支持保存console日志、ftrace消息和用户空间日志的收集&#xff0c…

Transformer架构顶层应用的基础知识

Transformer架构自从2017年被提出以来&#xff0c;已经在自然语言处理&#xff08;NLP&#xff09;和其他领域成为了一种革命性的模型结构。它不仅在各种NLP任务中取得了突破性的表现&#xff0c;也被扩展应用于图像处理、音频处理等领域。理解Transformer架构及其顶层应用的基…

Java基于SpringBoot+Vue的专家医院预约挂号系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Android Framework学习笔记(2)----系统启动

Android系统的启动流程 启动过程中&#xff0c;用户可控部分是framework的init流程。init是系统中的第一个进程&#xff0c;其它进程都是它的子进程。 启动逻辑源码参照&#xff1a;system/core/init/main.cpp 关键调用顺序&#xff1a;main->FirstStageMain->SetupSel…

题目:宏#define命令练习(3)

题目&#xff1a;宏#define命令练习(3)    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should…

顺序表(1)——顺序表详解

什么是数据结构&#xff1f; 简单来说数据结构就是计算机储存&#xff0c;组织数据的方式&#xff0c;而数组就是最基础的数据结构。 那为什么会有数据结构的存在呢&#xff1f; 这需要将数据结构分成数据和结构两部分进行分析。 数据&#xff1a;我们在计算机屏幕上所看见的文…

【LeetCode: 572. 另一棵树的子树 + 二叉树 + dfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

spring事务那些事

实际工作中还会面临千奇百怪的问题&#xff0c;看下面返个例子&#xff08;注意MySql数据库测试&#xff09;&#xff1a; //1.hello1Service 调用 hello2Service Transactional(propagation Propagation.REQUIRED,rollbackFor Exception.class) public void doUpdate() {//…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展&#xff0c;链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅&#xff0c;对这些领域进行详细解析&#xff0c;探讨它们的意义、应用场景以及未来发展趋势。 链游开发&#xff08;Bl…

LwIP TCP/IP

LWIP 架构 LwIP 符合 TCP/IP 模型架构&#xff0c;规定了数据的格式、传输、路由和接收&#xff0c;以实现端到端的通信。 此模型包括四个抽象层&#xff0c;用于根据涉及的网络范围&#xff0c;对所有相关协议排序&#xff08;参见图 2&#xff09;。这几层从低到高依次为&am…

linux内核网络--skb_shared_info结构和skb_shinfo函数“每日读书”

如图2-5所示&#xff0c;数据缓冲区尾端有个名为skb_shared_info的数据结构&#xff0c;用以保持此数据区块的附加信息&#xff0c;此数据结构紧接在标记数据尾端的end指针之后&#xff0c;此数据结构的定义如下&#xff0c; struct skb_shared_info { atomic_t dataref; unsig…

ctfshow web入门 php特性 web123--web139

web123 必须传CTF_SHOW&#xff0c;CTF_SHOW.COM 不能有fl0g 在php中变量名字是由数字字母和下划线组成的&#xff0c;所以不论用post还是get传入变量名的时候都将空格、、点、[转换为下划线&#xff0c;但是用一个特性是可以绕过的&#xff0c;就是当[提前出现后&#xff0c;…

机器学习模型——GBDT和Xgboost

GBDT基本概念&#xff1a; GBDT&#xff08;Gradient Boosting Decision Tree&#xff0c;简称GBDT&#xff09;梯度提升决策树&#xff0c;是Gradient Boost 框架下使用较多的一种模型&#xff0c;且在GBDT中&#xff0c;其基学习器是分类回归树也就是CART&#xff0c;且使用…

【第二十六篇】Burpsuite实现请求方式修改+请求体文件选取

有时我们想将请求包的请求方法或请求体进行修改,这些操作可以由burpsuite完成,以节省时间。 文章目录 修改请求方法请求体文件选取修改请求方法 例如,某请求包的请求方法为GET: 如果我们想将其修改为POST且传递POST参数、上传文件,可以按以下步骤: 1、修改请求方法 2…

vue2中的局部组件和全局组件

注&#xff1a;vue2中使用组件远没有vue3中简单&#xff0c;具体可以看阿耿老师的lingshi小程序 如图所示&#xff1a;

二分练习题——奶牛晒衣服

奶牛晒衣服 题目分析 这里出现了“弄干所有衣服的最小时间”&#xff0c;那么可以考虑用二分去做。 第一阶段二段性分析 假设当前需要耗费的时间为mid分钟&#xff0c;如果mid分钟内可以烘干这些衣服&#xff0c;那么我们可以确定右边界大于mid的区间一定也可以。但是此时我…