Zookeeper部署
网络Headless服务
创建无头服务:
vim zookeeper-default-headless.yml
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/managed-by: Tiller app.kubernetes.io/name: zookeeper helm.sh/chart: zookeeper-5.1.1 name: zookeeper-default-headless namespace: public spec: clusterIP: None ports: - name: client port: 2181 protocol: TCP targetPort: client - name: follower port: 2888 protocol: TCP targetPort: follower - name: election port: 3888 protocol: TCP targetPort: election publishNotReadyAddresses: true selector: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/name: zookeeper
kubectl create -f zookeeper-default-headless.yml kubectl -n public get svc
创建StatefulSet
部署用YAML文件:
vim zookeeper-default.yml
apiVersion: apps/v1 kind: StatefulSet metadata: labels: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/managed-by: Tiller app.kubernetes.io/name: zookeeper helm.sh/chart: zookeeper-5.1.1 name: zookeeper-default namespace: public spec: podManagementPolicy: Parallel replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/name: zookeeper serviceName: zookeeper-default-headless template: metadata: labels: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/name: zookeeper name: zookeeper-default spec: containers: - command: - bash - '-ec' - > # Execute entrypoint as usual after obtaining ZOO_SERVER_ID based on POD hostname 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 exec /entrypoint.sh /run.sh env: - 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' - name: ZOO_SERVERS value: >- zookeeper-default-0.zookeeper-default-headless.public.svc.cluster.local:2888:3888 - name: ZOO_ENABLE_AUTH value: 'no' - name: ZOO_HEAP_SIZE value: '1024' - name: ZOO_LOG_LEVEL value: ERROR - name: ALLOW_ANONYMOUS_LOGIN value: 'yes' image: 'docker.io/bitnami/zookeeper:3.5.6-debian-9-r20' imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 10 successThreshold: 1 tcpSocket: port: client timeoutSeconds: 5 name: zookeeper ports: - containerPort: 2181 name: client protocol: TCP - containerPort: 2888 name: follower protocol: TCP - containerPort: 3888 name: election protocol: TCP readinessProbe: failureThreshold: 6 initialDelaySeconds: 5 periodSeconds: 10 successThreshold: 1 tcpSocket: port: client timeoutSeconds: 5 resources: requests: cpu: 100m memory: 256Mi securityContext: runAsUser: 1001 terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /bitnami/zookeeper name: data dnsPolicy: ClusterFirst restartPolicy: Always securityContext: fsGroup: 1001 terminationGracePeriodSeconds: 30 updateStrategy: type: RollingUpdate volumeClaimTemplates: - metadata: name: data spec: accessModes: - ReadWriteOnce resources: requests: storage: 8Gi storageClassName: alicloud-nas
kubectl create -f zookeeper-default.yml kubectl -n public get statefulsets.apps
创建服务
创建SVC:
vim zookeeper-default-svc.yml
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/managed-by: Tiller app.kubernetes.io/name: zookeeper helm.sh/chart: zookeeper-5.1.1 name: zookeeper-default namespace: public spec: ports: - name: client port: 2181 protocol: TCP targetPort: client - name: follower port: 2888 protocol: TCP targetPort: follower - name: election port: 3888 protocol: TCP targetPort: election selector: app.kubernetes.io/component: zookeeper app.kubernetes.io/instance: zookeeper-default app.kubernetes.io/name: zookeeper
kubectl create -f zookeeper-default-svc.yml kubectl -n public get svc
RocketMQ部署
RocketMQ作为有状态服务,官方推出了RocketMQ Operator来方便k8s群集环境中部署,项目地址:https://github.com/apache/rocketmq-operator 。
部署RocketMQ Operator
由于使用Operator来部署RocketMQ,故先部署其:
git clone https://github.com/apache/rocketmq-operator.git cd rocketmq-operator/
运行脚本安装 RocketMQ Operator
./install-operator.sh kubectl get pods
其会自动创建所需资源(Deployment,SVC,ConfigMap,Secret等)。
Operator是无状态的,故不需要配置NAS存储。
配置群集
查看上面的安装脚本,你会看到最后有个注释行,其yaml文件就是创建cluster的应用文件:
cat install-operator.sh
即为 example/rocketmq_v1alpha1_rocketmq_cluster.yaml 文件。
Tips:此文件中的 storageMode: EmptyDir,表示存储使用的是 EmptyDir,数据会随着 Pod 的删除而抹去,因此该方式仅供开发测试时使用。一般使用 HostPath 或 StorageClass 来对数据进行持久化存储。使用 HostPath 时,需要配置 hostPath,声明宿主机上挂载的目录。使用 storageClass 时,需要配置 volumeClaimTemplates,声明 PVC 模版。具体可参考 RocketMQ Operator 文档。
这里我们使用阿里的NAS,故复制并修改相关配置:
cp -p example/rocketmq_v1alpha1_rocketmq_cluster.yaml rocketmq_v1alpha1_rocketmq_cluster.yaml vim rocketmq_v1alpha1_rocketmq_cluster.yaml
... kind: Broker ... resources: requests: memory: "1024Mi" cpu: "250m" limits: memory: "4096Mi" cpu: "500m" ... # storageMode can be EmptyDir, HostPath, StorageClass storageMode: StorageClass ... volumeClaimTemplates: - metadata: name: broker-storage spec: accessModes: - ReadWriteOnce storageClassName: alicloud-nas resources: requests: storage: 8Gi ... kind: NameService ... storageMode: StorageClass ... volumeClaimTemplates: - metadata: name: namesrv-storage spec: accessModes: - ReadWriteOnce storageClassName: alicloud-nas resources: requests: storage: 1Gi ... kind: Console ...
kubectl create -f rocketmq_v1alpha1_rocketmq_cluster.yaml kubectl get statefulsets.apps
由于自带的example服务是以NodePort方式创建的,这里我做了修改,并且要与开发环境保持一致;故创建服务:
vim rocketmq_cluster_service.yaml
apiVersion: v1 kind: Service metadata: name: rocketmq-console-svc labels: app: rocketmq-console spec: selector: app: rocketmq-console ports: - port: 8080 targetPort: 8080 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: rocketmq-headless namespace: default spec: clusterIP: None selector: name_service_cr: name-service ports: - port: 9876 targetPort: 9876 protocol: TCP
kubectl create -f rocketmq_cluster_service.yaml kubectl get svc
创建路由条目:
这里使用阿里送的五级域名,所以通过页面创建即可;创建好后就可以通过这个域名访问: