Helm入门与实战 -- 1 Kubernetes 与 Helm 介绍

1.1Kubernetes 部署应用程序

不论应用程序部署在 Kubernetes 上,还是部署在非 Kubernetes 环境,根本上是相似的,都需要以下要素:

  • 网络

  • 持久化存储和文件挂载

  • 可用性和冗余

  • 应用配置

  • 安全

可以与 Kubernetes API(Application Programming Interface 应用程序编程接口)交互,在 Kubernetes 集群中配置这些要素。Kubernetes API 是一组端点(Endpoint),通过这些端点可以查看、修改、删除 Kubernetes 资源,很多 Kubernetes 资源用来配置应用程序的部署细节。

接下来介绍一些基本的 API 端点,以便在 Kubernetes 上部署和配置应用程序。

1.1.1 Deployment

Deployment 定义了在 Kubernetes 集群中部署应用程序所需的基本细节,如使用哪个镜像。容器镜像可以使用 docker 在本地构建,也可以使用 kaniko 在 Kubernetes 上构建。

除了指定容器镜像外,Deployment 还定义了部署应用程序的副本数。创建 Deployment 时,会生成名为 ReplicaSet 的中间资源。ReplicaSet 部署的应用程序副本数由replicas字段定义。应用程序部署在容器中,容器被封装在 Pod 里。Pod 是 Kubernetes 中的最小单元,它包含至少一个容器。

1.1.2 Service

Deployment 部署了一组 Pods(一个或多个),如果我们直接访问这些 Pods,会有很多问题,如不能进行负载均衡、Pods 更新后 IP 地址会改变。这时就需要引入另一个资源 Service 了。Service 的 IP 是固定的,功能类似负载均衡器,把流量分发到后端的 Pods 上,提供负载均衡和高可用的作用。

1.1.3 PersistentVolumeClaim

微服务风格的应用程序生命周期比较短暂,不具备持久化存储。然而在实际环境中,许多应用程序产生的数据,是要在容器生命周期之外,要持久化存储的。Kubernetes 通过一个子系统封装了如何提供存储以及如何使用存储的底层细节,从而解决了这一问题,用户可以通过 PersistentVolumeClaim 端点为应用程序分配持久化存储。Kubernetes 运维人员负责静态分配存储(PersistentVolume)、或使用 StorageClass 动态分配存储(它分配PersistentVolume以响应 PersistentVolumeClaim 端点)。PersistentVolume 捕获所有必需的存储细节,包括类型(例如NFS、Ceph)、存储的大小。从用户的角度无论在集群中使用哪种 PersistentVolume,都不需管理底层存储服务。利用 Kubernetes 的持久化存储功能,可以增加 Kubernetes 平台上可部署的应用程序数量。

下一节,我们来讨论如何在 Kubernetes 集群中创建资源。

1.2资源管理

在 Kubernetes 集群中部署应用程序时,需要先和 Kubernetes API 交互。在命令行界面,kubectl 是主流的 Kubernetes API 交互工具。

我们来看看 kubectl 是如何管理 Kubernetes 资源的。

1.2.1 命令式和声明式

kubectl 包含很多子命令,以命令式的方式创建和修改资源。下面是几个常用命令:

  • create

  • describe

  • edit

  • delete

kubectl 命令格式如下:

kubectl  verb  noun

verb 是 kubectl 的子命令,noun 指特定的 Kubernetes 资源。以下是创建 Deployment 资源的命令示例:

root@k8s-master01:~# kubectl create deployment my-deployment --image=busybox
deployment.apps/my-deployment created
root@k8s-master01:~#

这条命令会指示 Kubernetes API 创建一个名为 “my-deployment” 的 Deployment 资源,并使用来自 Docker Hub 的 busybox 镜像启动容器。

可以通过 kubectl describe 子命令查看 Deployment 的详细信息:

root@k8s-master01:~# kubectl describe deployment my-deployment
Name:                   my-deployment
Namespace:              default
CreationTimestamp:      Wed, 15 Sep 2021 10:34:10 +0800
Labels:                 app=my-deployment
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=my-deployment
Replicas:               1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=my-deployment
  Containers:
   busybox:
    Image:        busybox
    Port:         
    Host Port:    
    Environment:  
    Mounts:       
  Volumes:        
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  
NewReplicaSet:   my-deployment-58bfcbdcc8 (1/1 replicas created)
Events:
  Type     Reason                 Age   From                   Message
  ----     ------                 ----  ----                   -------
  Warning  ReplicaSetCreateError  64s   deployment-controller  Failed to create new replica set "my-deployment-58bfcbdcc8": Unauthorized
  Normal   ScalingReplicaSet      64s   deployment-controller  Scaled up replica set my-deployment-58bfcbdcc8 to 1
root@k8s-master01:~#

这条命令会格式化的输出 Deployment 的相关信息,我们可以通过这条命令查看 Deployment 的状态。

如果需要对 Deployment 进行修改,可以通过 kubectl edit 子命令:

root@k8s-master01:~# kubectl edit deployment my-deployment

这条命令将打开一个文本编辑器,你可以像使用 vim 一样修改 Deployment。

需要删除某个资源时,可以使用 kubectl delete 子命令:

root@k8s-master01:~# kubectl describe deployment my-deployment

执行此命令,会删除名为 “my-deployment” 的 Deployment 资源。

Kubernetes 资源一旦创建,会以 JSON 文件的格式存在于集群中,可以将其导出为 YAML 文件,提高可读性。YAML 格式的资源示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
        - name: main
          image: busybox
          args:
            - sleep
            - infinity

这是一个简单的 YAML 示例,使用来自 Docker Hub 的 busybox 镜像,并无限期地运行 sleep 命令以保持 Pod 运行。

kubectl 是以命令式的方式创建资源的,看上去更简单一些,但在实际使用中,我们更多的是使用 YAML 格式的文件。kubectl 子命令不能配置所有的资源选项,但通过 YAML 文件可以,并且也更灵活。更重要的一点是,YAML 文件是以声明式的方式创建资源的.

在声明式创建资源时,用户首先以 YAML 格式写出要创建的资源,再使用 kubectl 工具将资源应用于 Kubernetes API。在命令式配置中,开发人员使用 kubectl 诸多子命令管理资源,而声明式配置主要依赖于 kubectl apply 子命令。

声明式配置通常使用以下命令实现:

root@k8s-master01:~# kubectl apply -f my-deployment.yaml

使用此命令,Kubernetes 会根据资源是否存在来推断要对资源执行的操作(创建或修改)。

配置声明式应用程序的步骤:

  1. 创建名为 my-deployment.yaml 的文件,并将以下 YAML 格式的内容写入该文件:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: busybox
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
            - name: main
              image: busybox
              args:
                - sleep
                - infinity

  2. .使用以下命令创建 Deployment

    root@k8s-master01:~# kubectl apply -f my-deployment.yaml
    

    执行此命令后,Kubernetes 将按照 YAML 内容在 default 命名空间中创建 Deployment。

  3. 如果要修改 Deployment,例如将副本数修改为 2,可以通过修改 my-deployment.yaml 文件实现:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: busybox
    spec:
      replicas: 2 # 修改此处的数值
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
            - name: main
              image: busybox
              args:
                - sleep
                - infinity

4.可以通过 -f 标志指定 YAML 文件,该文件提供了要删除的资源名称,并且该文件可以反复使用

你可能感兴趣的:(Helm,docker)