【云原生 从零开始学Kubernetes】六、Kubernetes核心技术Pod_从零开始学kubernetes 百度云

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

apiserver 触发 watch 机制准备创建 pod,信息转发给调度器 scheduler,调度器使用调度算法选择 node,调度器将 node 信息给 apiserver,apiserver 将绑定的 node 信息写入 etcd.

  • 然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法,把pod调度某个node上

调度器用一组规则过滤掉不符合要求的主机。比如 Pod 指定了所需要的资源量,那么可用资源比 Pod 需 要的资源量少的主机会被过滤掉。

scheduler 查看 k8s api ,类似于通知机制。

首先判断:pod.spec.Node == null? 若为 null,表示这个 Pod 请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的 node。

然后将信息在 etcd 数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点) ps:同样上述操作的各种信息也要写到 etcd 数据库中

  • 在node节点,会通过 kubelet -- apiserver 读取etcd 拿到分配在当前node节点上的pod,然后通过docker创建容器

apiserver 又通过 watch 机制,调用 kubelet,指定 pod 信息,调用 Docker API 创建并启动 pod 内的容器。

创建完成之后反馈给 kubelet, kubelet 又将 pod 的状态信息给 apiserver, apiserver 又将 pod 的状态信息写入 etcd。

请添加图片描述
master 节点:kubectl -> kube-api -> kubelet -> CRI 容器环境初始化

节点亲和性

节点亲和性 nodeAffinity 和 之前nodeSelector 基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上

  • 硬亲和性:约束条件必须满足
  • 软亲和性:尝试满足,不保证

支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists

反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等

node 节点亲和性调度:nodeAffinity
[root@k8smaster ~]# kubectl explain pods.spec.affinity 
KIND: Pod 
VERSION: v1 
RESOURCE: affinity <Object> 
DESCRIPTION: 
	If specified, the pod's scheduling constraints 
	Affinity is a group of affinity scheduling rules. 
FIELDS: 
	nodeAffinity <Object> 
	podAffinity <Object> 
	podAntiAffinity <Object> 
 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity 
KIND: Pod 
VERSION: v1 
RESOURCE: nodeAffinity <Object> 
DESCRIPTION: 
Describes node affinity scheduling rules for the pod. 
Node affinity is a group of node affinity scheduling rules. 
FIELDS: 
preferredDuringSchedulingIgnoredDuringExecution <[]Object> 
requiredDuringSchedulingIgnoredDuringExecution <Object> 
 
prefered 表示有节点尽量满足这个位置定义的亲和性,这不是一个必须的条件,软亲和性 
require 表示必须有节点满足这个位置定义的亲和性,这是个硬性条件,硬亲和性 


[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution
KIND: Pod 
VERSION: v1 
RESOURCE: requiredDuringSchedulingIgnoredDuringExecution <Object> 
DESCRIPTION: 
FIELDS: 
nodeSelectorTerms <[]Object> -required- 
Required. A list of node selector terms. The terms are ORed. 
 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSe
lectorTerms 
KIND: Pod 
VERSION: v1 
RESOURCE: nodeSelectorTerms <[]Object> 
DESCRIPTION: 
 Required. A list of node selector terms. The terms are ORed. 
 A null or empty node selector term matches no objects. The requirements of 
 them are ANDed. The TopologySelectorTerm type implements a subset of the 
 NodeSelectorTerm. 
FIELDS: 
 matchExpressions <[]Object> 
 matchFields <[]Object> 
 
matchExpressions:匹配表达式的 
matchFields: 匹配字段的 
 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSe
lectorTerms.matchFields 
KIND: Pod 
VERSION: v1 
RESOURCE: matchFields <[]Object> 
DESCRIPTION: 
 
FIELDS: 
 key <string> -required- 
 values <[]string> 
 
[root@k8smaster ~]# kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions 
KIND: Pod 
VERSION: v1 
RESOURCE: matchExpressions <[]Object>

DESCRIPTION: 
FIELDS: 
 key <string> -required- 
 operator <string> -required- 
 values <[]string> 
key:检查 label 
operator:做等值选则还是不等值选则 
values:给定值 
 
例 1:使用 requiredDuringSchedulingIgnoredDuringExecution 硬亲和性 
在node1和2用docker拉取nginx镜像

[root@k8smaster ~]# vim pod-nodeaffinity-demo.yaml 
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod-node-affinity-demo 
  namespace: default 
    labels: 
      app: myapp 
      tier: frontend 
spec: 
  containers: 
  - name: myapp 
    image: nginx
  affinity: 
    nodeAffinity: 
      requiredDuringSchedulingIgnoredDuringExecution: 
        nodeSelectorTerms: 
        - matchExpressions: 
        - key: zone 
          operator: In 
          values: 
            - foo 
            - bar 
 
我们检查当前节点中有任意一个节点拥有 zone 标签的值是 foo 或者 bar,就可以把 pod 调度到这个 node 节点的 foo 或者 bar 标签上的节点上 
[root@k8smaster ~]# kubectl apply -f pod-nodeaffinity-demo.yaml
[root@k8smaster ~]# kubectl get pods -o wide | grep pod-node 
pod-node-affinity-demo 0/1 Pending 0 k8snode

status 的状态是 pending,上面说明没有完成调度,因为没有一个拥有 zone 的标签的值是 foo 或者 bar,而且使用的是硬亲和性,必须满足条件才能完成调度 
[root@k8smaster ~]# kubectl label nodes xianchaonode1 zone=foo 
给这个 node 节点打上标签 zone=foo,在查看 
[root@k8smaster ~]# kubectl get pods -o wide 显示如下: 
pod-node-affinity-demo 1/1 Running 0 k8snode
 
例 2 使用 preferredDuringSchedulingIgnoredDuringExecution 软亲和性 
[root@k8smaster ~]# vim pod-nodeaffinity-demo-2.yaml 
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod-node-affinity-demo-2 
  namespace: default 
    labels: 
      app: myapp 
      tier: frontend 
spec: 
  containers: 
  - name: myapp 
    image: ikubernetes/myapp:v1 
  affinity: 
    nodeAffinity: 
      preferredDuringSchedulingIgnoredDuringExecution: 
    - preference: 
        matchExpressions: 
       - key: zone1 
         operator: In 
         values: 
         - foo1 
         - bar1 
           weight: 60 
[root@k8smaster ~]# kubectl apply -f pod-nodeaffinity-demo-2.yaml 
[root@k8smaster ~]# kubectl get pods -o wide |grep demo-2 
pod-node-affinity-demo-2 1/1 Running 0 k8snode1
 
上面说明软亲和性是可以运行这个 pod 的,尽管没有运行这个 pod 的节点定义的 zone1 标签 
 
Node 节点亲和性针对的是 pod 和 node 的关系,Pod 调度到 node 节点的时候匹配的条件 

写在最后

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

-1715708248876)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值