0. 安装准备

1. NFS安装配置

1. 安装NFS

  1. yum install -y nfs-utils
  2. yum -y install rpcbind

2. 配置NFS服务端数据目录

  1. mkdir -p /nfs/k8s/
  2. chmod 755 /nfs/k8s
  3. vim /etc/exports

内容如下:

  1. /nfs/k8s/ *(async,insecure,no_root_squash,no_subtree_check,rw)

3. 启动服务查看状态

  1. # ltsr007
  2. systemctl start nfs.service
  3. systemctl enable nfs.service
  4. showmount -e

4. 客户端

  1. # 客户端不需要启动nfs服务
  2. # 开机启动
  3. sudo systemctl enable rpcbind.service
  4. # 启动rpcbind服务
  5. sudo systemctl start rpcbind.service
  6. # 检查NFS服务器端是否有目录共享
  7. showmount -e ltsr007

2. PV配置

这里采用StorageClass动态实现PV的方式,创建好StorageClass对象,只要在helm的values.yaml文件中指定storageClass为StorageClass名称即可动态在NFS上创建PV以及PVC。

1. 创建Provisioner

Provisioner是NFS的自动配置程序,可以使用自动配置好的NFS服务器,来自动创建持久卷,也就是自动创建PV。

  1. mkdir -p ~/k8s
  2. mkdir ~/k8s/kafka-helm
  3. cd ~/k8s/kafka-helm
  4. vi nfs-client.yaml

内容如下:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nfs-client-provisioner
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: nfs-client-provisioner
  10. strategy:
  11. type: Recreate
  12. template:
  13. metadata:
  14. labels:
  15. app: nfs-client-provisioner
  16. spec:
  17. serviceAccountName: default-admin
  18. containers:
  19. - name: nfs-client-provisioner
  20. image: quay.io/external_storage/nfs-client-provisioner:latest
  21. volumeMounts:
  22. - name: nfs-client-root
  23. mountPath: /persistentvolumes
  24. env:
  25. - name: PROVISIONER_NAME
  26. value: fuseim.pri/ifs
  27. - name: NFS_SERVER
  28. value: 192.168.0.17
  29. - name: NFS_PATH
  30. value: /nfs/k8s
  31. volumes:
  32. - name: nfs-client-root
  33. nfs:
  34. server: 192.168.0.17
  35. path: /nfs/k8s

执行yaml:

  1. kubectl create -f nfs-client.yaml

2. 创建ServiceAccount

给Provisioner授权,使得Provisioner拥有对NFS增删改查的权限。

  1. vi nfs-client-sa.yaml

内容如下:

  1. ---
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. labels:
  6. k8s-app: gmo
  7. name: default-admin
  8. namespace: default
  9. ---
  10. apiVersion: rbac.authorization.k8s.io/v1beta1
  11. kind: ClusterRoleBinding
  12. metadata:
  13. name: default-crb
  14. roleRef:
  15. apiGroup: rbac.authorization.k8s.io
  16. kind: ClusterRole
  17. name: cluster-admin
  18. subjects:
  19. - kind: ServiceAccount
  20. name: default-admin
  21. namespace: default

其中的ServiceAccount name需要和nfs-client.yaml中的serviceAccountName一致。

  1. kubectl create -f nfs-client-sa.yaml

3. 创建StorageClass对象

  1. vi nfs-kafka-class.yaml

内容如下:

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: kafka-nfs-storage
  5. provisioner: fuseim.pri/ifs

provisioner需要和nfs-client.yaml中的PROVISIONER_NAME一致。

  1. kubectl create -f nfs-kafka-class.yaml

1. 拉取镜像

1. 创建存放资源的文件夹

  1. mkdir -p ~/k8s
  2. mkdir ~/k8s/kafka-helm
  3. cd ~/k8s/kafka-helm

2. 从官方Helm库拉取镜像

  1. helm search repo kafka
  2. helm fetch incubator/kafka --version 0.11.0

2. 更改配置

1. 修改ZooKeeper配置

  1. vi charts/zookeeper/templates/statefulset.yaml

将- name: zookeeper后面也就是50行image后面的内容修改为:

  1. # 修改前
  2. 1 apiVersion: apps/v1beta1
  3. 14 terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
  4. 50 image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
  5. # 修改后(注意缩进)
  6. apiVersion: apps/v1
  7. # terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
  8. image: "registry.cn-hangzhou.aliyuncs.com/appstore/k8szk:v2"

2. 配置Kafka持久化存储

  1. vi values.yaml

配置如下:

  1. persistence:
  2. enabled: true
  3. size: "1Gi"
  4. mountPath: "/opt/kafka/data"
  5. storageClass: "kafka-nfs-storage"

3. 配置ZooKeeper持久化存储

  1. vi values.yaml

配置如下:

  1. zookeeper:
  2. enabled: true
  3. resources: ~
  4. env:
  5. ZK_HEAP_SIZE: "1G"
  6. persistence:
  7. enabled: true
  8. size: "1Gi"
  9. storageClass: "kafka-nfs-storage"

4. 配置Kafka其他参数

  1. vi values.yaml

配置如下(新增):

  1. configurationOverrides:
  2. "offsets.topic.replication.factor": 3
  3. "log.cleaner.enable": true
  4. "log.cleanup.policy": delete
  5. "delete.topic.enable": true

修复yaml文件:

  1. vi templates/statefulset.yaml

配置如下(新增):

  1. spec:
  2. serviceName: {{ include "kafka.fullname" . }}-headless
  3. selector:
  4. matchLabels:
  5. app: {{ include "kafka.name" . }}
  6. release: {{ .Release.Name }}

另外:将“apiVersion: apps/v1beta1”修改为:“apiVersion: apps/v1”。

3. 导入镜像(选做)

  1. 上传镜像(所有安装节点)。
  2. 加载镜像(所有安装节点)。

    1. docker load -i docker-kafka_1.1.1.tar
    2. docker load -i docker-zookeeper_3.4.9.tar

    4. 启动Chart

    1. helm install kafka --namespace bigdata .
    2. kubectl get pods -n bigdata
    3. # 参考(动态传参)
    4. helm install apphub/kafka --version 7.0.2 --name kafka --set replicaCount=3,metrics.kafka.enabled=true

    5. 验证

  3. 创建topic。

    1. kubectl -n bigdata exec kafka-0 -- /usr/bin/kafka-topics --zookeeper kafka-zookeeper:2181 --create --replication-factor 3 --partitions 3 --topic testk8s
  4. 查看Topic列表。

    1. kubectl -n bigdata exec kafka-0 -- /usr/bin/kafka-topics --zookeeper kafka-zookeeper:2181 --list
  5. 查看Topic详情。

    1. kubectl -n bigdata exec kafka-0 -- /usr/bin/kafka-topics --zookeeper kafka-zookeeper:2181 --describe --topic testk8s
  6. 消费数据。

    1. kubectl -n bigdata exec -ti kafka-1 -- /usr/bin/kafka-console-consumer --bootstrap-server kafka:9092 --topic testk8s --from-beginning
  7. 生产数据。

    1. kubectl -n bigdata exec -ti kafka-2 -- /usr/bin/kafka-console-producer --broker-list kafka:9092 --topic testk8s

    6. 卸载

    1. helm uninstall kafka -n bigdata