从现在起,你应该始终创建 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
注意:K8S 1.21中ReplicaSet的apiVersion已经变为apps/v1
关于API版本的属性:
- API组(比如该YAML文件中的apps)
- API版本(v1beta2)
某些 Kubernetes 资源位于核心API组中,该组并不需要在apiVersion字段中指定组名(只需要版本——如定义pod资源时使用过的apiVersion: v1)。在后续的Kubernetes版本中引入其他资源,被分为几个API组。
cd /root/k8s/
cat >kubia-replicaset.yaml <<'EOF'
apiVersion: apps/v1 #注意:K8S 1.21中ReplicaSet的apiVersion已经变为apps/v1
kind: ReplicaSet
metadata:
name: kubia
spec:
replicas: 3
selector:
matchLabels:
app: kubia
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: 10.0.0.10:5000/luksa/kubia
ports:
- containerPort: 8080
EOF
kubectl create -f kubia-replicaset.yaml
4.3.3 创建和检查ReplicaSet
4.3.4 使用ReplicaSet的更富表达力的标签选择器
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。