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 副本
apiVersion: v1
kind: ReplicationController
metadata:
name: kubia // ReplicationController 的名字
spec:
replicas: 3
selector:
app: kubia // 确保标签选择器 app=kubia 的pod实例始终只有3个
template:
metadata:
name: kubia
labels:
app: kubia // 这里可以不指定,它会被自动配置,如果指定必须和上面的 selector一致
spec: // 创建新 pod 所用的 pod 模板
containers:
- name: kubia
image: luksa/kubia
ports:
- containerPort: 8080

  相关执行命令

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

ReplicaSet

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

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

  比较简单的选择器 selector.matchLabels

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
name: kubia-rs
spec:
selector:
matchLabels:
app: kubia-rs
template:
....后面和ReplicationController一样

  更复杂的选择器 selector.matchExpressions

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

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

- In:Label 的值必须与其中一个指定的 values 匹配
- NotIn: Label 的值与任何指定的 values 不匹配
- Exists: pod 必须包含一个指定名称的标签
- 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. 云小课|聊一聊DRS的数据过滤特性

    [本期推荐专题]在DevOps市场中,华为云DevCloud拔得头筹,看它如何助力企业面对商业环境瞬息万变快速响应. [摘要] 目前,DRS已支持其他云.本地IDC.ECS自建MySQL.SQL Se ...

  2. Java编程中忽略这些细节,Bug肯定找上你

    摘要:在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. 本文分享自华为云社区<Java编程中容易忽略的细节总结丨[奔跑吧!JAVA]>,作者:j ...

  3. JavaScript继承的实现方式:原型语言对象继承对象原理剖析

    面向对象编程:继承.封装.多态. 对象的继承:A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 在经典的面向对象语言中,您可能倾向于定义类对象,然后您 ...

  4. CIO们开始将软件供应链升级为安全优先级top

    开源之所以在软件开发中大量使用的原因是它提供了经过良好测试的构建块,可以加速复杂应用程序和服务的创建.但是第三方软件组件以及包和容器的便利性同时也带来了风险--软件供应链攻击. 软件供应链攻击日益普遍 ...

  5. Tomcat--隐藏版本号

    为何要隐藏版本号: tomcat默认报错页面信息会暴露出版本号 如果tomcat的版本号暴露出来,会有人利用该版本所存在的漏洞进行攻击,系统存在一定的风险,所以要对tomcat的版本号进行隐藏或者删除 ...

  6. AcWing 第 2 场周赛

    比赛链接:Here AcWing 3626. 三元一次方程 暴力即可 void solve() { int n; cin >> n; for (int i = 0; i <= n / ...

  7. 蓝桥杯历年省赛试题汇总 C/C++ A组

    A组 省赛 B 组的题目可以在这里查看 → 刷题笔记: 蓝桥杯 题目提交网站:Here 2013 第四届 高斯日记 排它平方数 振兴中华 颠倒的价牌 前缀判断 逆波兰表达式 错误票据 买不到的数目 剪 ...

  8. Codeforces Round #689 (Div. 2, based on Zed Code Competition) 个人题解

    1461A. String Generation void solve() { int n, k; cin >> n >> k; for (int i = 1; i <= ...

  9. 浏览器,navicat,IDEA--快捷键

    mysql快捷键:ctrl+r 运行查询窗口的sql语句ctrl+shift+r 只运行选中的sql语句ctrl+q 打开一个新的查询窗口ctrl+w 关闭一个查询窗口ctrl+/ 注释sql语句 c ...

  10. yakit的web fuzzer功能的使用

    问题 yakit没有Burp 的 Intruder 爆破模块,那么yakit该怎么进行参数爆破?yakit参数爆破的方式与burp有什么区别? 前言 手工测试场景中需要渗透人员对报文进行反复的发送畸形 ...