kubernetes 核心技术-Label
1、Label 概述
Label 是 Kubernetes 系统中另一个核心概念。一个 Label 是一个 key=value 的键值对,其
中 key 与 value 由用户自己指 定。Label 可以附加到各种资源对象上,如 Node、Pod、
Service、RC,一个资源对象可以定义任意数量的 Label, 同一个 Label 也可以被添加到
任意数量的资源对象上,Label 通常在资源对象定义时确定,也可以在对象创建后动态 添
加或删除。
Label 的最常见的用法是使用 metadata.labels 字段,来为对象添加 Label,通过
spec.selector 来引用对象
2、Label 示例
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
-------------------------------------
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 3333
selector:
app: nginx
Label 附加到 Kubernetes 集群中各种资源对象上,目的就是对这些资源对象进行分组管理,
而分组管理的核心就 是 Label Selector。Label 与 Label Selector 都是不能单独定义,
必须附加在一些资源对象的定义文件上,一般附加 在 RC 和 Service 的资源定义文件中
kubernetes 核心技术-Controller 控制器
1、Replication Controller
Replication Controller(RC)是 Kubernetes 系统中核心概念之一,当我们定义了一个 RC
并提交到 Kubernetes 集群中以后,Master 节点上的 Controller Manager 组件就得到通知,
定期检查系统中存活的 Pod,并确保目标 Pod 实例的数量刚好等于 RC 的预期值,如果有过
多或过少的 Pod 运行,系统就会停掉或创建一些 Pod.此外我们也可以通过修改 RC 的副本
数量,来实现 Pod 的动态缩放功能。
kubectl scale rc nginx --replicas=5
由于 Replication Controller 与 Kubernetes 代码中的模块 Replication Controller 同名,
所以在 Kubernetes v1.2 时, 它就升级成了另外一个新的概念 Replica Sets,官方解释为
下一代的 RC,它与 RC 区别是:Replica Sets 支援基于集合的 Label selector,而 RC 只支
持基于等式的 Label Selector。我们很少单独使用 Replica Set,它主要被 Deployment 这
个更高层面的资源对象所使用,从而形成一整套 Pod 创建、删除、更新的编排机制。最好
不要越过 RC 直接创建 Pod, 因为 Replication Controller 会通过 RC 管理 Pod 副本,实
现自动创建、补足、替换、删除 Pod 副本,这样就能提高应用的容灾能力,减少由于节点
崩溃等意外状况造成的损失。即使应用程序只有一个 Pod 副本,也强烈建议使用 RC 来 定
义 Pod
2、Replica Set
ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且
ReplicaSet 支持集合式的 selector(ReplicationController 仅支持等式)。
Kubernetes 官方强烈建议避免直接使用 ReplicaSet,而应该通过 Deployment 来创建 RS 和
Pod。由于 ReplicaSet 是 ReplicationController 的代替物,因此用法基本相同,唯一的
区别在于 ReplicaSet 支持集合式的 selector。
3、Deployment
Deployment 是 Kubenetes v1.2 引入的新概念,引入的目的是为了更好的解决 Pod 的编排
问题,Deployment 内部使用了 Replica Set 来实现。Deployment 的定义与 Replica Set 的
定义很类似,除了 API 声明与 Kind 类型有所区别:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 1
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
template:
metadata:
labels:
app: app-demo
tier: frontend
spec:
containers:
- name: tomcat-demo
image: tomcat
ports:
- containerPort: 8080
4、Horizontal Pod Autoscaler
Horizontal Pod Autoscal(Pod 横向扩容 简称 HPA)与 RC、Deployment 一样,也属于一种
Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是
否需要针对性地调整目标 Pod 的副本数,这是 HPA 的 实现原理。
Kubernetes 对 Pod 扩容与缩容提供了手动和自动两种模式,手动模式通过 kubectl scale
命令对一个 Deployment/RC 进行 Pod 副本数量的设置。自动模式则需要用户根据某个性能
指标或者自定义业务指标,并指定 Pod 副本数量的范围,系统将自动在这个范围内根据性
能指标的变化进行调整。
(1)手动扩容和缩容
kubectl scale deployment frontend --replicas 1
(2)自动扩容和缩容
HPA 控制器基本 Master 的 kube-controller-manager 服务启动参数 --horizontal-pod-
autoscaler-sync-period 定义的时长(默认值为 30s),周期性地监测 Pod 的 CPU 使用率,
并在满足条件时对 RC 或 Deployment 中的 Pod 副 本数量进行调整,以符合用户定义的平均
Pod CPU 使用率。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: 50m
ports:
- containerPort: 80
-------------------------------
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
selector:
app: nginx
-----------------------------------
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: app/v1beta1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
发布一个应用
生成一个yaml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
创建pod通过web.yaml
kubectl apply -f web.yaml
#查看状态
kubectl get pods
对外暴露端口:
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
版本升级
#设置nginx版本为1.14
vim web.yaml
kubectl apply -f web.yaml
#升级版本号
kubectl set image deployment web nginx=nginx:1.18
#查看升级状态
kubectl rollout status deployment web
回滚
#查看历史版本记录
kubectl rollout history deployment web
#回滚上一个版本
kubectl rollout undo deployment web
#回滚到指定版本
kubectl rollout undo deployment web --to-reversion=2
弹性伸缩
kubectl scale --replicas=10 deployment web