4.6.3 使用StatefulSet部署有状态应用

部署Zookeeper
zookeeper.yaml
下面是启动三个zookeeper实例的yaml配置文件:

  1. ---
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: zk-svc
  6. labels:
  7. app: zk-svc
  8. spec:
  9. ports:
  10. - port: 2888
  11. name: server
  12. - port: 3888
  13. name: leader-election
  14. clusterIP: None
  15. selector:
  16. app: zk
  17. ---
  18. apiVersion: v1
  19. kind: ConfigMap
  20. metadata:
  21. name: zk-cm
  22. data:
  23. jvm.heap: "1G"
  24. tick: "2000"
  25. init: "10"
  26. sync: "5"
  27. client.cnxns: "60"
  28. snap.retain: "3"
  29. purge.interval: "0"
  30. ---
  31. apiVersion: policy/v1beta1
  32. kind: PodDisruptionBudget
  33. metadata:
  34. name: zk-pdb
  35. spec:
  36. selector:
  37. matchLabels:
  38. app: zk
  39. minAvailable: 2
  40. ---
  41. apiVersion: apps/v1beta1
  42. kind: StatefulSet
  43. metadata:
  44. name: zk
  45. spec:
  46. serviceName: zk-svc
  47. replicas: 3
  48. template:
  49. metadata:
  50. labels:
  51. app: zk
  52. spec:
  53. affinity:
  54. podAntiAffinity:
  55. requiredDuringSchedulingIgnoredDuringExecution:
  56. - labelSelector:
  57. matchExpressions:
  58. - key: "app"
  59. operator: In
  60. values:
  61. - zk
  62. topologyKey: "kubernetes.io/hostname"
  63. containers:
  64. - name: k8szk
  65. imagePullPolicy: Always
  66. image: harbor-001.jimmysong.io/library/zookeeper:3.4.6
  67. resources:
  68. requests:
  69. memory: "2Gi"
  70. cpu: "500m"
  71. ports:
  72. - containerPort: 2181
  73. name: client
  74. - containerPort: 2888
  75. name: server
  76. - containerPort: 3888
  77. name: leader-election
  78. env:
  79. - name : ZK_REPLICAS
  80. value: "3"
  81. - name : ZK_HEAP_SIZE
  82. valueFrom:
  83. configMapKeyRef:
  84. name: zk-cm
  85. key: jvm.heap
  86. - name : ZK_TICK_TIME
  87. valueFrom:
  88. configMapKeyRef:
  89. name: zk-cm
  90. key: tick
  91. - name : ZK_INIT_LIMIT
  92. valueFrom:
  93. configMapKeyRef:
  94. name: zk-cm
  95. key: init
  96. - name : ZK_SYNC_LIMIT
  97. valueFrom:
  98. configMapKeyRef:
  99. name: zk-cm
  100. key: tick
  101. - name : ZK_MAX_CLIENT_CNXNS
  102. valueFrom:
  103. configMapKeyRef:
  104. name: zk-cm
  105. key: client.cnxns
  106. - name: ZK_SNAP_RETAIN_COUNT
  107. valueFrom:
  108. configMapKeyRef:
  109. name: zk-cm
  110. key: snap.retain
  111. - name: ZK_PURGE_INTERVAL
  112. valueFrom:
  113. configMapKeyRef:
  114. name: zk-cm
  115. key: purge.interval
  116. - name: ZK_CLIENT_PORT
  117. value: "2181"
  118. - name: ZK_SERVER_PORT
  119. value: "2888"
  120. - name: ZK_ELECTION_PORT
  121. value: "3888"
  122. command:
  123. - sh
  124. - -c
  125. - zkGenConfig.sh && zkServer.sh start-foreground
  126. readinessProbe:
  127. exec:
  128. command:
  129. - "zkOk.sh"
  130. initialDelaySeconds: 10
  131. timeoutSeconds: 5
  132. livenessProbe:
  133. exec:
  134. command:
  135. - "zkOk.sh"
  136. initialDelaySeconds: 10
  137. timeoutSeconds: 5
  138. securityContext:
  139. runAsUser: 1000
  140. fsGroup: 1000

部署Kafka
kafka.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
  labels:
      apps: kafka
spec:
    ports:
  - port: 9093
      name: server
    clusterIP: None
  selector:
      app: kafka
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
    name: kafka-pdb
spec:
    selector:
        matchLabels:
        app: kafka
    minAvailable: 2
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
    name: kafka
spec:
    serviceName: kafka-svc
  replicas: 3
  template:
      metadata:
        labels:
          app: kakfa
      spec:
          affinity:
            podAntiAffinity:
              requireDuringSchedulingIgnoreDuringExecution:
                - labelSelector:
                      matchExpressions:
                      - key: "app"
                        operator: In
                      values:
                      - kafka
                topologyKey: "Kubernetes.io/hostname"
          podAffinity:
              preferredDuringSchedulingIgnoreDuringExecution:
                - weight: 1
                  podAffinityTerm:
                    labelSelector:
                      matchExpressions:
                        - key: "app"
                          operator: In
                        values:
                        - zk
                                    topologyKey: "kubernetes.io/hostname"
                terminationGracePeriodSeconds: 300
        containers:
        - name: k8skafka
            imagePullPolicy: Always
          image: harbor-001.jimmysong.io/library/kafka:2.10-0.8.2.1
          resources:
              requests:
                memory: "1Gi"
              cpu: 500m
          env:
          - name: KF_REPLICAS
              values: "3"
          ports:
          - containerPort: 9093
              name: server
             command:
          - /bin/bash
          - -c
          - "/opt/kafka/bin/kakfaGenConfig.sh && /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties"
                   env:
          - name: KAFKA_HEAP_OPTS
              value: "-Xmx512M -Xms512M"
          -    name: KAFKA_OPTS
              value: "-Dlogging.level=DEBUG"
          readinessProbe:
                  tcpSocket:
                  port:    9092
              initialDelaySeconds: 15
              timeoutSeconds: