写点什么

云原生(十七) | Kubernetes 篇之深入了解 Deployment

作者:Lansonli
  • 2022 年 8 月 15 日
    广东
  • 本文字数:4608 字

    阅读完需:约 15 分钟

云原生(十七) | Kubernetes篇之深入了解Deployment

深入了解 Deployment

一、什么是 Deployment

  • 一个 DeploymentPodsReplicaSets 提供声明式的更新能力。

  • 你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态;控制循环。 for(){ xxx controller.spec()}

  • 不要管理 Deployment 所拥有的 ReplicaSet

  • 我们部署一个应用一般不直接写 Pod,而是部署一个 Deployment

  • Deploy 编写规约 Deployments | Kubernetes


二、Deployment 创建

  • 基本格式

    .metadata.name指定 deploy 名字

    replicas 指定副本数量

    selector 指定匹配的 Pod 模板。

    template 声明一个 Pod 模板

编写一个 Deployment 的 yaml

赋予 Pod 自愈和故障转移能力


  • 在检查集群中的 Deployment 时,所显示的字段有:

    NAME 列出了集群中 Deployment 的名称。

    READY 显示应用程序的可用的 副本 数。显示的模式是“就绪个数/期望个数”。

    UP-TO-DATE 显示为了达到期望状态已经更新的副本数。

    AVAILABLE 显示应用可供用户使用的副本数。

    AGE 显示应用程序运行的时间。

  • ReplicaSet 输出中包含以下字段:

    NAME 列出名字空间中 ReplicaSet 的名称;

    DESIRED 显示应用的期望副本个数,即在创建 Deployment 时所定义的值。 此为期望状态;

    CURRENT 显示当前运行状态中的副本个数;

    READY 显示应用中有多少副本可以为用户提供服务;

    AGE 显示应用已经运行的时间长度。

    注意:ReplicaSet 的名称始终被格式化为[Deployment名称]-[随机字符串]。 其中的随机字符串是使用 pod-template-hash 作为种子随机生成的。

一个 Deploy 产生三个

  • Deployment 资源

  • replicaset 资源

  • Pod 资源

Deployment 控制 RS,RS 控制 Pod 的副本数

ReplicaSet: 只提供了副本数量的控制功能

Deployment: 每部署一个新版本就会创建一个新的副本集,利用他记录状态,回滚也是直接让指定的 rs 生效


三、Deployment 更新机制

  • 仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。

  • 上线动作 原理: 创建新的 rs,准备就绪后,替换旧的 rs(此时不会删除,因为revisionHistoryLimit 指定了保留几个版本)

  • 常用的 kubectl 命令

################更新##################################kubectl  set image  deployment资源名  容器名=镜像名kubectl set image deployment.apps/nginx-deployment php-redis=tomcat:8 --record## yaml提取可更新的关键所有字段计算的hash。web---- /hellopostman   aservice- /hello
#或者直接修改定义也行kubectl edit deployment.v1.apps/nginx-deployment#查看状态kubectl rollout status deployment.v1.apps/nginx-deployment
################查看历史并回滚#####################################查看更新历史-看看我们设置的历史总记录数是否生效了kubectl rollout history deployment.v1.apps/nginx-deployment#回滚kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=2
###############累计更新###############暂停记录版本kubectl rollout pause deployment.v1.apps/nginx-deployment#多次更新操作。##比如更新了资源限制kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi##比如更新了镜像版本kubectl set image deployment.apps/nginx-deployment php-redis=tomcat:8##在继续操作多次##看看历史版本有没有记录变化kubectl rollout history deployment.v1.apps/nginx-deployment#让多次累计生效kubectl rollout resume deployment.v1.apps/nginx-deployment
复制代码

1、比例缩放(Proportional Scaling

maxSurge(最大增量):除当前数量外还要添加多少个实例。

maxUnavailable(最大不可用量):滚动更新过程中的不可用实例数。



2、HPA(动态扩缩容)

概念:Pod 水平自动扩缩 | Kubernetes

实战:HorizontalPodAutoscaler 演练 | Kubernetes



2.1、需要先安装 metrics-server  

GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.


 2.2、安装步骤  

apiVersion: v1kind: ServiceAccountmetadata:  labels:    k8s-app: metrics-server  name: metrics-server  namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  labels:    k8s-app: metrics-server    rbac.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.io  resources:  - pods  - nodes  verbs:  - get  - list  - watch---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  labels:    k8s-app: metrics-server  name: system:metrics-serverrules:- apiGroups:  - ""  resources:  - pods  - nodes  - nodes/stats  - namespaces  - configmaps  verbs:  - get  - list  - watch---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  labels:    k8s-app: metrics-server  name: metrics-server-auth-reader  namespace: kube-systemroleRef:  apiGroup: rbac.authorization.k8s.io  kind: Role  name: extension-apiserver-authentication-readersubjects:- kind: ServiceAccount  name: metrics-server  namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  labels:    k8s-app: metrics-server  name: metrics-server:system:auth-delegatorroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: system:auth-delegatorsubjects:- kind: ServiceAccount  name: metrics-server  namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  labels:    k8s-app: metrics-server  name: system:metrics-serverroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: system:metrics-serversubjects:- kind: ServiceAccount  name: metrics-server  namespace: kube-system---apiVersion: v1kind: Servicemetadata:  labels:    k8s-app: metrics-server  name: metrics-server  namespace: kube-systemspec:  ports:  - name: https    port: 443    protocol: TCP    targetPort: https  selector:    k8s-app: metrics-server---apiVersion: apps/v1kind: Deploymentmetadata:  labels:    k8s-app: metrics-server  name: metrics-server  namespace: kube-systemspec:  selector:    matchLabels:      k8s-app: metrics-server  strategy:    rollingUpdate:      maxUnavailable: 0  template:    metadata:      labels:        k8s-app: metrics-server    spec:      containers:      - args:        - --cert-dir=/tmp        - --kubelet-insecure-tls        - --secure-port=4443        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname        - --kubelet-use-node-status-port        image: registry.cn-hangzhou.aliyuncs.com/lanson_k8s_images/metrics-server:v0.4.3        imagePullPolicy: IfNotPresent        livenessProbe:          failureThreshold: 3          httpGet:            path: /livez            port: https            scheme: HTTPS          periodSeconds: 10        name: metrics-server        ports:        - containerPort: 4443          name: https          protocol: TCP        readinessProbe:          failureThreshold: 3          httpGet:            path: /readyz            port: https            scheme: HTTPS          periodSeconds: 10        securityContext:          readOnlyRootFilesystem: true          runAsNonRoot: true          runAsUser: 1000        volumeMounts:        - mountPath: /tmp          name: tmp-dir      nodeSelector:        kubernetes.io/os: linux      priorityClassName: system-cluster-critical      serviceAccountName: metrics-server      volumes:      - emptyDir: {}        name: tmp-dir---apiVersion: apiregistration.k8s.io/v1kind: APIServicemetadata:  labels:    k8s-app: metrics-server  name: v1beta1.metrics.k8s.iospec:  group: metrics.k8s.io  groupPriorityMinimum: 100  insecureSkipTLSVerify: true  service:    name: metrics-server    namespace: kube-system  version: v1beta1  versionPriority: 100
复制代码


  • kubectl apply 即可

  • 全部 runnning 用

    kubectl top nodes --use-protocol-buffers

    kubectl top pods --use-protocol-buffers


2.3、配置 hpa 测试

### 测试镜像 registry.cn-hangzhou.aliyuncs.com/lanson_k8s_images/php-hpa:latest
##应用的yaml已经做好apiVersion: v1kind: Servicemetadata: name: php-apachespec: ports: - port: 80 protocol: TCP targetPort: 80 selector: run: php-apache---apiVersion: apps/v1kind: Deploymentmetadata: labels: run: php-apache name: php-apachespec: replicas: 1 selector: matchLabels: run: php-apache template: metadata: creationTimestamp: null labels: run: php-apache spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/lanson_k8s_images/php-hpa:latest name: php-apache ports: - containerPort: 80 resources: requests: cpu: 200m
##hpa配置 hpa.yamlapiVersion: autoscaling/v1kind: HorizontalPodAutoscalermetadata: name: php-apachespec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache targetCPUUtilizationPercentage: 50 #3、进行压力测试kubectl run -i --tty load-generator --image=busybox /bin/sh
#回车然后敲下面的命令 kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
复制代码


3、Canary(金丝雀部署)

3.1、蓝绿部署 VS 金丝雀部署

蓝绿部署


金丝雀部署



3.2、金丝雀的简单测试

使用这个镜像测试 registry.cn-hangzhou.aliyuncs.com/lanson_k8s_images/nginx-test 这个镜像 docker run 的时候 -e msg=aaaa,访问这个 nginx 页面就是看到 aaaa

步骤原理

  • 准备一个 Service,负载均衡 Pod

  • 准备版本 v1 的 deploy,准备版本 v2 的 deploy


4、Deployment 状态与排错

Deployments | Kubernetes


发布于: 刚刚阅读数: 4
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
云原生(十七) | Kubernetes篇之深入了解Deployment_云原生_Lansonli_InfoQ写作社区