# Operator 安装与示例使用

本文档提供 Strimzi Operator 与 MongoDB Community Operator 的两种安装方式：

- Helm 安装
- kubectl 安装

> 示例资源文件位于 `deploy/example`，默认使用 `juwan` 命名空间。
> 请先确保你的 Operator 能 watch 到 `juwan`，否则请改 namespace 或调整 Operator watch 范围。

## 1) Strimzi Operator（Kafka）

### 1.1 使用 Helm 安装

```bash
kubectl create namespace kafka
helm repo add strimzi https://strimzi.io/charts/
helm repo update
helm install strimzi-kafka-operator strimzi/strimzi-kafka-operator -n kafka
```

### 1.2 使用 kubectl 安装

```bash
kubectl create namespace kafka
kubectl apply -f https://strimzi.io/install/latest?namespace=kafka -n kafka
```

### 1.3 安装验证

```bash
kubectl get pods -n kafka
kubectl get crd | grep kafka.strimzi.io
```

### 1.4 应用 Kafka 示例

```bash
kubectl create namespace juwan
kubectl apply -f deploy/example/kafka-strimzi-example.yaml
kubectl get kafka,kafkatopic,kafkauser -n juwan
```

## 2) MongoDB Community Operator

### 2.1 使用 Helm 安装

```bash
kubectl create namespace mongodb
helm repo add mongodb https://mongodb.github.io/helm-charts
helm repo update
helm install mongodb-kubernetes-operator mongodb/community-operator -n mongodb
```

### 2.2 使用 kubectl 安装

```bash
kubectl create namespace mongodb
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-kubernetes-operator/master/config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
kubectl apply -k https://github.com/mongodb/mongodb-kubernetes-operator/config/rbac/
kubectl apply -k https://github.com/mongodb/mongodb-kubernetes-operator/config/manager/
```

### 2.3 安装验证

```bash
kubectl get pods -n mongodb
kubectl get crd | grep mongodbcommunity.mongodb.com
```

### 2.4 应用 MongoDB 示例

```bash
kubectl create namespace juwan
kubectl apply -f deploy/example/mongodb-community-example.yaml
kubectl get mongodbcommunity -n juwan
```

## 3) MongoDB：哨兵集群与分片集群搭建

### 3.1 关于“哨兵集群”的说明

MongoDB 没有 Redis Sentinel 的独立哨兵组件。
MongoDB 的高可用由 **Replica Set（副本集）** 原生完成（自动主从切换、故障恢复）。

因此在 MongoDB 场景里，“哨兵集群”通常对应为“副本集高可用集群”。

### 3.2 MongoDB“哨兵等价”方案：副本集高可用

本仓库提供了高可用副本集 YAML：`deploy/example/mongodb-ha-replicaset-example.yaml`。

```bash
kubectl create namespace juwan
kubectl apply -f deploy/example/mongodb-ha-replicaset-example.yaml
kubectl get mongodbcommunity -n juwan
```

查看副本集状态（任选一个 Pod 进入）：

```bash
kubectl get pods -n juwan
kubectl exec -it -n juwan <mongodb-pod-name> -- mongosh --eval "rs.status()"
```

生产建议：

- 成员数保持奇数（3/5/7）
- 使用持久化卷（PVC），不要用临时盘
- 跨可用区调度（反亲和）
- 开启备份与监控

### 3.3 MongoDB 分片集群架构（Sharded Cluster）

分片集群由三层组成：

- Config Server ReplicaSet（保存分片元数据，建议 3 节点）
- Shard ReplicaSet（每个分片都是副本集，建议每分片 3 节点）
- Mongos（路由层，对业务暴露统一入口）

### 3.4 分片集群搭建步骤（kubectl 方式）

> 说明：MongoDB Community Operator 主要用于副本集管理。分片集群在社区实践中通常采用“手动编排（StatefulSet/Service）+ mongosh 初始化”。

本仓库提供了分片集群基础编排 YAML：`deploy/example/mongodb-sharded-cluster-example.yaml`。

```bash
kubectl create namespace juwan
kubectl apply -f deploy/example/mongodb-sharded-cluster-example.yaml
kubectl get pods,svc -n juwan
```

1) 部署 Config Server 副本集（3 节点）

- 使用 StatefulSet + Headless Service 部署 `mongod --configsvr --replSet cfg-rs`

1) 部署 Shard 副本集（例如 `shard1-rs`、`shard2-rs`，每个 3 节点）

- 使用 StatefulSet + Headless Service 部署 `mongod --shardsvr --replSet <shard-rs-name>`

1) 部署 Mongos 路由层

- Deployment 部署 `mongos --configdb cfg-rs/<cfg-0>:27019,<cfg-1>:27019,<cfg-2>:27019`

1) 初始化各副本集

```bash
# 初始化 Config Server RS
kubectl exec -it -n juwan <cfg-pod-0> -- mongosh --port 27019 --eval 'rs.initiate({_id:"cfg-rs",configsvr:true,members:[{_id:0,host:"cfg-0.cfg-svc.juwan.svc.cluster.local:27019"},{_id:1,host:"cfg-1.cfg-svc.juwan.svc.cluster.local:27019"},{_id:2,host:"cfg-2.cfg-svc.juwan.svc.cluster.local:27019"}]})'

# 初始化 shard1 RS
kubectl exec -it -n juwan <shard1-pod-0> -- mongosh --port 27018 --eval 'rs.initiate({_id:"shard1-rs",members:[{_id:0,host:"shard1-0.shard1-svc.juwan.svc.cluster.local:27018"},{_id:1,host:"shard1-1.shard1-svc.juwan.svc.cluster.local:27018"},{_id:2,host:"shard1-2.shard1-svc.juwan.svc.cluster.local:27018"}]})'

# 初始化 shard2 RS
kubectl exec -it -n juwan <shard2-pod-0> -- mongosh --port 27018 --eval 'rs.initiate({_id:"shard2-rs",members:[{_id:0,host:"shard2-0.shard2-svc.juwan.svc.cluster.local:27018"},{_id:1,host:"shard2-1.shard2-svc.juwan.svc.cluster.local:27018"},{_id:2,host:"shard2-2.shard2-svc.juwan.svc.cluster.local:27018"}]})'
```

1) 通过 Mongos 注册分片并启用分片

```bash
kubectl exec -it -n juwan <mongos-pod-name> -- mongosh --port 27017 --eval 'sh.addShard("shard1-rs/shard1-0.shard1-svc.juwan.svc.cluster.local:27018,shard1-1.shard1-svc.juwan.svc.cluster.local:27018,shard1-2.shard1-svc.juwan.svc.cluster.local:27018")'
kubectl exec -it -n juwan <mongos-pod-name> -- mongosh --port 27017 --eval 'sh.addShard("shard2-rs/shard2-0.shard2-svc.juwan.svc.cluster.local:27018,shard2-1.shard2-svc.juwan.svc.cluster.local:27018,shard2-2.shard2-svc.juwan.svc.cluster.local:27018")'
kubectl exec -it -n juwan <mongos-pod-name> -- mongosh --port 27017 --eval 'sh.enableSharding("appdb")'
kubectl exec -it -n juwan <mongos-pod-name> -- mongosh --port 27017 --eval 'sh.shardCollection("appdb.user_events", {"userId": "hashed"})'
```

1) 验证分片状态

```bash
kubectl exec -it -n juwan <mongos-pod-name> -- mongosh --port 27017 --eval 'sh.status()'
```

## 4) 卸载（可选）

### Strimzi（Helm 安装场景）

```bash
helm uninstall strimzi-kafka-operator -n kafka
```

### MongoDB Operator（Helm 安装场景）

```bash
helm uninstall mongodb-kubernetes-operator -n mongodb
```
