Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案
环境说明
| 主机 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. 系统配置
# 设置主机名
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 安装
# 安装依赖
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 组件安装
# 禁用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
# 创建命名空间
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:
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. 创建安全配置
# 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:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
5. 部署集群
kubectl apply -f local-storage.yaml
kubectl apply -f zookeeper-cluster.yaml # 查看集群状态
kubectl get zookeepercluster
kubectl get pods -l app=zookeeper
三、自动化运维功能实现
1. 自动扩缩容
# 水平扩展
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:
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:
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. 自动证书轮换
# 证书更新后滚动重启
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"tlsConfig":{"certUpdated":true}}}'
四、安全合规与灾备
1. 安全加固
# 在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. 跨集群灾备
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. 集群状态检查
# 查看集群状态
kubectl get zookeepercluster
kubectl describe zk zookeeper-cluster # 检查节点角色
kubectl exec zookeeper-cluster-0 -- zkServer.sh status
2. 日志管理
# 查看实时日志
kubectl logs -f zookeeper-cluster-0 # 日志归档配置 (Operator自动管理)
3. 配置热更新
# 修改配置后触发更新
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"config":{"tickTime":"3000"}}}'
六、扩展与升级
1. 集群升级流程
# 滚动升级到新版本
kubectl patch zk zookeeper-cluster --type='merge' -p '{"spec":{"image":{"tag":"3.9.0"}}}' # 监控升级进度
kubectl get pods -w -l app=zookeeper
2. 多集群管理
# 部署多套Zookeeper集群
kubectl apply -f zookeeper-cluster-app1.yaml
kubectl apply -f zookeeper-cluster-app2.yaml # 统一监控
kubectl apply -f zookeeper-global-monitor.yaml
七、备份与恢复方案
1. Velero 全集群备份
# 安装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. 数据迁移
# 使用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实现监控,显著提升运维效率。生产环境建议:
使用HashiCorp Vault管理密钥
部署多可用区集群
集成OpenPolicyAgent进行策略管理
使用GitOps工作流(Argo CD)管理配置
Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案的更多相关文章
- Zookeeper集群"脑裂"问题 - 运维总结
关于集群中的"脑裂"问题,之前已经在这里详细介绍过,下面重点说下Zookeeper脑裂问题的处理办法.ooKeeper是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调 ...
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- k8s 上使用 StatefulSet 部署 zookeeper 集群
目录 StatefulSet 部署 zookeeper 集群 创建pv StatefulSet 测试 StatefulSet 部署 zookeeper 集群 参考 k8s官网zookeeper集群的部 ...
- 使用docker安装部署Spark集群来训练CNN(含Python实例)
使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...
- ZooKeeper 01 - 什么是ZooKeeper + 部署ZooKeeper集群
目录 1 什么是ZooKeeper 2 ZooKeeper的功能 2.1 配置管理 2.2 命名服务 2.3 分布式锁 2.4 集群管理 3 部署ZooKeeper集群 3.1 下载并解压安装包 3. ...
- Docker安装部署es集群
Docker安装部署es集群:环境准备:已安装docker的centos服务器一台1. 拉取es版本docker pull elasticsearch:5.6.82. 新建文件夹 数据挂载目录 和 配 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- 第十五章 部署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 ...
- Docker 容器部署 Consul 集群
Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...
- Linux环境快速部署Zookeeper集群
一.部署前准备: 1.下载ZooKeeper的安装包: http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper-3.4.9. 2.将下载的 ...
随机推荐
- 【uniapp】文本控件多余文字省略号代替
多余文字使用省略号效果 代码 .l-dd-content{ width: 100%; color: #8b8b8b; display: -webkit-box; /** 对象作为伸缩盒子模型显示 ** ...
- C#/.NET/.NET Core技术前沿周刊 | 第 33 期(2025年4.1-4.6)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- C++宏定义中可变参数列表__VA_ARGS__ 及 QT 提供的宏 QT_OVERLOADED_MACRO
1. 基本用法 VA_ARGS 是 C/C++ 中的预定义宏,用于在宏定义中表示可变参数列表(Variadic Arguments),需与省略号 ... 配合使用.其核心作用是将宏调用中的可变参数原样 ...
- SpringBoot配置@ConfigurationProperties(prefix = "pig")时中文乱码
问题出现 通过@ConfigurationProperties(prefix = "pig")注解进行属性绑定的时候,application.properties文件中出现中文,从 ...
- struts2——Action的三种编写方式
Action有三种编写方式POJO方式.实现Action接口.继承ActionSupport类 推荐采用继承ActionSupport类这种方式.因为这个类的功能比较丰富. 方式一:POJO方式 pa ...
- 【记录】博客|Markdown写作常用的符号表示、公式写法合集
文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...
- spring boot迁移计划 第Ⅰ章 --chapter 1. rust hyper 结合rust nacos-client开发nacos网关 part ② hyper网关
1. toml依赖 hyper = { version = "1", features = ["full"] } tokio = { version = &qu ...
- windows11 安装WSL2详细过程
一.什么是 WSL 2 时间来到 2017 年,事情正在起变化.微软正式发布了「适用于 Linux 的 Windows 子系统」,即人们熟知的 Windows Subsystem for Linux, ...
- Lasso回归及其R语言操作
Lasso回归形式: 确定lamda使得RSS-lamda*sum(Bi)最小,RSS为普通最小二乘估计的回归平方和. 作用: 确定哪些变量更重要,lamda从0到1过程中,哪些变量的系数最慢趋于0, ...
- MFC单文档应用程序引入GDI+
在MFC中引入GDI+,步骤如下: 1.在需要用到GDI+的文件中添加GDI+文件 1 #include <gdiplus.h> 2 using namespace Gdiplus; 2. ...