$ ls ~yifei/notes/

Kubernetes 初探——Deployment 部署无状态应用

Posted on:

Last modified:

首先来回顾一下 Kubernetes 的一些基本信息:

kubernetes 架构图

  • Node. 集群中的机器。一台机器可以既是 Master 也是 Worker,不过 Master 最好不要做 Worker。
  • Master. 控制节点,为了高可用,可以使用多台,一般至少三台为宜。
  • Pod. 部署的最小单元,一个 Pod 中可以包含多个 container. Pod 随时可能挂掉,也可能被替换。 同一个 pod 中的不同 container 之间,可以直接使用 localhost 访问。
  • Deployment,我们通常不会单独创建 Pod,而是创建 Deployment,并通过其中的模板来生成 Pod。
  • Service,对集群内部或者外部提供服务的抽象,其中包含暴露的端口等等信息。
  • Namespace. 命名空间。默认情况下会有 kube-system 和 default 两个命名空间,kube-system 存放 k8s 系统资源,而用户部署的资源会在 default 命名空间中。
  • Persistent Volume. 如果把 Node 理解为抽象的 CPU 和内存资源,那么 PV 就可以理解为抽象的 硬盘资源。但是一般不直接使用 PV,而是通过 Persistent Volume Claim 来使用 PV。
  • Persistent Volume Claim. 存储声明,用来声明需要使用的存储资源。
  • Stateful Set. Deployment 没有状态,而 StatefulSet 会运用 PV 和 PVC 实现状态保持。典型 应用场景是数据库。
  • Label 和 Selector. k8s 中的资源全部都通过 Label 来标识的选择。

K8s 中的几乎所有资源都是通过 yaml 文件来配置的。

Deployment

Deployment 是使用 k8s 部署服务直接操作的概念。其他的概念往往都是通过 deployment 来间接 使用的,因此理解 deployment 至关重要。

一个典型的 deployment 配置文件如下:

# 1. 资源配置文件的元信息,总是 apiVersion, kind, metadata 三项
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
# 2. 资源配置文件的具体规格
spec:
  # 3. Deployment 的部署信息
  replicas: 2                    # 副本数量:2
  selector:                      # 关联到对应 label 的 template
    matchLabels:
      app: my-nginx
  # 4. 创建 Pod 的模板
  template:
    metadata:                    # tempalte 的元信息
      labels:                    # tempalte 的标签
        app: my-nginx
    # 5. 模板的具体规格
    spec:
      containers:                # 这是一个数组,即上面提到的:Pod 中可以有多个 container
      - name: my-nginx
        image: nginx             # container 的镜像
        env:                     # 环境变量
        - name: FOO
          value: bar
        ports:                   # 对外暴露的端口
        - containerPort: 80
        resources:               # container 的资源限制
          requests:
            cpu: 300m
            memory: 512Mi

可以看出 k8s 的配置文件整体上分了两部分,metadata 和 spec。每种资源的配置文件的 metadata 部分基本是一致的,spec 部分是不同的。Deployment 的 spec 分为了两部分,第一部分是部署的相关 信息,第二部分是 Pod 的模板,包含了如何创建 Pod 的具体配置。

Deployment 的配置可以发生改变,如果只是 replica 的数目发生了改变,那么这只是一个简单的 扩容或者缩容操作,k8s 只会启动或者杀死 Pod。如果 template 中镜像、命令等参数发生了改变, 那么 K8S 会把这次操作视为升级,也就是开始一个 Roll Out 操作,创建新的 Replica Set。 在这个过程中,如果 deployment 中的 spec 指定了保留历史 revision 的次数大于零,那么原有的 Replica Set 不会被删除,只是会被 Scale 到 0 而已,方便回滚。

资源配置

Kubernetes 的一个核心功能就是资源管理,在上面的配置中,我们也看到了 resources 这个配置项。 具体来说,k8s 中内置的资源类型有 cpu 和 memory 两项,使用 requests 和 limits 两个属性控制。

  • requests,最少要占用的资源请求
  • limits,最多能占用的资源上限

对 CPU 来说,如果超过了 limits,那么就会得不到调度,但是也不会挂掉。对内存来说,如果超过了 limits,直接就给 OOM killer 杀掉了。

CPU 没有单位,直接使用数字指定核数。cpu: 1 值得就是使用一个核,cpu: 0.5 值得就是使用 半个核。不过,我们常见的指定方式都是:cpu: 500m 这种形式,其中 m 指的是千分之一,所以, 500m == 0.5。值得注意的是,这里的一个核可能是一个物理核,也可能是一个虚拟核,取决于你在 物理机上还是虚拟机上运行集群。

内存的单位是字节,不过我们一般还是使用 ki, Mi, Gi 这些单位多一些。需要注意的有两点:

  • Mi 系列的单位基于 1024 进制,应该优先使用。M 系列的单位基于 1000 进制,最好别用
  • Mi 是大写的 M,如果写成了小写,那就变成千分之一的意思了

参考

  1. deployment 和 pod 的区别
  2. Kubernetes 基础概念
  3. 客户端和服务端服务发现
  4. kubernetes 命令表
  5. Kubernetes 之 kubectl 常用命令使用指南:1: 创建和删除
  6. Kubernetes 之 kubectl 常用命令
  7. Kubernetes 基本概念以及术语
  8. kubectl create 和 apply 的区别
  9. https://stackoverflow.com/questions/42561791/right-way-to-update-deployments-on-kubernetes
  10. https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
  11. K8S YAML 文件基础
  12. NodePort/LB/Ingress 三种方式的对比
  13. https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/
  14. https://stackoverflow.com/questions/30693283/access-other-containers-of-a-pod-in-kubernetes
  15. https://www.magalix.com/blog/kubernetes-resource-requests-and-limits-101
  16. https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
WeChat Qr Code

© 2016-2022 Yifei Kong. Powered by ynotes

All contents are under the CC-BY-NC-SA license, if not otherwise specified.

Opinions expressed here are solely my own and do not express the views or opinions of my employer.

友情链接: MySQL 教程站