组成结构

一个 Deployment 拥有多个 Replica Set,而一个 Replica Set 拥有一个或多个 Pod
一个 Deployment 控制多个 rs 主要是为了支持回滚机制,每当 Deployment 操作时,Kubernetes会重新生成一个 Replica Set 并保留,以后有需要的话就可以回滚至之前的状态
deploy.spec
标签选择 selector
spec:
selector:
matchLabels:
xx: yy
pod 副本数 replicas
spec:
replicas: 1
滚动更新 strategy
spec:
minReadySeconds: 10
revisionHistoryLimit:5
pause: false
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds
滚动更新中新建 pod 起来后多久杀死旧 pod
默认0 ,新容器启动起来后就杀掉旧pod
revisionHistoryLimit
限制最大保留的 revision number
默认 10
pause
进行更新是否停止
type
Recreate 全部重新创建
RollingUpdate 默认
rollingUpdate
上面指定 type: RollingUpdate 才生效
maxSurge
升级过程中最多新建的 pod 数量
例:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD
如果 maxUnavailable为0 ,maxSurge不能为0
maxUnavailable
升级过程中最多杀死的旧 pod 数量
如果 maxSurge 为 0 ,maxUnavailable 不能为0
例:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态
hpa HorizontalPodAutoscaler
metrics-server-v0.4.2
apiVersion: v1kind: ServiceAccountmetadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:labels:k8s-app: metrics-serverrbac.authorization.k8s.io/aggregate-to-admin: "true"rbac.authorization.k8s.io/aggregate-to-edit: "true"rbac.authorization.k8s.io/aggregate-to-view: "true"name: system:aggregated-metrics-readerrules:- apiGroups:- metrics.k8s.ioresources:- pods- nodesverbs:- get- list- watch---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:labels:k8s-app: metrics-servername: system:metrics-serverrules:- apiGroups:- ""resources:- pods- nodes- nodes/stats- namespaces- configmapsverbs:- get- list- watch---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:labels:k8s-app: metrics-servername: metrics-server-auth-readernamespace: kube-systemroleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: extension-apiserver-authentication-readersubjects:- kind: ServiceAccountname: metrics-servernamespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:labels:k8s-app: metrics-servername: metrics-server:system:auth-delegatorroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:auth-delegatorsubjects:- kind: ServiceAccountname: metrics-servernamespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:labels:k8s-app: metrics-servername: system:metrics-serverroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:metrics-serversubjects:- kind: ServiceAccountname: metrics-servernamespace: kube-system---apiVersion: v1kind: Servicemetadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-systemspec:ports:- name: httpsport: 443protocol: TCPtargetPort: httpsselector:k8s-app: metrics-server---apiVersion: apps/v1kind: Deploymentmetadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-systemspec:selector:matchLabels:k8s-app: metrics-serverstrategy:rollingUpdate:maxUnavailable: 0template:metadata:labels:k8s-app: metrics-serverspec:containers:- args:- --cert-dir=/tmp- --kubelet-insecure-tls- --secure-port=4443- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname- --kubelet-use-node-status-portimage: k8s.gcr.io/metrics-server/metrics-server:v0.4.2imagePullPolicy: IfNotPresentlivenessProbe:failureThreshold: 3httpGet:path: /livezport: httpsscheme: HTTPSperiodSeconds: 10name: metrics-serverports:- containerPort: 4443name: httpsprotocol: TCPreadinessProbe:failureThreshold: 3httpGet:path: /readyzport: httpsscheme: HTTPSperiodSeconds: 10securityContext:readOnlyRootFilesystem: truerunAsNonRoot: truerunAsUser: 1000volumeMounts:- mountPath: /tmpname: tmp-dirnodeSelector:kubernetes.io/os: linuxpriorityClassName: system-cluster-criticalserviceAccountName: metrics-servervolumes:- emptyDir: {}name: tmp-dir---apiVersion: apiregistration.k8s.io/v1kind: APIServicemetadata:labels:k8s-app: metrics-servername: v1beta1.metrics.k8s.iospec:group: metrics.k8s.iogroupPriorityMinimum: 100insecureSkipTLSVerify: trueservice:name: metrics-servernamespace: kube-systemversion: v1beta1versionPriority: 100
示例
apiVersion: apps/v1kind: Deploymentmetadata:name: c7-depnamespace: defaultspec:selector:matchLabels:app: c7-depreplicas: 3strategy:type: RollingUpdatetemplate:metadata:labels:app: c7-depspec:containers:- image: centos:7.4name: c7-dep-centos7command:- /bin/sh- -c- sleep 6000resources:limits:cpu: 1200mrequests:cpu: 1000m
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: c7-hpa
spec:
maxReplicas: 40
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: c7-dep
targetCPUUtilizationPercentage: 70
示例实践结论
deploy 必须指定资源限制,requests.cpu 优先,不设置按 limits.cpu
按 cpu 以 总量的 百分比
kube-controller-manager 参数
—horizontal-pod-autoscaler-sync-period
HPA Controller 默认 30s 轮询一次,查询指定的资源(RC或者Deployment)中Pod的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能
—horizontal-pod-autoscaler-downscale-stabilization
设置一个持续时间,用于指定在当前操作完成后,HPA 必须等待多长时间才能执行另一次缩放操作。默认为5分钟,也就是默认需要等待5分钟后才会开始自动缩放
