$ ls ~yifei/notes/

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

Posted on:

Last modified:

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

kubernetes 架构图

  • Node. k8s 集群中的机器。一台机器可以既是 Master 也是 Worker,不过 Master 最好不要做 Worker。
  • Master. 控制节点,为了高可用,可以使用多台,一般至少三台为宜。
  • Pod. k8s 部署的最小单元,一个 Pod 中可以包含多个 container. Pod 随时可能挂掉,也可能被替换。 同一个 pod 中的不同 container 之间,可以直接使用 localhost 访问。
  • Deployment,我们通常不会单独创建 Pod,而是创建 Deployment,并通过其中的模板来生成 Pod。
  • Service,对集群内部或者外部提供服务的抽象,其中包含暴露的端口等等信息。
  • Replica Set. 服务一般来说会负载均衡到多组 Pod. RS 用来创建并保证有足够的 Pod 副本。
  • 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 的镜像
        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 而已,方便回滚。

参考

  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

© 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.