Skip to main content

moregeek program

kubernetes之replicaset_梨花海棠的博客-多极客编程

1.什么是ReplicaSet?

  • 1.1ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
  • 1.2在kubernetes环境中,通过RelicaSet这种资源对象就可以为我们实现集群的高可用。ReplicaSet(RS)的主要作用就是为了维持一组Pod副本的运行,保证一定数量的Pod在集群正常运行,RelicaSet Controller会持续监听它控制的这些Pod的运行状态,以及数量,保证应用集群高可用。例如:现在节点有Pod挂掉了,控制器会一直监视Pod的数量,发现少了一个Pod,它会挑选一台合适的节点给我们拉起来,始终维持总数不变。不需要我们手动去处理,系统自己会为我们处理。
  • 1.3ReplicaSet和Deployment联合起来控制无状态应用。ReplicaSet并不是我们直接应该使用的控制器,虽然说它是一个非常重要的基础的控制器。而更加高级的抽象的也是我们使用最多的控制器叫Deployment。借助一到多个ReplicaSet便捷的管理Pod。从某种意义来讲,Deployment是ReplicaSet控制器。Deployment控制器在定义的时候却不定义与Replicaset有任何关系。定义的所有内容都是Pod模板。Pod副本之类的。也就对用户而言,即便我们使用Deployment控制器,用户即便使用的是ReplicaSet控制器,用户对中间的Replicaset甚至无从感知的。
    正确的管理方式是Deployment->ReplicaSet->Pod。
  • 1.4官方文档:​​https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/​

2.RepliicaSet的组成部分

2.1 ReplicaSet控制器包含了3个基本的组成部分;

1.Selector:标签选择器,匹配并关联Pod对象,并加入控制器的管理;

2.Replicas:期望的副本数,期望在集群所运行的Pod的数量;

3.template:Pod模板,其实就是Pod的规范,相当于把一个Pod的描述以模板嵌套进了ReplicaSet;

3.ReplicaSet的资源规范

ReplicaSet配置文件示例:
apiVersion: apps/v1 # 所在群组是apps/v1群组和Deployment一样;
kind: ReplicaSet # 资源类型为ReplicaSet;
metadata:
name: # Pod的名称;
namespace: # Pod所在的Namespace,默认是Default;
spec:
minReadySeconds <integer> # Pod就绪后多少秒内任一容器无Crash方可视为"就绪"
replicas <integer> # 期望的Pod副本数,默认为1。如果期望Pod的副本数增加,只需要更改replicas的数字即可。如果你写2个,创建的Pod就是根据Template定义的规范去运行起来的。Pod启动后就会被我们标签选择器所管理,进而被我们RS所管理。
selector: # 这里的标签选择器与Service的标签选择器是不一样的,不是选择器的功能不一样,而是选择器的格式不同;
matchExpressions <[]Object>
matchLabels <map[string]string>
template: # 定义Pod的模板,用来描述Pod的详情;比如定义Containers、Images、Resoucre、Lifecycle,把它做成一个模板。
metadata:
labels: # 定义Pod的标签,
spec:

4.RelicaSet配置示例

root@kubernetes-master01:~# cat nginx-test-replicas.yaml 
apiVersion: apps/v1 # API版本
kind: ReplicaSet # 资源类型
metadata:
name: nginx-rs # RS控制器名称
namespace: default # 名称空间
spec: # 定义RS规范
replicas: 2 # 定义的副本数,如果我们觉得副本数量太小,可以在这里定义副本数,也可以通过命令的方式来扩缩容。
minReadySeconds: 20 # Pod就绪后多少秒内任一容器无Crash方可视为"就绪"
selector: # 标签选择器
matchLabels:
app: nginx-test
template: # Pod的模板
metadata:
labels:
app: nginx-test # 标签匹配上面的Selector
spec:
containers: # 定义容器
- name: nginx # Containers Name
image: nginx # Containers Images
ports: # 定义容器的端口
- name: http
containerPort: 80 # 容器的端口为80

# 创建Pod
root@kubernetes-master01:~# kubectl apply -f nginx-test-replicas.yaml
replicaset.apps/nginx-rs created

# 这两个副本都能提供服务且是相同的服务。
root@kubernetes-master01:~# kubectl get pods -l app=nginx-test
NAME READY STATUS RESTARTS AGE
nginx-rs-542db 1/1 Running 0 2m1s
nginx-rs-hcxh9 1/1 Running 0 2m1s

# ReplicaSet可以简写为rs,写replicaset或者rs都可以。
root@kubernetes-master01:~# kubectl get rs nginx-rs
NAME DESIRED CURRENT READY AGE
nginx-rs 2 2 2 85s
# DESIRED:期望是2个Pod
# CURRENT:正常运行是2个
# READY: 正在运行是2个
# AGE:运行时间

# 如果我把某一个Pod删除以后,控制器是自己会创建Pod的。ReplicaSet会始终维持与我们所期望的副本数保持一致;
root@kubernetes-master01:~# kubectl delete pods nginx-rs-hcxh9
pod "nginx-rs-hcxh9" deleted

# 可以发现一个已经重建。或者通过describe来查看
root@kubernetes-master01:~# kubectl get pods -l app=nginx-test
NAME READY STATUS RESTARTS AGE
nginx-rs-542db 1/1 Running 0 7m32s
nginx-rs-n8995 1/1 Running 0 5s

# 我们也可以通过describe RS来查看我们Pod被重建的信息,通过Events可以看到一个Pod被重建n8995;
root@kubernetes-master01:~# kubectl describe rs nginx-rs
Name: nginx-rs
Namespace: default
Selector: app=nginx-test
Labels: <none>
Annotations: <none>
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=nginx-test
Containers:
nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 56m replicaset-controller Created pod: nginx-rs-542db
Normal SuccessfulCreate 56m replicaset-controller Created pod: nginx-rs-hcxh9
Normal SuccessfulCreate 48m replicaset-controller Created pod: nginx-rs-n8995

# 提供正常的访问是没有问题的。
root@kubernetes-master01:~# curl 10.244.4.133
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


我们一直奔跑在进步的旅途

©著作权归作者所有:来自51CTO博客作者潇湘海棠的原创作品,请联系作者获取转载授权,否则将追究法律责任

serverless之knative(一)_梨花海棠的博客-多极客编程

1.knative是什么?1.Knative是Google2018的Google Cloud Next大会上发布的一款基于kubernetes的Serverless框架。Knative 最初由 Google 打造,现在有 50 多家不同公司向其贡献过代码。它提供了一组必备组件,用于在 Kubernetes 上构建和运行无服务器应用。Knative 为 Kubernetes 上的云原生应用提供缩减至

serverless之knative1.6安装(二)_梨花海棠的博客-多极客编程

官方部署文档: https://knative.dev/v1.6-docs/install/yaml-install/serving/install-serving-with-yaml/#prerequisites GitHub地址: https://github.com/knative/docs 在安装Knative之前,必须有一个K8s集群且版本是在1.22以上。否则无法安装knative。K

requestbody注解_wx61ee58d59725e的博客-多极客编程

requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容。1、RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象,需要注意的是传入数据的属性名称要和后端javabean中定义的一致,发送请求后可以看到在控制台中我们通过javabean对象的get方法打印出了前端传来的

极速安装和体验k8s(minikube)_github.com/zq2599的博客-多极客编程

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 c如果您想快速搭建k8s环境进行学习和开发,可以通过Docker快速完成Minikube(单节点的k8s)的部署,通过Minikube体验各类K8S的基础服务; 版本信息 以下是本次实战的环境信息,Windows环境下的docker也可以

mockserver集群化_wx61ee58d59725e的博客-多极客编程

MockServer 支持非常高的请求吞吐量,但是如果需要更高的每秒请求速率,则可以将 MockServer 集群化,以便所有节点共享期望。MockServer 的构建是为了支持单个实例的大规模:Apache Benchmark 测试了多达 6,000 个并行客户端,显示 MockServer 平均为 1.58 毫秒,p99 为 4 毫秒,150 个并行客户端每秒发送 95,228 个请求Locu

干货分享|使用 istio 实现灰度发布_rainbond的博客-多极客编程

Kubernetes 作为基础平台,提供了强大的容器编排能力。但是在其上部署业务和服务治理上,仍然会面对一些复杂性和局限性。在服务治理上,已经有许多成熟的 ServiceMesh 框架用于扩充其能力,如 Istio、Linkerd、Dapr 等。本文将主要介绍如何使用 Istio 扩充 Kubernetes 灰度发布的能力。 而在部署上,则会利用开源项目 Rainbond 作为基础平台来进行实践。

serverless之knative(一)_梨花海棠的博客-多极客编程

1.knative是什么?1.Knative是Google2018的Google Cloud Next大会上发布的一款基于kubernetes的Serverless框架。Knative 最初由 Google 打造,现在有 50 多家不同公司向其贡献过代码。它提供了一组必备组件,用于在 Kubernetes 上构建和运行无服务器应用。Knative 为 Kubernetes 上的云原生应用提供缩减至

serverless之knative1.6安装(二)_梨花海棠的博客-多极客编程

官方部署文档: https://knative.dev/v1.6-docs/install/yaml-install/serving/install-serving-with-yaml/#prerequisites GitHub地址: https://github.com/knative/docs 在安装Knative之前,必须有一个K8s集群且版本是在1.22以上。否则无法安装knative。K

nebulagraph 的云产品交付实践_mb6220302e2eb41的博客-多极客编程

作者:乔雷,Vesoft.Inc 云原生技术专家NebulaGraph 介绍NebulaGraph 是由杭州悦数科技有限公司自主研发的一款开源分布式图数据库产品,擅长处理千亿节点万亿条边的超大数据集,同时保持毫秒级查询延时。得益于其 shared-nothing 以及存储与计算分离的架构设计,NebulaGraph 具备在线水平扩缩容能力;原生分布式架构,使用 Raft 协议保证数据一致性,确保集

极速安装和体验k8s(minikube)_github.com/zq2599的博客-多极客编程

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 c如果您想快速搭建k8s环境进行学习和开发,可以通过Docker快速完成Minikube(单节点的k8s)的部署,通过Minikube体验各类K8S的基础服务; 版本信息 以下是本次实战的环境信息,Windows环境下的docker也可以

干货分享|使用 istio 实现灰度发布_rainbond的博客-多极客编程

Kubernetes 作为基础平台,提供了强大的容器编排能力。但是在其上部署业务和服务治理上,仍然会面对一些复杂性和局限性。在服务治理上,已经有许多成熟的 ServiceMesh 框架用于扩充其能力,如 Istio、Linkerd、Dapr 等。本文将主要介绍如何使用 Istio 扩充 Kubernetes 灰度发布的能力。 而在部署上,则会利用开源项目 Rainbond 作为基础平台来进行实践。

基于 coredns 和 k8s 构建云原生场景下的企业级 dns_mb6220302e2eb41的博客-多极客编程

容器作为近些年最火热的后端技术,加快了很多企业的数字化转型进程。目前的企业,不是在使用云原生技术,就是在转向云原生技术的过程中。在容器化进程中,如何保持业务的平稳迁移,如何将现有的一些服务设施一并进行容器化迁移,也是众多企业较为关注的点。以 DNS 为例,如何构建一个云原生的企业 DNS 系统?CoreDNS 简介CoreDNS 是一个 Go 语言编写的灵活可扩展的 DNS 服务器,在 Kuber