首先创建svc
apiVersion: v1
kind: Service
metadata:
name: zookeeper-headless
namespace: public
labels:
app.kubernetes.io/name: zookeeper
app.kubernetes.io/component: zookeeper
spec:
type: ClusterIP
clusterIP: None
publishNotReadyAddresses: true
ports:
- name: tcp-client
port: 2181
targetPort: client
- name: tcp-follower
port: 2888
targetPort: follower
- name: tcp-election
port: 3888
targetPort: election
selector:
app.kubernetes.io/name: zookeeper
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper
namespace: public
labels:
app.kubernetes.io/name: zookeeper
app.kubernetes.io/component: zookeeper
spec:
type: ClusterIP
sessionAffinity: None
ports:
- name: tcp-client
port: 2181
targetPort: client
nodePort: null
- name: tcp-follower
port: 2888
targetPort: follower
- name: tcp-election
port: 3888
targetPort: election
selector:
app.kubernetes.io/name: zookeeper
app.kubernetes.io/component: zookeeper
在创建StatefulSet之前需要有storageClass 这里使用公有云本地盘, 就不列举了
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/component: zookeeper
app.kubernetes.io/name: zookeeper
name: zookeeper
namespace: public
spec:
podManagementPolicy: Parallel
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/component: zookeeper
app.kubernetes.io/name: zookeeper
serviceName: zookeeper-headless
template:
metadata:
creationTimestamp: null
labels:
app.kubernetes.io/component: zookeeper
app.kubernetes.io/name: zookeeper
name: zookeeper
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/component: zookeeper
app.kubernetes.io/name: zookeeper
namespaces:
- public
topologyKey: kubernetes.io/hostname
weight: 1
containers:
- command:
- bash
- -ec
- |-
# Execute entrypoint as usual after obtaining ZOO_SERVER_ID
# check ZOO_SERVER_ID in persistent volume via myid
# if not present, set based on POD hostname
if [[ -f "/zookeeper/data/myid" ]]; then
export ZOO_SERVER_ID="$(cat /zookeeper/data/myid)"
else
HOSTNAME=`hostname -s`
if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; then
ORD=${BASH_REMATCH[2]}
export ZOO_SERVER_ID=$((ORD + 1 ))
else
echo "Failed to get index from hostname $HOST"
exit 1
fi
fi
exec /entrypoint.sh /run.sh
env:
- name: ZOO_DATA_LOG_DIR
- name: ZOO_PORT_NUMBER
value: "2181"
- name: ZOO_TICK_TIME
value: "2000"
- name: ZOO_INIT_LIMIT
value: "10"
- name: ZOO_SYNC_LIMIT
value: "5"
- name: ZOO_MAX_CLIENT_CNXNS
value: "60"
- name: ZOO_4LW_COMMANDS_WHITELIST
value: srvr, mntr, ruok
- name: ZOO_LISTEN_ALLIPS_ENABLED
value: "no"
- name: ZOO_AUTOPURGE_INTERVAL
value: "0"
- name: ZOO_AUTOPURGE_RETAIN_COUNT
value: "3"
- name: ZOO_MAX_SESSION_TIMEOUT
value: "40000"
- name: ZOO_SERVERS
value: zookeeper-0.zookeeper-headless.public.svc.cluster.local:2888:3888::1 zookeeper-1.zookeeper-headless.public.svc.cluster.local:2888:3888::2 zookeeper-2.zookeeper-headless.public.svc.cluster.local:2888:3888::3
- name: ZOO_ENABLE_AUTH
value: "no"
- name: ZOO_HEAP_SIZE
value: "1024"
- name: ZOO_LOG_LEVEL
value: ERROR
- name: ALLOW_ANONYMOUS_LOGIN
value: "yes"
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
image: bitnami/zookeeper:3.8.0-debian-10-r0
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- /bin/bash
- -c
- echo "ruok" | timeout 2 nc -w 2 localhost 2181 | grep imok
failureThreshold: 6
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: zookeeper
ports:
- containerPort: 2181
name: client
protocol: TCP
- containerPort: 2888
name: follower
protocol: TCP
- containerPort: 3888
name: election
protocol: TCP
readinessProbe:
exec:
command:
- /bin/bash
- -c
- echo "ruok" | timeout 2 nc -w 2 localhost 2181 | grep imok
failureThreshold: 6
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
requests:
cpu: "1"
memory: 2Gi
volumeMounts:
- mountPath: /zookeeper
name: zk-data
volumeClaimTemplates:
- metadata:
name: zk-data
spec:
storageClassName: cbs
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
查看状态
kubectl get po -n public
搭建完成