pod 代表了 k8s 中的基本部署单元,但是在实际应用场景中,服务不可能是单个pod运行的,否则会出现“单点”。在 k8s 中对 pod 的托管部署,专门抽象成了单独的资源。其中包含了 ReplicationController 或 Deloyment ,由他们来管理实际的 pod。

  试想一下,当你创建未托管的 pod 的时候,会选择一个集群来运行 pod,在集群中选择节点来运行容器。如果节点中某些 pod 丢失,或者失败,这时候就需要自动重启他们,并且产生新的 pod 来替代他们,这些工作就是有 ReplicationController 的资源来进行托管的。

ReplicationController

  下面找了幅图来说明,ReplicationController 旨在创建和管理一个 pod 的多个副本(replica),这就是 ReplicationController 的由来。

 

  在 k8s 中,ReplicationController 的工作就是确保 pod 的数量始终和其标签选择器匹配,如果不匹配则需要适当的“调度”来满足。这里可以想象成 k8s 始终在循环的检查对应的 RepliactionController 资源状态,如果符合 yaml 文件的描述则跳过,如果不满足则进行调度调整。

  在创建 ReplicationController 中,声明 yaml 只需要三个主要的部分:

  • label seoector(标签选择器),用于确定 ReplicationController 作用域中有哪些 pod
  • replica count(副本个数),指定运行的 pod 数量
  • pod template(pod模板),用于创建 pod 副本
  1. apiVersion: v1
  2. kind: ReplicationController
  3. metadata:
  4. name: kubia // ReplicationController 的名字
  5. spec:
  6. replicas: 3
  7. selector:
  8. app: kubia // 确保标签选择器 app=kubia 的pod实例始终只有3个
  9. template:
  10. metadata:
  11. name: kubia
  12. labels:
  13. app: kubia // 这里可以不指定,它会被自动配置,如果指定必须和上面的 selector一致
  14. spec: // 创建新 pod 所用的 pod 模板
  15. containers:
  16. - name: kubia
  17. image: luksa/kubia
  18. ports:
  19. - containerPort: 8080

  相关执行命令

  1. # 创建 ReplicationController
  2. $ kubectl create -f ./kubia-rc.yaml
  3.  
  4. # 查看 rc
  5. $ kubectl get rc
  6.  
  7. # 查看详情
  8. $ kubectl describe rc {ReplicationController名称}
  9.  
  10. # 将pod移入或移出,只需要更改标签即可
  11. $ kubectl label pod {pod名字} {标签名}={标签值} --overwrite
  12.  
  13. ## 这里的标签修改后,与rc的不匹配则会导致 ReplicationController 重新拉起一个 pod,并且这个被修改的pod是完全独立的,并且会一直运行直到你手动删除它
  14.  
  15. # 修改 rc 模板
  16. $ kubectl edit rc {ReplicationController名称}
  17.  
  18. # 扩缩容
  19. $ kubectl scale rc {ReplicationController名称} --replicas={副本数量}
  20.  
  21. # 删除 ReplicationController
  22. $ kubectl delete rc {ReplicationController名称}

ReplicaSet

  ReplicaSet 的功能其实和 ReplicationController 一模一样,但是不同的是 ReplicaSet 对于 pod 的选择器提供更多的语法来进行匹配。

  举个栗子,单纯 ReplicationController 无法将 pod 与标签 env=dev 和 env=prod 的进行同时匹配,但是 ReplicaSet 可以进行同时符合这连个标签的 pod 来进行管理。

  比较简单的选择器 selector.matchLabels

  1. apiVersion: apps/v1beta2
  2. kind: ReplicaSet
  3. metadata:
  4. name: kubia-rs
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: kubia-rs
  9. template:
  10. ....后面和ReplicationController一样

  更复杂的选择器 selector.matchExpressions

  1. selector:
  2. matchExpressions:
  3. - key: app // 此选择器要求该 pod 包含名为"app"的标签,下面则是对 app 这个标签的筛选
  4. operator: In
  5. values:
  6. - kubia-rs

选择器每个表达式必须包含一个 key,和一个 operator 运算符。其中运算符分为:

  1. - InLabel 的值必须与其中一个指定的 values 匹配
  2. - NotIn: Label 的值与任何指定的 values 不匹配
  3. - Exists: pod 必须包含一个指定名称的标签
  4. - DoesNotExist: pod 不得包含有指定名称的标签

在k8s中的控制器和部署服务-ReplicationController和ReplicaSet的更多相关文章

  1. K8S中如何跨namespace 访问服务?为什么ping不通ClusterIP?

    1.K8S中如何跨namespace 访问服务? 2.在Pod中为什么ping不通ClusterIP? 简述: Rancher2.0中的一个用户,在K8S环境中,创建两个namespace,对应用进行 ...

  2. k8s 中 Pod 的控制器

    k8s 中 Pod 的控制器 前言 Replication Controller ReplicaSet Deployment 更新 Deployment 回滚 deployment StatefulS ...

  3. k8s中的dns服务发现

    一.dns服务 1.解决的问题 为了通过服务的名字在集群内进行服务相互访问,需要创建一个dns服务 2.k8s中使用的虚拟dns服务是skydns 二.搭建 1.创建并应用skydns-rc.yaml ...

  4. Kubernetes K8S之资源控制器StatefulSets详解

    Kubernetes的资源控制器StatefulSet详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  5. Kubernetes K8S之资源控制器RC、RS、Deployment详解

    Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...

  6. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  7. Kubernetes K8S之资源控制器Job和CronJob详解

    Kubernetes的资源控制器Job和CronJob详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  8. Docker & k8s 系列三:在k8s中部署单个服务实例

    本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例. 在上面的篇幅中,我们了解了docker,并制作.运行了docker镜像,然后将镜像发布至中央仓库了.然后又搭建了本机的k8s环境 ...

  9. Kubernetes之在k8s中部署Java应用

    部署好了k8s以后 部署参考https://www.cnblogs.com/minseo/p/12055731.html 怎么在k8s部署应用 项目迁移到k8s平台是怎样的流程 1,制作镜像 2,控制 ...

  10. 从harbor部署到在k8s中使用

    一.概述 harbor是什么呢?英文单词的意思是:港湾.港湾用来存放集装箱(货物的),而docker的由来正是借鉴了集装箱的原理,所以harbor是用于存放docker的镜像,作为镜像仓库使用.官方的 ...

随机推荐

  1. tsconfig.json在配置文件中找不到任何输入,怎么办?

    摘要:原来在我们创建tsconfig.json文件的时候,VSCode会自动检测当前项目当中是否有TS文件:如果没有的话,就会报这个错提示我们去创建一个文件,再去使用. 本文分享自华为云社区<t ...

  2. vue2升级vue3:Vue Router报错,directly inside <transition> or <keep-a

    vue3 报这个错误: vue-router.mjs:35 [Vue Router warn]: <router-view> can no longer be used directly ...

  3. 处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法

    ​ 开发人员账号到期时,应采取以下步骤处理APP被下架问题: 登录开发者账号. 点击右上角的"账户",选择"续费". 输入信用卡信息,确保使用支持Visa的银行 ...

  4. 大数据 - ClickHouse

    https://clickhouse.com/ 概念 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C++语言编写,主要用于在线分析处理查询( ...

  5. JAVA CRC8

    Java CRC8 /** * CRC-8 * * <table width="400px" border="1" cellpadding="0 ...

  6. OLAP引擎也能实现高性能向量检索,据说QPS高于milvus!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着LLM技术应用及落地,数据库需要提高向量分析以及AI支持能力,向量数据库及向量检索等能力"异军突起& ...

  7. C#开源免费的Blazor图表库

    前言 今天分享一款基于ApexCharts.js封装的.C#开源免费的Blazor图表库:Blazor-ApexCharts. 10款值得推荐的Blazor UI组件库 全面的ASP.NET Core ...

  8. 彻底干掉了Windows的cmd,一个字:爽!

    彻底干掉了Windows的cmd,一个字:爽! 先说一句:Windows下的 cmd 就是垃圾! 习惯了Ubuntu和Mac的Terminal,再去用Windows的 cmd 简直难以忍受. 今天就向 ...

  9. 【JAVA基础】错误捕获try-catch

    错误捕获try-catch 使用BaseController统一管理 项目结构 UserController package com.cy.store.controller; import com.c ...

  10. CodeForces-339B-Xenia and Ringroad (循环队列,水题)

    Xenia lives in a city that has n houses built along the main ringroad. The ringroad houses are numbe ...