目录
一、概述
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。
典型的应用场景包括:
定义Deployment来创建Pod和ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续Deployment更新
Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。
这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。
二、YAML文件详解
apiVersion: apps/v1 #接口版本
kind: Deployment #接口类型
metadata:
name: cango-demo #Deployment名称
namespace: cango-prd #命名空间
labels:
app: cango-demo #标签
spec:
replicas: 3
selector:
matchLabels:
app: cango-demo #匹配模板中label
strategy:
rollingUpdate: ##由于replicas为3,则整个升级,pod个数在2-4个之间
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
template:
metadata:
labels:
app: cango-demo #模板名称必填
sepc: #定义容器模板,该模板可以包含多个容器
containers:
- name: cango-demo1 #镜像名称
image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #镜像地址
command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #启动命令
args: #启动参数
- '-storage.local.retention=$(STORAGE_RETENTION)'
- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
- '-config.file=/etc/prometheus/prometheus.yml'
- '-alertmanager.url=http://alertmanager:9093/alertmanager'
- '-web.external-url=$(EXTERNAL_URL)'
#如果command和args均没有写,那么用Docker默认的配置。
#如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。
#如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。
#如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。
imagePullPolicy: IfNotPresent #如果不存在则拉取
livenessProbe: #表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;
httpGet:
path: /health #如果没有心跳检测接口就为/
port: 8080
scheme: HTTP
initialDelaySeconds: 60 ##启动后延时多久开始运行检测
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /health #如果没有心跳检测接口就为/
port: 8080
scheme: HTTP
initialDelaySeconds: 30 ##启动后延时多久开始运行检测
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
resources: ##CPU内存限制
requests:
cpu: 2
memory: 2048Mi
limits:
cpu: 2
memory: 2048Mi
env: ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量
- name: LOCAL_KEY #本地Key
value: value
- name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,
valueFrom:
configMapKeyRef:
name: special-config #configmap中找到name为special-config
key: special.type #找到name为special-config里data下的key
ports:
- name: http
containerPort: 8080 #对service暴露端口
volumeMounts: #挂载volumes中定义的磁盘
- name: log-cache
mountPath: /tmp/log
- name: sdb #普通用法,该卷跟随容器销毁,挂载一个目录
mountPath: /data/media
- name: nfs-client-root #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfs
mountPath: /mnt/nfs
- name: example-volume-config #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。
mountPath: /etc/config
- name: rbd-pvc #高级用法第2中,挂载PVC(PresistentVolumeClaim)
#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,
volumes: # 定义磁盘给上面volumeMounts挂载
- name: log-cache
emptyDir: {}
- name: sdb #挂载宿主机上面的目录
hostPath:
path: /any/path/it/will/be/replaced
- name: example-volume-config # 供ConfigMap文件内容到指定路径使用
configMap:
name: example-volume-config #ConfigMap中名称
items:
- key: log-script #ConfigMap中的Key
path: path/to/log-script #指定目录下的一个相对路径path/to/log-script
- key: backup-script #ConfigMap中的Key
path: path/to/backup-script #指定目录下的一个相对路径path/to/backup-script
- name: nfs-client-root #供挂载NFS存储类型
nfs:
server: 10.42.0.55 #NFS服务器地址
path: /opt/public #showmount -e 看一下路径
- name: rbd-pvc #挂载PVC磁盘
persistentVolumeClaim:
claimName: rbd-pvc1 #挂载已经申请的pvc磁盘
三、企业应用案例
3.1 环境准备
创建my-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 3
selector:
matchLabels:
app: myapp-blue #匹配模板中label
template:
metadata:
labels:
app: myapp-blue
spec:
containers:
- name: myapp-blue
image: janakiramm/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
创建访问service my-blue-service.yaml
apiVersion: v1
kind: Service
metadata:
name: service-blue
spec:
selector:
app: myapp-blue
type: NodePort
ports:
- port: 80
nodePort: 30030
targetPort: 80
提交对应的资源清单
[root@k8s-master01 ~]# kubectl apply -f my-blue.yaml
[root@k8s-master01 ~]# kubectl apply -f my-blue-service.yaml
#查看对应的资源
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mydm-7755b9f55f-7h2nb 1/1 Running 0 69s
mydm-7755b9f55f-bj9gf 1/1 Running 0 69s
mydm-7755b9f55f-hjckc 1/1 Running 0 69s
mydm-7755b9f55f-lfvrd 1/1 Running 0 69s
mydm-7755b9f55f-lxzw4 1/1 Running 0 69s
mydm-7755b9f55f-v74w8 1/1 Running 0 69s
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-blue NodePort 10.10.157.201 <none> 80:30030/TCP 87s
3.2 扩缩容
修改对应的yaml文件中的replicas的数量
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 5
selector:
matchLabels:
app: myapp-blue #匹配模板中label
template:
metadata:
labels:
app: myapp-blue
spec:
containers:
- name: myapp-blue
image: janakiramm/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
3.3 滚动更新
修改对应的yaml文件中的image信息
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydm
spec:
replicas: 3
selector:
matchLabels:
app: myapp-blue #匹配模板中label
template:
metadata:
labels:
app: myapp-blue
spec:
containers:
- name: myapp-blue
image: janakiramm/myapp:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
3.4 回滚
查看历史版本
[root@k8s-master01 ~]# kubectl rollout history deployment name
回滚操作
[root@k8s-master01 ~]# kubectl rollout undo deployment name --to-revision=1
四、自定义更新策略
4.1类型
maxSurge:和期望的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。
maxUnavailable:和期望的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;
4.2 设置方式
按数量
maxUnavailable: [0, 副本数]
maxSurge: [0, 副本数]
注两者不能同时为0。
按比例
maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;
maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;
两者不能同时为0。
4.3 配置案例
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
spec:
replicas: 3
selector:
matchLabels:
app: myapp
version: v1
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: myapp
version: v1
spec:
containers:
- name: myapp
image: janakiramm/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
一、 DaemonSet 概述
DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从 集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod
DaemonSet 工作原理
daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这些被监听的对象之变动,就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象描述的状态进行演进。
Daemonset 典型的应用场景
在集群的每个节点上运行存储,比如:glusterd 或 ceph。 在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat 等。 在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd 等。
DaemonSet 与 Deployment 的区别
Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。
DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。
二、DaemonSet 资源清单文件编写技巧
[root@k8s-master01 ~]# kubectl explain ds
字段 | 作用 |
---|---|
apiVersion | 当前资源使用的 api 版本,跟 VERSION: apps/v1 保持 一致 |
kind | 资源类型,跟 KIND: DaemonSet 保持一致 |
metadata | 元数据,定义 DaemonSet 名字的 |
spec | 定义容器的 |
status | 状态信息,不能改 |
[root@k8s-master01 ~]# kubectl explain ds.spec
字段 | 作用 |
---|---|
minReadySeconds | 当新的 pod 启动几秒种后,再 kill 掉旧的 pod。 |
revisionHistoryLimit | 历史版本 |
selector -required- | 用于匹配 pod 的标签选择器 |
template -required- | 定义 Pod 的模板,基于这个模板定义的所有 pod 是一样的 |
updateStrategy | daemonset 的升级策略 |
[root@k8s-master01 ~]# kubectl explain ds.spec.template
字段 | 作用 |
---|---|
containers | 容器配置列表。每个元素都描述了一个要运行在Pod内的容器。 |
initContainers | 化容器配置列表。这些容器在主容器之前运行,用于设置环境或执行预备工作。 |
ephemeralContainers | 临时容器配置列表。这些容器是临时的,仅在Pod运行时存在。 |
restartPolicy | Pod的重启策略。可以是Always、OnFailure或Never。 |
terminationGracePeriodSeconds | 优雅终止周期,以秒为单位。在强制终止Pod前,系统将等待此周期内的终止。 |
activeDeadlineSeconds | Pod活动的截止时间,超过此时间系统将杀死Pod。 |
dnsPolicy | Pod的DNS策略,可以是ClusterFirst、ClusterFirstWithHostNet、Default或None。 |
Context | Pod的安全上下文,用于设置Pod的安全相关属性,如RBAC规则、SELinux标签等。 |
schedulerName | 调度器名称,用于指定用于调度Pod的特定调度器。 |
tolerations | Pod容忍的污点,用于允许Pod调度到有特定污点的节点上。 |
affinity | Pod的亲和性设置,用于指定Pod偏好或必须运行的节点属性。 |
hostNetwork | 如果设置为true,P将使用主机的网络命名空间。 |
imagePullSecrets | 用于获取镜像的密钥,这些密钥会被注入到Pod中。 |
configMap | ConfigMap的名称和键值对列表,用于注入配置数据到Pod |
secret | Secret的名称和键值对列表,用于注入敏感数据到Pod。 |
volumeMounts | 卷挂载配置列表,用于指定Pod中容器如何挂载卷。 |
volumes | 卷配置列表,为Pod中的容器存储卷。 |
清单模版
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pod-controller # ds名称
labels: # 给ds打标签
controller: daemonset
spec:
revisionHistoryLimit: 3 # 保留历史版本数量,默认为10
updateStrategy: # Pod更新策略,默认是RollingUpdate
type: RollingUpdate # 滚动更新策略。另一种是OnDelete,其没有子属性配置参数
rollingUpdate: # 当type为RollingUpdate的时候生效,为其配置参数
maxSurge: 25% # 升级过程中可以超过期望的Pod的最大数量,可以为百分比,也可以为整数。默认是25%
maxUnavailable: 25% # 升级过程中最大不可用状态的Pod数量,可以为百分比,也可以为整数。默认是25%
selector: # 选择器,通过该控制器管理哪些pod
matchLabels: # Labels匹配规则。和matchExpressions类似
app: nginx-pod ###或者
matchExpressions: # Expressions匹配规则。和matchLabels类似
- {key: app, operator: 'In', values: ["nginx-pod"]}
template: # pod副本创建模板。属性和Pod的属性一样
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
三、DaemonSet 使用案例
[root@k8s-master01 ~]# cat pod-controller.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pod-controller
labels:
controller: daemonset
spec:
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
##查看
[root@k8s-master01 ~]# kubectl apply -f pod-controller.yaml
daemonset.apps/pod-controller created