Kafka Deployment on Kubernetes

2020 It邦幫忙鐵人賽 系列文章

由於我比較熟悉 GCP / GKE 的服務,這篇的操作過程都會以 GCP 平台作為範例,不過操作過程大體上是跨平台通用的。


碎念

30 天每天一文真的蠻逼人的,每一篇都是新寫,還要盡可能顧及文章品質,下班趕文章,各位大德寫看看就知道

  • 這邊調整了當初想寫的文章,內容應該都會帶到
    • elk
    • kafka-ha
    • reids-ha
    • prometheus
    • kubernetes on gcp
  • 但不會再一篇 10000 字了,逼死我吧…
  • 寫不完的部份 30 天候會在IT邦幫忙,或是我的 Github Page https://chechia.net/補完

寫文章真的是體力活,覺得我的文章還有參考價值,請左邊幫我點讚按個喜歡,右上角幫我按個追縱,底下歡迎留言討論。給我一點繼續走下去的動力。

Exausted Cat Face


摘要

  • 簡介 kafka
  • 部屬 kafka 到 kubernetes 上

簡介 kafka

Kafka 是分散式的 streaming platform,可以 subscribe & publish 訊息,可以當作是一個功能強大的 message queue 系統,由於分散式的架構,讓 kafka 有很大程度的 fault tolerance。

我們今天就來部屬一個 kafka。

Deploy

我把我的寶藏都在這了https://github.com/chechiachang/kafka-on-kubernetes

下載下來的 .sh ,跑之前養成習慣貓一下

cat install.sh


#!/bin/bash
#
# https://github.com/helm/charts/tree/master/incubator/kafka

#HELM_NAME=kafka
HELM_NAME=kafka-1

helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator

# Stable: chart version: kafka-0.16.2	app version: 5.0.1
helm upgrade --install ${HELM_NAME} incubator/kafka --version 0.16.2 -f values-staging.yaml

Helm

我們這邊用 helm 部屬,之所以用 helm ,因為這是我想到最簡單的方法,能讓輕鬆擁有一套功能完整的 kafka。所以我們先用。

沒用過 helm 的大德可以參考 Helm Quickstart,先把 helm cli 與 kubernetes 上的 helm tiller 都設定好

helm init

Helm Chart

一個 helm chart 可以當成一個獨立的專案,不同的 chart 可以在 kubernetes 上協助部屬不同的項目。

這邊使用了還在 incubator 的chart,雖然是 prod ready,不過使用上還是要注意。

使用前先把 incubator 的 helm repo 加進來

helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator

Install

這邊是用 upgrade –install,已安裝就 upgrade,沒安裝就 install,之後可以用這個指令升版

helm upgrade --install ${HELM_NAME} incubator/kafka --version 0.16.2 -f values-staging.yaml

Version

這邊使用的版本:

  • chart version: kafka-0.16.2
  • app version: 5.0.1
  • kafka Image: confluentinc/cp-kafka:5.0.1
  • zookeeper Image: gcr.io/google_samples/k8szk:v3
  • kafka exporter: danielqsj/kafka-exporter:v1.2.0

values-staging

透過 helm chart,把啟動參數帶進去,這邊我們看幾個比較重要的,細節之後的文章在一起討論。

https://github.com/chechiachang/kafka-on-kubernetes/blob/master/values-staging.yaml

replicas: 3

安裝三個 kafka,topology 的東西也是敬待下篇XD

## The kafka image repository
image: "confluentinc/cp-kafka"

## The kafka image tag

底層執行的 kafka 是 conluent kafka

Configure resource requests and limits

ref: http://kubernetes.io/docs/user-guide/compute-resources/

resources: {}

limits:

cpu: 200m

memory: 4096Mi

requests:

cpu: 100m

memory: 1024Mi

kafkaHeapOptions: “-Xmx4G -Xms1G”


這邊可以調整在 kubernetes 上面的 limit 跟 request

* Deploy 會先去跟 node 問夠不夠,夠的話要求 node 保留這些資源給 Pod
* Runtime 超過 limit,Pod 會被 kubernetes 幹掉,不過我們是 JVM,外部 resource 爆掉前,應該會先因 heap 滿而死。一個施主自盡的感覺。
* CPU 蠻省的,吃比較多是 memory。但也要看你的使用情境

prometheus


對我們有上 promethues,基本上就是 kafka-exporter  kafka metrics 倒出去 prometheus,這個也是詳見下回分解。

# 跑起來了

$ kubectl get po | grep kafka

NAME READY STATUS RESTARTS AGE kafka-1-0 1/1 Running 0 224d kafka-1-1 1/1 Running 0 224d kafka-1-2 1/1 Running 0 224d kafka-1-exporter-88786d84b-z954z 1/1 Running 0 224d kafka-1-zookeeper-0 1/1 Running 0 224d kafka-1-zookeeper-1 1/1 Running 0 224d kafka-1-zookeeper-2 1/1 Running 0 224d

張哲嘉
張哲嘉
Site Reliability Engineer

我的研究領域包括網站可靠性工程、DevOps、Container和Kubernetes。