Label
Kubernetes使用Label的键值对来标识附加到系统中的各种API(Pod、Service、Replication Controller 等)
每个API可以有多个Label,但是每个Label的Key只能是唯一的值。
相应地LabelSelect 则是针对匹配对象的标签进行查询。Label和LabelSelect是K8s主要的分组机制
如果有多个标签,LabelSelect可以根据AND来多个Label eg. LabelSelect: iter=back-end AND release=product
Replication Controller 和 Replica Set
Kubernetes提供Replication Controller(简称RC)来管理Pod,RC确保任何时候K8s集群中有指定数量的Pod副本在运行。
如果少于指定数量的Pod副本,RC会启动新的Pod,反之会杀死多余的Pod,保证Pod副本数量。
Replica Set是RC升级版,确保Label Selector匹配的Pod数量维持在期望值。
#kubectl create -f replicationController.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: test-pod
spec:
replicas: 2
selector:
app:testpod
template:
metadata:
label:
app: testpod
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
#kubectl create -f ReplicaSet.yml
apiVersion: v1
kind: ReplicaSet
metadata:
name: test-pod
spec:
replicas: 2
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
template:
metadata:
label:
app: guestbook
tier: frontend
spec:
containers:
- name: redis
image: redis
resources:
request:
cpu: 100m
memory: 100Mi
env:
- name: HOST
value:0.0.0.0
ports:
- containerPort: 80
Horizontal Pod AutoScaler
自动弹性扩展一直是一个热点问题,系统可根据应用负载变化而自动增加或者减少计算资源。RC可以方便实现Pod的弹性伸缩,在此基础上K8s平台获取监控POD的各项资源监控指标,就可以实现自动弹性伸缩功能。既基于POD资源使用情况,根据配置策略自动调整Pod的副本数。自动弹性伸缩功能分为两种,一种是水平扩展,针对Pod实例数目增减,一种是垂直扩展,既增加单个实例可以使用的资源增减。HA属于前者。
HA操作对象有RC、Deployment、Replica Set对应的Pod
#kubectl create -f ha.yml
apiVersion: extensions/vibetal
kind: HorizontalPodAutoscaler
metadata:
name: nginx
namespace: default
spec:
scaleRef:
kind:ReplicationController
name: nginx
subresoures: scaleRef
minReplicas: 1
maxReplicas: 8
cunUtilzation:
targetPercerntage: 80
Deployment
Kubernetes提供了一个更加简单的更新RC和Pod的机制,通过Deployment中的描述期望的集群状态,Deployment Controller 会将现在的集群状态在一个可控的速度下逐步更新成期望的集群转态。
Deployment的主要职责是同样是为了保证Pod的数量和健康,绝大多数的功能和Replication Controller完全一样。但是具备了和RC没有的新特性.
- 事件转态查看:可以查看升级的详细进度和状态。
- 回滚:当升级Pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚道上一个稳定的版本或者指定的版本。
- 版本记录:每一次对Deployment的操作都能保存下来,给予后续可能的回滚使用。
- 暂停和启动:对于每一次升级,都能够随时暂停和启动。
- 多张升级方案:
- Recreate----删除所有已保存的Pod,重新创建新的。
- RollingUpdate----滚动升级,既逐步替换的策略。滚动升级是支持更多的附加参数
相比于RC,Deployment直接使用kubectl edit deployment/deploymentName 或者kubectl set方法就可以直接升级。
#kubectl create -f deployment.yml
#kubectl create -f deployment.yml --record
#kubectl get -f deployments
#kubectl set image deployment/deploynginx2 nginx=nginx:1.0
#kubectl edit deployment/deploynginx2
apiVersion: extensions/vibetal
kind: Deployment
metadata:
name: deploynginx
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image:nginx:latest
ports:
- containerPort: 80
#deployment常用命令
#kubectl describe deployments #查询详细信息,获取升级进度
#kubectl rollout pause deployment/deploynginx #暂停升级
#kubectl rollout resume deployment/deploynginx #继续升级
#kubectl rollout undo deployment/deploynginx #升级回滚
#kubectl scale deployment/deploynginx --replicas 8 #弹性伸缩Pod数量
Job
从程序的运行形态来说,Pod分为两类,长时间运行服务和一次性的任务,RC创建的Pod是长时间运行的服务,而Job创建的Pod是一次性任务
#kubectl create -f Job.yml
apiVersion: extensions/vibetal
kind: Job
metadata:
name: Ubuntu
spec:
Completions: 1
Parallelism: 1
selector:
matchLables:
app: long-task
template:
metadata:
name: long-task
labels:
app: long-task
spec:
containers:
- name: Ubuntu
image:Ubuntu:latest
ports:
command: ["xxxxx"]