使用helm在Azure Kubernetes Service(AKS)上的k8s集群中部署kafka

这是关于使用Azure Kubernetes Service(以下简称AKS)和helm的笔记。我也会提及helm和Kubernetes(以下简称k8s)。

helm是什么?

这是一个用于管理在k8s上部署的软件包的产品。
它经常被称为k8s版的yum或apt。
虽然我有些不同的印象,但是这样说还是比较容易理解的,所以在这个阶段可以接受这样的描述。
稍后我会稍微提到上述事项。

使用AKS,使用Helm进行部署!

可以在上述链接中找到相关文档,如果要实际尝试的话,可以按照上述步骤进行操作。
顺便一提,AKS并没有特别的要点。在本地的k8s集群中,几乎可以按照相同的流程进行操作。

我打算使用Helm在消息服务kafka上部署,并在接下来的文档中补充相关内容。

准备helm环境

如果使用 AKS,可以使用 Cloud Shell,其中已经安装了 Helm 客户端。但是,如果想要与 CI/CD 配合使用(这在 Azure 上没有准备好),建议使用 Azure CLI 的 Docker 镜像。可以使用这个镜像,只要其中包含了 Helm。但是可能镜像中没有 Helm,所以可以参考这里的 Docker 文件,创建一个包含 Azure CLI 和 Helm 的镜像也是可以的。(Helm 的安装仅需要下载二进制文件即可)。

我们使用gcloudSDK + helm执行图像来在CI/CD中运行,但是由于未经过验证,我们只是将azure cli + helm作为参考介绍一下。
在接下来的部分,我们将使用cloud shell来记录我们所进行的操作。

请确认 Helm 的版本。

tiller 安装之前

admin@Azure:~$ helm version
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Error: could not find tiller
admin@Azure:~$

在安装之前,自然不会显示版本信息。
将找不到tiller显示出来。

安装Tiller之后

admin@Azure:~$ helm version
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}

安装 tiller 后,检查版本会显示服务器端的版本。

admin@Azure:~$ kubectl get pod -n kube-system | grep tiller
tiller-deploy-XXXXXXXXXX-XXXXX                                    1/1       Running   0          3m
admin@Azure:~$

由于 tiller 的 pod 也在正确启动,所以现在可以准备使用了。

添加 helm 仓库

默认情况下,仅支持local和stable版本,但由于kafka在18.09.23是孵化器状态,因此需要添加孵化器库。

admin@Azure:~$ helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
"incubator" has been added to your repositories
admin@Azure:~$ helm repo list
NAME            URL
stable          https://kubernetes-charts.storage.googleapis.com
local           http://127.0.0.1:8879/charts
incubator       https://kubernetes-charts-incubator.storage.googleapis.com/

使用helm部署kafka。

kafka的Helm Chart可以在这里找到。
使用Helm可以快速部署所需的产品。
然而,考虑到实际使用情况,我认为可能会有需要根据用途进行调整的参数。
对于这些参数,根据Helm的设计思想,可以在名为values.yaml的文件中进行设置,用户可以更改这些参数并实际部署产品。

让我们来稍微看一下参数的内容吧。

values.yaml文件的内容

可以在中文中将「ポッド数」解释为「容器的数量」。

## The StatefulSet installs 3 pods by default
replicas: 3

这是关于创建几个 Kafka 的设置。默认情况下,会创建三个 Kafka 用的 Pod。

形象推广策略

## Specify a imagePullPolicy
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
imagePullPolicy: "IfNotPresent"

这是在拉取容器镜像时的设置。
“IfNotPresent”是用来使用缓存的镜像的设置。
然而,如果容器的标签是”latest”,则此值将被忽略,将始终去拉取image。

中央处理器(CPU)/内存分配设置

## Configure resource requests and limits
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
resources: {}
  # limits:
  #   cpu: 200m
  #   memory: 1536Mi
  # requests:
  #   cpu: 100m
  #   memory: 1024Mi
kafkaHeapOptions: "-Xmx1G -Xms1G"

资源

CPU和内存的分配设置。200m表示0.2核心(0.2虚拟CPU)。1000m表示1核心。即使写成”1″也代表相同的意思。requests是初始分配,limit是最大分配。默认情况下已经被注释掉了,但在生产环境中务必要指定。这是k8s的资源管理功能。

卡夫卡堆选项

由于Kafka是Java应用程序,因此它是JVM选项。
它是启动Kafka进程时的选项。
这不是Kubernetes的资源管理功能。

因此,values.yaml文件中包含了k8s和kafka的配置信息。当然,需要具备k8s和kafka的相关知识。

Pod的布置规则

affinity: {}
## Alternatively, this typical example defines:
## antiAffinity (to keep Kafka pods on separate pods)
## and affinity (to encourage Kafka pods to be collocated with Zookeeper pods)
# affinity:
#   podAntiAffinity:
#     requiredDuringSchedulingIgnoredDuringExecution:
#     - labelSelector:
#         matchExpressions:
#         - key: app
#           operator: In
#           values:
#           - kafka
#       topologyKey: "kubernetes.io/hostname"
#   podAffinity:
#     preferredDringSchedulingIgnoredDuringExecution:
#      - weight: 50
#        podAffinityTerm:
#          labelSelector:
#            matchExpressions:
#            - key: app
#              operator: In
#              values:
#                - zookeeper
#          topologyKey: "kubernetes.io/hostname"

是关于如何配置pod的亲和性设置。
– 不要在已经存在kafka pod的节点上启动另一个kafka pod(不在同一节点上放置kafka,这是为了冗余性的设置)。
– 尽可能地将zookeeper放置在与kafka pod已启动的节点相同的节点上(尽量放置在相同节点上,但不是强制的)。

被注释掉的部分意思与上述相同。

JMX出口器获取设置

## Prometheus Exporters / Metrics
##
prometheus:
  ## Prometheus JMX Exporter: exposes the majority of Kafkas metrics
  jmx:
    enabled: false

如果将这个设置的enabled值设为true,将会创建一个用于在prometheus中查看通过jmx收集的信息的exporter。

取得kafka出口器的设置

  ## Prometheus Kafka Exporter: exposes complimentary metrics to JMX Exporter
  kafka:
    enabled: false

生成一个与Kafka相同的Pod的另一个容器,以获取用于Kafka的Prometheus度量信息的设置。它会收集Kafka的度量信息,如broker数量等。

导出器的Prometheus协作设置

operator:
  ## Are you using Prometheus Operator?
  enabled: false

  serviceMonitor:
    # Namespace Prometheus is installed in
    namespace: monitoring

    ## Defaults to whats used if you follow CoreOS [Prometheus Install Instructions](https://github.com/coreos/prometheus-operator/tree/master/helm#tldr)
    ## [Prometheus Selector Label](https://github.com/coreos/prometheus-operator/blob/master/helm/prometheus/templates/prometheus.yaml#L65)
    ## [Kube Prometheus Selector Label](https://github.com/coreos/prometheus-operator/blob/master/helm/kube-prometheus/values.yaml#L298)
    selector:
      prometheus: kube-prometheus

我們將與CoreOS提供的Prometheus Operator進行連接,以設定的exporter資訊讓prometheus可以查看該連接設定。

稍微回想一下

在这个页面的开头,我说过“Helm经常被称为k8s版的yum或apt”。根据上述解释,以下设置将会进行:
– 分配多少资源给pod
– 如何启动pod
– 收集指标信息
– 整合收集到的指标信息

请注意,汉语是多义的语言,有多种表达方式,请仅选择一种选项。

所以,根据我的理解:
“Helm是用于配置产品的工具,它涵盖了产品安装、参数设置以及与其他必需产品的协作,确保产品在可用状态下进行设置。”
另外,根据在values.yaml中定义的内容,处理是通过templates文件夹中的yaml文件完成的。(Helm的操作是调用templates文件夹中的所有yaml文件)
因此,需要明白并理解不是所有Helm chart都能提供各种不同的设置。
反过来说,如果使用这种Helm chart,需要理解在templates文件夹中的yaml文件中进行了哪些设置。

开心驾驶!

卡夫卡的部署

既然我已经说完了想说的话,剩下的就随意提一下。

admin@Azure:~$ helm install -n happykafka incubator/kafka --set replicas=1,prometheus.jmx.enabled=true,prometheus.kafka.enabled=true --namespace kafka
NAME:   happykafka
LAST DEPLOYED: Fri Sep 21 16:21:20 2018
NAMESPACE: kafka
STATUS: DEPLOYED
(以下略)

安装时,可以使用 –set 选项指定值。
由于设置了 replicas=1,所以之前的 values.yaml 中的 replicas 是3,但将以1进行部署。
此外,未来的参数也可以通过 -f 以文件形式指定。

确认发布信息

admin@Azure:~$ helm list
NAME                    REVISION        UPDATED                         STATUS          CHART                           APP VERSION     NAMESPACE
happykafka              1               Fri Sep 21 16:21:20 2018        DEPLOYED        kafka-0.10.0                    4.1.2           kafka

发布将通过管理,可以回滚操作和版本升级。
顺便提一下,使用helm delete –purge happykafka命令可以完全清除与Kafka相关的资源。

确认kafka pod启动

admin@Azure:~$ kubectl get pod -n kafka
NAME                                   READY     STATUS    RESTARTS   AGE
happykafka-0                           2/2       Running   0          3m
happykafka-exporter-7666fc6c59-jsd8c   1/1       Running   1          3m
happykafka-zookeeper-0                 1/1       Running   0          3m
happykafka-zookeeper-1                 1/1       Running   0          2m
happykafka-zookeeper-2                 1/1       Running   0          1m

我們可以確定,Kafka 的 pod 只有一個正在運行。
同時,我們也可以確認已啟動用於獲取 Kafka 的指標資訊的 exporter。

如果仔细查看Kafka的Helm Chart,您就会发现happykafka-zookeeper-x就是一个Zookeeper。它是管理Kafka集群的产品。

祝大家度过美好的Helm生活!

广告
将在 10 秒后关闭
bannerAds