您的位置:

k8s部署kafka的详细阐述

一、k8s部署kafka集群

k8s部署kafka集群需要考虑到kafka的分布式特性,可以使用kafka-manager或者Zookeeper进行管理。

第一步是创建一个Zookeeper集群,可以使用Kubernetes的StatefulSet来创建,通过Kubernetes的DNS服务来管理集群中的Zookeeper服务。

<apiVersion: v1
kind: Service
metadata:
  name: zk-cs
spec:
  selector:
    app: zk-cs
  ports:
  - name: client
    port: 2181
    protocol: TCP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk-cs
spec:
  selector:
    matchLabels:
      app: zk-cs
  serviceName: zk-cs
  replicas: 3
  template:
    metadata:
      labels:
        app: zk-cs
    spec:
      containers:
      - name: zk-cs
        image: zookeeper
        ports:
        - name: client
          containerPort: 2181
        readinessProbe:
          tcpSocket:
            port: client
          initialDelaySeconds: 10
          periodSeconds: 5  >

接下来是创建kafka集群,在使用kubernetes创建kafka集群时,需要使用Kafka StatefulSet,以便保持kafaka的有序ID。

<apiVersion: v1
kind: Service
metadata:
  name: kafka-cs
spec:
  selector:
    app: kafka-cs
  type: NodePort
  ports:
  - name: kafka
    port: 9092
    protocol: TCP
    nodePort: 30092
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka-cs
spec:
  selector:
    matchLabels:
      app: kafka-cs
  serviceName: kafka-cs
  replicas: 3
  template:
    metadata:
      labels:
        app: kafka-cs
    spec:
      containers:
      - name: kafka-cs
        image: wurstmeister/kafka
        env:
        - name: KAFKA_ADVERTISED_HOST_NAME
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: KAFKA_ADVERTISED_PORT
          value: "9092"
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: zk-cs-0.zk-cs:2181,zk-cs-1.zk-cs:2181,zk-cs-2.zk-cs:2181
        ports:
        - name: kafka
          containerPort: 9092
        readinessProbe:
          tcpSocket:
            port: kafka
          initialDelaySeconds: 10
          periodSeconds: 5 >

二、k8s部署kafka和logstash

在kubernetes中部署kafka和logstash可以将logstash部署在单独的Pod中。

首先需要创建一个Kafka的Service,通过该service进行和Kafka Pod的通信。

然后创建一个Logstash Deployment和Service,将logstash部署在独立的Pod里面,将需要处理的日志转发到kafka的Service。

<apiVersion: v1
kind: Service
metadata:
  name: kafka-cs
spec:
  selector:
    app: kafka-cs
  type: NodePort
  ports:
  - name: kafka
    port: 9092
    protocol: TCP
    nodePort: 30092
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: logstash
spec:
  replicas: 1
  selector:
    matchLabels:
      app: logstash
  template:
    metadata:
      labels:
        app: logstash
    spec:
      containers:
      - name: logstash
        image: docker.elastic.co/logstash/logstash:7.12.0
        volumeMounts:
        - name: logstash-config
          mountPath: /usr/share/logstash/pipeline/logstash.conf
          subPath: logstash.conf
        ports:
        - name: logstash
          containerPort: 5000
        env:
          - name: KAFKA_BROKERS
            value: "kafka-cs:9092"
        livenessProbe:
          tcpSocket:
            port: 5000
          initialDelaySeconds: 10
          periodSeconds: 5
      volumes:
        - name: logstash-config
          configMap:
            name: logstash-config
            items:
              - key: logstash.conf
                path: logstash.conf

---
apiVersion: v1
kind: Service
metadata:
  name: logstash
spec:
  selector:
    app: logstash
  ports:
  - name: logstash
    port: 5000
    protocol: tcp
    targetPort: 5000 >

三、k8s部署kafka单机

在kubernetes中单机部署kafka通常使用Deployment和Service进行部署。

首先需要创建一个Kafka Deployment和Service,将它们部署到Kubernetes集群之中。

<apiVersion: v1
kind: Service
metadata:
  name: kafka
spec:
  selector:
    app: kafka
  ports:
  - name: kafka
    port: 9092
    protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - name: kafka
        image: wurstmeister/kafka
        ports:
        - name: kafka
          containerPort: 9092
        env:
        - name: KAFKA_ADVERTISED_HOST_NAME
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - name: KAFKA_ADVERTISED_PORT
          value: "9092"
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: zookeeper:2181
        readinessProbe:
          tcpSocket:
            port: kafka
          periodSeconds: 10
          timeoutSeconds: 5  >

四、k8s部署方式

k8s部署kafka一般有两种方式:使用StatefulSet和使用Deployment。StatefulSet适用于有状态的应用,如数据库等。Deployment适用于无状态的应用,如Web应用程序或API服务。

使用StatefulSet部署kafka可以创建一个稳定的网络标识符和唯一标识符,以便容器通过网络与其他容器进行通信。

使用Deployment部署kafka可以快速创建和删除kafka服务,可以很好地解决容器的运行效率问题。

五、k8s部署服务

k8s部署kafka服务需要使用Deployment或者StatefulSet和Service进行部署。

Deployments和StatefulSet通常用于部署应用程序或服务,而Service用于通过Kubernetes服务发现机制将这些应用程序或服务公开给其他客户端。

六、k8s部署流程

k8s部署kafka的流程包括以下步骤:

1.创建Zookeeper Deployment和Service。

2.创建Kafka Deployment和Service。

3.在Kafka中配置Kafka上的Zookeeper地址。

4.创建logstash Deployment和Service,启动logstash和Kafka之间的连接。

七、k8s部署jar包

k8s部署kafka jar包需要使用Docker构建一个容器镜像,并将jar包文件复制到容器镜像中。

构建Docker镜像的Dockerfile文件如下:

<FROM openjdk:8u171-jdk-alpine
ADD kafka_2.11-2.0.0.tgz /opt
WORKDIR /opt/kafka_2.11-2.0.0
EXPOSE 9092
CMD ["bin/kafka-server-start.sh", "config/server.properties"] >

八、k8s部署应用

k8s部署kafka应用一般使用Deployment或者StatefulSet和Service进行部署,具体步骤见上述内容。

九、k8s部署nginx

k8s部署nginx可以使用Deployment和Service进行部署。

部署nginx的Deployment文件如下:

<apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.8
        ports:
        - containerPort: 80
          name: http >

通过定义Service来将nginx服务暴露给外部客户端:

<apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80 >