1.控制器概述
1.ReplicationController 和 ReplicaSet 详解
缩写可以 rc 和 rs
创建 1.rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
spec:
replicas: 3
selector:
app: rc-demo
template:
metadata:
labels:
app: rc-demo
spec:
containers:
- name: rc-demo-container
image: wangyanglinux/myapp:v1.0
env:
- name: GET_HOSTS_FROM
value: dns
- name: zhangsan
value: "123"
ports:
- containerPort: 80
类别写的是 RC
不清楚可以执行下面命令
kubectl explain rc
metadata 下面起了rc的名字
spec 起了 RC 的规格
1.replicas 定义当前的副本数量
上面定义的是3
pod的数量
2.selector 选择器
匹配的 app:rc-demo
具有app:rc-demo 标签的pod 被我管理
3.template 创建 pod 怎么创建 由他定义
就是怎么创建pod的相关信息
1.metadata
label 定义pod的标签
app:rc-demo
必须是选择器的子集合才可以
当前选择不是子集合就会报错
2.spec pod规格
1.containers 容器组
1.name容器名
2.image 镜像
3.env 环境变量
4.端口映射
kubectl create -f 1.rc.yaml
kubectl get rc
最重要特性
保证副本值与期望值一致
他只会根据你服务器的有限资源尽量去尝试满足
pod 内部容器损坏 和 pod直接没了 是两个概念
pod 内部容器损坏会根据重启策略 重启内部容器
如果pod直接没了 那么就要靠我们的RC 去重建一个 pod
4.RC是根据 selector 选择器的标签是某个pod的子集来选中pod
1.给pod添加标签
kubectl label pod [pod名] [标签key]=[标签值]
kubectl label pod rc-demo-967m7 version=v1
我们发现我们pod数量没有创建新的也没有减少,说明就是子集来选中的
2.给pod修改标签
kubectl label pod [pod名] [想要修改标签的key]=[想要修改标签的值] --overwrite
kubectl label pod rc-demo-scrc7 app=jmj --overwrite
RC又创建了一个新的pod
我们又改回去 发现pod又被控制回三个了
优先选择离现在时间最靠近的一个容器 删除
因为运行时间旧的pod 产生更多的数据 给用户连接的数量越多
5.调整RC 副本的数量
kubectl scale rc [rc名字] --replicas=[数量]
kubectl scale rc rc-demo --replicas=10
保证当前的pod 数量 与 期望值一致
新版本用RS取代 RC
ReplicaSet
2.RS控制器
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-ml-demo
spec:
replicas: 3
selector:
matchLabels:
app: rs-ml-demo
domain: jmj
template:
metadata:
labels:
app: rs-ml-demo
domain: jmj
version: v1
spec:
containers:
- name: rs-ml-demo-container
image: wangyanglinux/myapp:v1.0
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
matchLabels
那我们的标签内容与pod做子集运算 如果是子集 则匹配
删除也能自动恢复
1.用匹配表达式匹配标签
- In:label 的值在某个列表中
- NotIn:label 的值不在某个列表中
-
Exists:某个 label 存在
-
DoesNotExist:某个 label 不存在
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-exists-demo
spec:
selector:
matchExpressions:
- key: app
operator: Exists
template:
metadata:
labels:
app: spring-k8s
spec:
containers:
- name: rs-me-exists-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
没定义副本数量 默认是 1
2.kubernetes 特殊机制
- 必须是我控制器创建的pod 才会被我管理
- 我的标签还要是被我创建标签的子集
- 才会控制管理这些副本pod
这里不全对,控制器创建时,会接管符合标签的 Pod,把它算作副本,前提是该 Pod 没被其他控制器接管。
kubectl label pod rs-me-exists-demo-r5jxv app=jmj --overwrite
但是我们的rs控制器并没有创建新的pod出来,说明匹配了key
3.不用子集匹配创建pod 就会报错
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-in-demo
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
template:
metadata:
labels:
app: sg-k8s
spec:
containers:
- name: rs-me-in-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
如果不报错 ,那么就会无线创建 BUG
所以新版本就会报错
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-me-in-demo
spec:
selector:
matchExpressions:
- key: app
operator: In
values:
- spring-k8s
- hahahah
template:
metadata:
labels:
app: hahahah
spec:
containers:
- name: rs-me-in-demo-container
image: wangyanglinux/myapp:v1.0
ports:
- containerPort: 80
有一个东西隐含很重要
因为这个pod被RS抛弃了,变成了孤儿Pod,所以就会被其他RS控制器接管
通过标签匹配可以对不同的 service 提供给用户 做负载均衡
3.清空实验资源
清楚RC
kubectl delete rc --all
清楚RS
kubectl delete rs --all