从现在起,你应该始终创建 ReplicaSet 而不是 ReplicationController(最终将被弃用)。 它们几乎完全相同,所以你不会碰到任何麻烦。你通常不会直接创建它们, 而是在创建更高层级的 Deployment 资源时自动创建它们。

4.3.1 比较ReplicaSet 和 ReplicationController

ReplicaSet 的行为与ReplicationController 完全相同, 但pod 选择器的表达能力更强(使用matchLabels字段)。虽然ReplicationController 的标签选择器只允许匹配包含某个标签的 pod, 但ReplicaSet 的选择器还允许匹配缺少某个标签的 pod, 或包含特定标签 key的 pod, 不管其值如何。

举个例子:

ReplicationController可以匹配的标签 ReplicaSet可以匹配的标签
使用selector字段 使用selector.matchLabels
selector.matchExpressions字段
env=production 或 env=devel(两者之一) env=production 和 env=devel

基于label key,如env

ReplicationController无法将pod与标签 env=production 和 env=devel 同时匹配,它只能匹配其中一个标签的pod。但是RepliaSet可以匹配两组pod并将它们视为一个大组。
ReplicationController 无法仅基于label key来匹配 pod, 而ReplicaSet 则可以。 (可以理解为env=*)

4.3.2 定义ReplicaSet

创建一个ReplicaSet资源,接管上一篇中删除rc后保留下来的pod
image.png
注意:K8S 1.21中ReplicaSet的apiVersion已经变为apps/v1

关于API版本的属性:

  • API组(比如该YAML文件中的apps)
  • API版本(v1beta2)

某些 Kubernetes 资源位于核心API组中,该组并不需要在apiVersion字段中指定组名(只需要版本——如定义pod资源时使用过的apiVersion: v1)。在后续的Kubernetes版本中引入其他资源,被分为几个API组。

  1. cd /root/k8s/
  2. cat >kubia-replicaset.yaml <<'EOF'
  3. apiVersion: apps/v1 #注意:K8S 1.21中ReplicaSet的apiVersion已经变为apps/v1
  4. kind: ReplicaSet
  5. metadata:
  6. name: kubia
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: kubia
  12. template:
  13. metadata:
  14. labels:
  15. app: kubia
  16. spec:
  17. containers:
  18. - name: kubia
  19. image: 10.0.0.10:5000/luksa/kubia
  20. ports:
  21. - containerPort: 8080
  22. EOF
  23. kubectl create -f kubia-replicaset.yaml

4.3.3 创建和检查ReplicaSet

image.png

4.3.4 使用ReplicaSet的更富表达力的标签选择器

image.png
matchExpressions的四种operator(运算符)

  • In—Label’s value must match one of the specified values.
  • NotIn—Label’s value must not match any of the specified values.
  • Exists—Pod must include a label with the specified key. 不能指定values字符。
  • DoesNotExist—Pod must not include a label with the specified key. 不能指定values字符。

如果你指定了多个表达式,则所有这些表达式都必须为 true 才能使选择器与 pod 匹配。
如果同时指定 matchLabels 和 matchExpressions,则所有标签都必做匹配,并且所有表达式必须为 true 才能使选择器与 pod 匹配。

4.3.5 ReplicaSet小结

请记住,你始终应该使用 ReplicaSet 来代替 ReplicationController。

Usage:

删除 ReplicaSet kubia(将同时删除它管理的pod)
kubectl delete rs kubia