环境说明

主机 IP 主机名 节点角色 数据目录 Kubernetes 节点标签
192.168.10.100 zk1 Master /opt/zookeeper/data zk-cluster=true
192.168.10.101 zk2 Worker /opt/zookeeper/data zk-cluster=true
192.168.10.102 zk3 Worker /opt/zookeeper/data zk-cluster=true
192.168.10.103 zk4 Worker /opt/zookeeper/data zk-cluster=true
192.168.10.104 zk5 Worker /opt/zookeeper/data zk-cluster=true

一、基础环境部署(所有节点)

1. 系统配置

bash
 
# 设置主机名
sudo hostnamectl set-hostname zk1 # 分别在每台机器执行对应主机名 # 编辑hosts文件
sudo tee -a /etc/hosts <<EOF
192.168.10.100 zk1
192.168.10.101 zk2
192.168.10.102 zk3
192.168.10.103 zk4
192.168.10.104 zk5
EOF # 关闭SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 优化内核参数
sudo tee -a /etc/sysctl.conf <<EOF
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
vm.swappiness=1
EOF
sudo sysctl -p

2. Docker 安装

bash
 
# 安装依赖
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker仓库
sudo yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io # 配置Docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF # 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

3. Kubernetes 组件安装

bash
 
# 禁用Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 安装kubeadm/kubelet/kubectl
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet # 初始化Master节点 (仅在zk1执行)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--control-plane-endpoint="zk1:6443" \
--upload-certs \
--apiserver-advertise-address=192.168.10.100 # 配置kubectl (在zk1执行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 加入Worker节点 (在zk2-zk5执行)
# 使用kubeadm init输出的join命令
kubeadm join zk1:6443 --token <token> --discovery-token-ca-cert-hash <hash>

二、Zookeeper Operator 部署

1. 安装 Zookeeper Operator

bash
 
# 创建命名空间
kubectl create ns zookeeper-operator # 部署Operator
kubectl apply -f https://raw.githubusercontent.com/pravega/zookeeper-operator/master/deploy/all_ns/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/pravega/zookeeper-operator/master/deploy/all_ns/operator.yaml # 验证Operator状态
kubectl get pods -n zookeeper-operator

2. 创建 Zookeeper 集群 CRD

zookeeper-cluster.yaml:

yaml
 
apiVersion: zookeeper.pravega.io/v1beta1
kind: ZookeeperCluster
metadata:
name: zookeeper-cluster
namespace: default
spec:
replicas: 5
image:
repository: zookeeper
tag: 3.8.0
persistence:
storageClassName: local-storage
volumeReclaimPolicy: Retain
size: 20Gi
config:
initLimit: 15
syncLimit: 5
tickTime: 2000
autopurge:
snapRetainCount: 10
purgeInterval: 24
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- zookeeper
topologyKey: kubernetes.io/hostname
nodeSelector:
zk-cluster: "true"
securityContext:
runAsUser: 1000
fsGroup: 1000
resources:
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
security:
enable: true
jaasConfig:
secretRef: zk-jaas-secret
tlsConfig:
enable: true
secretRef: zk-tls-secret
metrics:
enable: true
port: 7000

3. 创建安全配置

bash
 
# JAAS 认证配置
kubectl create secret generic zk-jaas-secret \
--from-literal=jaas-config="Server {
org.apache.zookeeper.server.auth.DigestLoginModule required
user_admin=\"adminpassword\"
user_appuser=\"apppassword\";
};" # TLS 证书配置
# (提前生成keystore.jks)
kubectl create secret generic zk-tls-secret \
--from-file=keystore.jks=keystore.jks \
--from-literal=keystore-password=changeit

4. 创建存储类

local-storage.yaml:

yaml
 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

5. 部署集群

bash
 
kubectl apply -f local-storage.yaml
kubectl apply -f zookeeper-cluster.yaml # 查看集群状态
kubectl get zookeepercluster
kubectl get pods -l app=zookeeper

三、自动化运维功能实现

1. 自动扩缩容

bash
 
# 水平扩展
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"replicas":7}}' # 垂直扩容
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"pod":{"resources":{"limits":{"memory":"8Gi"}}}}}'

2. 自动备份与恢复

zk-backup-job.yaml:

yaml
 
apiVersion: batch/v1
kind: CronJob
metadata:
name: zk-backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: zookeeper:3.8.0
command: ["/bin/sh", "-c"]
args:
- |
echo "Connecting to ${ZK_SERVER}"
echo "savemn" | nc ${ZK_SERVER} 2181
tar czf /backup/$(date +%Y%m%d).tar.gz -C /data .
volumeMounts:
- name: backup-volume
mountPath: /backup
- name: data-volume
mountPath: /data
restartPolicy: OnFailure
volumes:
- name: backup-volume
persistentVolumeClaim:
claimName: zk-backup-pvc
- name: data-volume
persistentVolumeClaim:
claimName: $(ZK_PVC)

3. 自动监控告警

prometheus-monitoring.yaml:

yaml
 
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: zookeeper-monitor
spec:
selector:
matchLabels:
app: zookeeper
endpoints:
- port: metrics
interval: 15s
namespaceSelector:
any: true

4. 自动证书轮换

bash
 
# 证书更新后滚动重启
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"tlsConfig":{"certUpdated":true}}}'

四、安全合规与灾备

1. 安全加固

yaml
 
# 在CRD中增加安全配置
spec:
security:
enable: true
jaasConfig:
secretRef: zk-jaas-secret
tlsConfig:
enable: true
secretRef: zk-tls-secret
networkPolicy:
enabled: true
allowedClients:
- 192.168.10.0/24

2. 跨集群灾备

yaml
 
apiVersion: zookeeper.pravega.io/v1beta1
kind: ZookeeperCluster
metadata:
name: zookeeper-dr
spec:
replicas: 3
config:
# 配置为观察者模式
peerType: observer
# 连接主集群
initConfig: |
server.1=zk1:2888:3888:participant;2181
server.2=zk2:2888:3888:participant;2181
server.3=zk3:2888:3888:participant;2181
server.4=dr-zk1:2888:3888:observer;2181
server.5=dr-zk2:2888:3888:observer;2181
server.6=dr-zk3:2888:3888:observer;2181

五、日常运维操作

1. 集群状态检查

bash
 
# 查看集群状态
kubectl get zookeepercluster
kubectl describe zk zookeeper-cluster # 检查节点角色
kubectl exec zookeeper-cluster-0 -- zkServer.sh status

2. 日志管理

bash
 
# 查看实时日志
kubectl logs -f zookeeper-cluster-0 # 日志归档配置 (Operator自动管理)

3. 配置热更新

bash
 
# 修改配置后触发更新
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"config":{"tickTime":"3000"}}}'

六、扩展与升级

1. 集群升级流程

bash
 
# 滚动升级到新版本
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"image":{"tag":"3.9.0"}}}' # 监控升级进度
kubectl get pods -w -l app=zookeeper

2. 多集群管理

bash
 
# 部署多套Zookeeper集群
kubectl apply -f zookeeper-cluster-app1.yaml
kubectl apply -f zookeeper-cluster-app2.yaml # 统一监控
kubectl apply -f zookeeper-global-monitor.yaml

七、备份与恢复方案

1. Velero 全集群备份

bash
 
# 安装Velero
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.0.0 \
--bucket zk-backups \
--secret-file ./credentials-velero \
--use-restic # 创建备份
velero backup create zk-full-backup --include-namespaces default --selector app=zookeeper # 灾难恢复
velero restore create --from-backup zk-full-backup

2. 数据迁移

bash
 
# 使用zkTransfer工具
kubectl exec zookeeper-cluster-0 -- zkTransfer.sh \
--source zk1:2181 \
--target new-zk1:2181 \
--path /critical_data \
--parallel 8

运维检查清单

检查项 频率 命令/方法
集群健康状态 每日 kubectl get zk
节点资源使用率 每日 kubectl top pods
证书有效期检查 每月 keytool -list -v -keystore
备份恢复测试 每季度 Velero恢复演练
安全漏洞扫描 每月 Trivy扫描镜像
故障转移演练 每半年 模拟节点故障
性能压测 每年 ZK Benchmark工具

通过Kubernetes Operator实现Zookeeper集群的全生命周期自动化管理,结合Velero实现灾备,Prometheus实现监控,显著提升运维效率。生产环境建议:

  1. 使用HashiCorp Vault管理密钥

  2. 部署多可用区集群

  3. 集成OpenPolicyAgent进行策略管理

  4. 使用GitOps工作流(Argo CD)管理配置

 

Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案的更多相关文章

  1. Zookeeper集群"脑裂"问题 - 运维总结

    关于集群中的"脑裂"问题,之前已经在这里详细介绍过,下面重点说下Zookeeper脑裂问题的处理办法.ooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调 ...

  2. Docker部署zookeeper集群和kafka集群,实现互联

    本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...

  3. k8s 上使用 StatefulSet 部署 zookeeper 集群

    目录 StatefulSet 部署 zookeeper 集群 创建pv StatefulSet 测试 StatefulSet 部署 zookeeper 集群 参考 k8s官网zookeeper集群的部 ...

  4. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  5. ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群

    目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...

  6. Docker安装部署es集群

    Docker安装部署es集群:环境准备:已安装docker的centos服务器一台1. 拉取es版本docker pull elasticsearch:5.6.82. 新建文件夹 数据挂载目录 和 配 ...

  7. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  8. 第十五章 部署zookeeper集群

    1.集群规划 主机名 角色 IP hdss7-11.host.com k8s代理节点1.zk1 10.4.7.11 hdss7-12.host.com k8s代理节点2.zk2 10.4.7.12 h ...

  9. Docker 容器部署 Consul 集群

    Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...

  10. Linux环境快速部署Zookeeper集群

    一.部署前准备: 1.下载ZooKeeper的安装包: http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper-3.4.9. 2.将下载的 ...

随机推荐

  1. 【uniapp】文本控件多余文字省略号代替

    多余文字使用省略号效果 代码 .l-dd-content{ width: 100%; color: #8b8b8b; display: -webkit-box; /** 对象作为伸缩盒子模型显示 ** ...

  2. C#/.NET/.NET Core技术前沿周刊 | 第 33 期(2025年4.1-4.6)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  3. C++宏定义中可变参数列表__VA_ARGS__ 及 QT 提供的宏 QT_OVERLOADED_MACRO

    1. 基本用法 VA_ARGS 是 C/C++ 中的预定义宏,用于在宏定义中表示可变参数列表(Variadic Arguments),需与省略号 ... 配合使用.其核心作用是将宏调用中的可变参数原样 ...

  4. SpringBoot配置@ConfigurationProperties(prefix = "pig")时中文乱码

    问题出现 通过@ConfigurationProperties(prefix = "pig")注解进行属性绑定的时候,application.properties文件中出现中文,从 ...

  5. struts2——Action的三种编写方式

    Action有三种编写方式POJO方式.实现Action接口.继承ActionSupport类 推荐采用继承ActionSupport类这种方式.因为这个类的功能比较丰富. 方式一:POJO方式 pa ...

  6. 【记录】博客|Markdown写作常用的符号表示、公式写法合集

    文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...

  7. spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ② hyper网关

    1. toml依赖 hyper = { version = "1", features = ["full"] } tokio = { version = &qu ...

  8. windows11 安装WSL2详细过程

    一.什么是 WSL 2 时间来到 2017 年,事情正在起变化.微软正式发布了「适用于 Linux 的 Windows 子系统」,即人们熟知的 Windows Subsystem for Linux, ...

  9. Lasso回归及其R语言操作

    Lasso回归形式: 确定lamda使得RSS-lamda*sum(Bi)最小,RSS为普通最小二乘估计的回归平方和. 作用: 确定哪些变量更重要,lamda从0到1过程中,哪些变量的系数最慢趋于0, ...

  10. MFC单文档应用程序引入GDI+

    在MFC中引入GDI+,步骤如下: 1.在需要用到GDI+的文件中添加GDI+文件 1 #include <gdiplus.h> 2 using namespace Gdiplus; 2. ...