使用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生活!