RC作用:
1、确保一个pod(或多个pod副本)持续运行,方法是在现有pod丢失时启动一个新pod
2、集群节点发送故障时,它将故障节点上运行的所有pod创建替代副本(故障迁移)
3、实现pod自动水平伸缩。(手动或者自动)都可以
RC主要分为三部分:
1、label selector (标签选择器)、用于确定RC作用域中有哪些pod
2、replica count (副本个数)、 指定运行的pod数量
3、pod template (pod模板)、 用于创建新的pod副本
RC创建示例: kubia-re.yaml
apiVersion: v1
kind: ReplicationControlier #定义配置为RC
metadata:
name: kubia #rc名称
spec:
replicas: 3 #pod实例数目
selector:
app: kubia #pod选择器,决定了RC的操作对象
template: #
metadata: # 创建新pod所用的pod模板
labels: #
app: kubia #
spec: #
containers: #
- name: kubia #
image: lukasa/kubia #
ports: #
- containerPort: 8080 #
k8s 会创建一个名为kubia的新的rc,它确保符合标签选择器app=kubia的pod实例始终是三个,模板中pod标签必须和
RC的标签选择器匹配,否则控制器将无休止的创建新容器。
注:可以在RC中不指定POD选择器,让K8S在pod 模板中提取。
编写完模板后执行 kubectl create -f kubia-rc.yaml 创建POD
常用命令:
获取RC信息:
kubectl get rc
显示RC详细信息:
kubectl describes rc kubia #显示名为kubia的详细信息
pod迁入或迁出RC的作用域
通过更改pod标签可以将它从RC的作用域中添加或者删除甚至从一个RC迁移到另一个RC中。
给RC管理的pod添加标签:
kubectl label pod kubia-dmdck type=special #给名为kubia-dmdck的容器添加新标签为type=special,原有的标签不会改变。
更改已托管的pod的标签:
kubectl label pod kubia-dmdck app=foo --overwrite #将kubia-dmdck pod标签改为app=foo, --overwrite 参数必须要,否则只打印警告并不会变更。
根据标签查看pod:
kubectl get pods -L app #-L 查看名为app的标签
编辑RC模板:
kebectl edit rc kubia #编辑kubia的配置文件
RC扩容:
kubectl scale rc kubia --relicas=10 #扩容kubia pod副本为10个,扩容和缩减只需改--relicas=N
删除RC:
kubectl delete rc kubia #删除RC的同时,pod也会被删除。
kubectl delete rc kubia --cascade=false #删除RC时 pod不被删除,pod变成独立运行。
replicaSet(rs)与replicationCtontroller (rc)
RS是RC的替代版本,在功能上RS要比RC强大,比如RC无法将pod标签env=production和env=devel标签的pod同时匹配,但RS可以将两组pod视为一个大组。
定义ReplicaSet
apiVersion: apps/v1beta2 #不是v1版本api的一部分,但属于apps api在的v1beta2版本
kind: ReplicaSet #定义配置为RS
metadata:
name: kubia #RS名称
spec:
replicas: 3 #pod实例数目
selector:
matchLabels: #使用了更简单的matchlabels选择器,类似于RC选择器
app: kubia #选择器名称
template: #
metadata: # 该模板与RC中的相同
labels: #
app: kubia #
spec: #
containers: #
- name: kubia #
image: lukasa/kubia #
ports: #
- containerPort: 8080 #
需要注意,RS不在是v1 API的一部分,在创建资源的时候指定正确的apiVersion,RS 与RC的内容大致相同,唯一不同的就是不必在selector属性中直接列出pod需要的标签,而是在
selector.matchLabels下指定。
显示RS信息:
kubectl get rs
kubectl describe rs
使用RS matchExpressions 更强大的选择器。
示例:
selector:
matchExpressions:
- key: app #此选择要求该pod名为"app"的标签
operator: In
values:
- kubia #标签的值必须是 "kubia"
可以给选择器添加额外的表达式,例如每个表达式必须包含一个key一个operator(运算符),并且可能还有一个values的列表(取决于运算符)
常见四个运算符:
In: Label的值必须与妻子一个指定的values匹配
NotIn: Label的值与任何指定的values匹配
Exists: POD必须包含一个指定的名称的标签(值不重要)使用此运算符时,不应指定values字段。
DoesNotExist: pod不得包含指定名称的标签。
daemonset 在每个节点上运行一个pod
daemonset将pod部署到集群中的所有节点上,除非指定这些pod只在部分节点运行,通过pod模板中的nodeSelector属性指定。
示例:
创建一个daemonset 部署在标记为disk: ssd的node节点上。
apiVersion: apps/v1beta2 #Daemonset 在apps的api组中,版本是v1beta2
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector: #pod模板中包含一个节点选择器,会选择有disk=ssd标签
disk: ssd #的节点。
containers:
- name: main
image: luksa/ssd-monitor
kubectl create -f ssd-monitor-daemonset.yaml #创建daemon pod
kubectl get ds #查看daemonset
如果创建后 ssd-monitor pod 显示为0 执行kubectl get po 查看是否有pod
kubectl get node #查看node节点是否有 disk: ssd 标签
kubectl label node minikube(node名称) disk=ssd #给节点添加标签
变更node节点标签:
kubectl label node minikube disk=hdd --overwrite