首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小刘说

砥砺前行
首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • zabbix

  • docker

  • kubernetes

    • 二进制安装高可用k8s集群(v1.25.0)
    • 二进制安装高可用k8s集群(v1.27.2)
    • kubernetes架构解析
    • kubernetes基础概念-Pod
    • kubernetes调度基础
      • 1. 命名空间
        • 1.1. 列出命名空间
        • 1.2. 切换命令行的命名空间
        • 1.3. 创建命名空间
        • 1.3.1. 通过文件创建
        • 1.3.2. 通过命令行创建
        • 1.4. 删除命名空间
      • 2. 标签和注解
        • 2.1. 创建/修改标签
        • 2.1. 通过文件创建/修改
        • 2.1. 通过命令行创建/修改
        • 2.2. 标签选择器
        • 2.3. 注解
      • 3. ReplicationController和ReplicaSet
        • 3.1. ReplicationController(已弃用)
        • 3.2. ReplicaSet
    • kubernetes控制器-Deployment
    • kubernetes控制器-Service
    • Kubernetes(k8s) YAML文件详解
  • harbor

  • mysql

  • nexus

  • jenkins

  • elasticsearch

  • 学习笔记

  • apache2.2升级2.4
  • heredoc(cat EOF)
  • Rocky linux 9 初始化
  • 运维
  • kubernetes
小刘
2023-07-27
目录

kubernetes调度基础

# kubernetes调度基础

# 1. 命名空间

命名空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。

命名空间作用域仅针对带有命名空间的对象 (opens new window), (例如 Deployment、Service 等),这种作用域对集群范围的对象 (例如 StorageClass、Node、PersistentVolume 等)不适用。

简单来说,通过命名空间我们可以将同一集群中的资源分为开发,测试,正式环境,并且通过区分命名空间可以包含同名的资源。

# 1.1. 列出命名空间

使用以下命令来列出集群中的所有命名空间:

kubectl get namespaces
1

使用以下命令来列出集群中的指定命名空间的所有pod:

kubectl get pods -n <NAMESPACE>
1

我们可以通过 -n 或者 --namespace 指定想查看的命名空间。

# 1.2. 切换命令行的命名空间

在新版本的 Kubernetes 中,kubectl 的默认命名空间已经不再是 default,而是用户的当前命名空间。这是因为 Kubernetes 强烈建议您在不同的命名空间中隔离应用程序和资源,因此 kubectl 默认使用用户当前的命名空间来提高生产力。

使用以下命令来查看当前所在的命名空间:

kubectl config view --minify --output 'jsonpath={..namespace}'
1

使用以下命令来切换命令行的命名空间:

kubectl config set-context --current --namespace=<NAMESPACE>
1

# 1.3. 创建命名空间

# 1.3.1. 通过文件创建

可以通过自定义yaml文件进行创建命名空间:

apiVersion: v1
kind: Namespace
metadata:
  name: test
1
2
3
4

使用以下命令来通过文件创建test命名空间:

kubectl create -f test.yaml
1

# 1.3.2. 通过命令行创建

也可以使用以下命令通过命令行创建命名空间:

kubectl create namespace test
1

# 1.4. 删除命名空间

删除命名空间

当删除整个命名空间时,Pod将会伴随命名空间自动删除,可以使用以下命令删除命名空间:

kubectl delete namespace test
1

删除命名空间中的Pod

使用--all选项删除对应命名空间中的所有Pod:

kubectl delete pod --all -n test
1

删除命名空间中的所有资源(几乎)

删除当前命名空间中的所有资源,包括Deployment、ReplicaSet、pod等,以及我们创建的所有service,但是不包含集群范围内的对象,如PersistentVolume:

kubectl delete all --all -n test
1

# 2. 标签和注解

标签(Labels) 是附加到 Kubernetes 对象 (opens new window)(比如 Pod)上的键值对。

在部署实际应用程序时,随着pod数量的增加,我们就需要一种标准,而标签可以将Pod组织成群体的方式,仅通过一次操作对某一个组的资源进行操作,如Pod等等。

标签是不仅可以组织pod,也可以组织其他所有的Kubernetes资源。

# 2.1. 创建/修改标签

# 2.1. 通过文件创建/修改

在之前的Pod文章中,我们创建Pod时通过 metadata.labels 指定了一些标签:

  labels:	                               # 可选,标签选择器,一般用于Selector
    app: nginx               
    role: frontend                       # 可选,标签,可以写多个
1
2
3

Pod创建完成后,通过以下命令查看所有Pod的标签:

kubectl get pod --show-labels
1

# 2.1. 通过命令行创建/修改

也可以在现有pod上进行添加标签:

kubectl label pod nginx env=test
1

修改标签:

kubectl label pod nginx env=prod --overwrite
1

查看标签时可以通过 -L 指定标签作为显示的一列:

kubectl get pod -L env,app
1

  • 推荐使用的标签 (opens new window)

# 2.2. 标签选择器

标签选择器主要用于资源的匹配,只有符合条件的资源才会被调用或使用,可以使用该方式对集群中的各类资源进行分配。

可以使用 =、== 和 != 三种运算符进行匹配,并通过 , 进行过滤。

也可以使用 in、notin 和 exists 三种语句进行过滤,本质上两种匹配方式区别不大。

查找标签key为 ENV 值等于 prod 并且标签key为 app 值等于 nginx 的资源:

kubectl get pods -l 'ENV=prod,app=nginx' --show-labels
1

查找标签key为 ENV 值等于 prod 或者 test 的资源:

kubectl get pods -l 'ENV in (prod,test)' --show-labels
1

# 2.3. 注解

使用 Kubernetes 注解为对象 (opens new window)附加任意的非标识的元数据。

注解并不是为了保存标识信息而存在的,可以通过对每个pod或其他API对象添加注解来为其添加说明,以便每个使用该集群的人都可以快速查找有关每个单独对象的信息。

通过之前创建的nginxPod查看注解:

kubectl get pod nginx -o yaml | grep annotations -A 5
1

Pod在创建时会自动添加一些注解。我们也可以手动添加注解:

kubectl annotate pod nginx imageregistry: "https://hub.docker.com/"
1

再次查看注解,发现已经成功添加。

# 3. ReplicationController和ReplicaSet

# 3.1. ReplicationController(已弃用)

ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态。换句话说,ReplicationController 确保一个 Pod 或一组同类的 Pod 总是可用的。

ReplicationController总是会保障Pod的数量达到期望值,Pod 数量过多时,ReplicationController 会终止多余的 Pod。当 Pod 数量太少时,ReplicationController 将会启动新的 Pod。

新建 ReplicationController.yml 如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

使用kubectl apply命令从YAML文件创建ReplicationController:

kubectl apply -f ReplicationController.yml
1

查看ReplicationController:

kubectl get replicationcontrollers
1

  • DESIRED:用户期望的Pod副本个数(spec.replicas的值)。
  • CURRENT:当前处于Running状态的Pod的个数。
  • READY:当前已经可用的Pod的个数,即健康检查处于正确状态的Pod的个数。

# 3.2. ReplicaSet

ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

ReplicaSet的作用与ReplicationController相同,都是保障Pod的数量达到期望值,但是两者区别就是ReplicaSet支持更强大的标签选择器。

新建 ReplicaSet.yml 如下:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

同样使用相同的命令进行创建以及查看ReplicaSet,发现与ReplicationController并没有什么区别,但是支持更强大的标签选择器可以通过matchExpressions进行多个资源的匹配。

  selector:
    matchLabels:
      app: nginx 
    matchExpressions:
      - { key: ENV, operator: In, values: [test] }
      - { key: app, operator: NotIn, values: [redis] }
1
2
3
4
5
6

matchExpressions其中包含数组,而数组中又分为map,每一个map的key的作用跟之前所说的标签选择器中的作用相同,其中operator字段略有不同,共分为以下4种情况:

  • In:label的值在某个列表中
  • NotIn:label的值不在某个列表中
  • Exists:某个label存在
  • DoesNotExist:某个label不存在

需要注意的是,在selector中,必须同时满足matchLabels和matchExpressions的条件才能匹配到对应的资源。

参考文章及书籍:

  • Kubernetes in Action (opens new window)

  • 深入剖析Kubernetes (opens new window)

  • 云原生Kubernetes全栈架构师实战 (opens new window)

上次更新: 2024/05/11, 03:55:33

← kubernetes基础概念-Pod kubernetes控制器-Deployment→

最近更新
01
kubernetes控制器-Service
08-18
02
kubernetes控制器-Deployment
08-08
03
kubernetes基础概念-Pod
07-25
更多文章>
Theme by Vdoing | Copyright © 2023-2024 本站支持IPv6访问 本站支持SSL安全访问
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式