├── .gitignore ├── Dockerfile ├── README.md ├── mongodb_microservices_containers_orchestration.pdf ├── plugin └── main.go ├── replica ├── Dockerfile ├── deployment │ └── mongo-node-deployment.yaml ├── mongo-replica-rs-withLB.yaml ├── mongo-replica-rs.yaml ├── start_replica.sh └── tmp.yaml ├── rsInit.sh └── shards ├── Dockerfile ├── build_shard.js ├── mongo-shards-configsvr-rs.yaml ├── mongo-shards-controller-rs.yaml ├── mongo-shards-starter-rc.yaml ├── run_shards.sh └── shards-rs.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | config-kube 2 | docker 3 | db 4 | config-mongo 5 | run.sh 6 | kubernetes-web-mongo-sample 7 | plugin 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mongo:latest 2 | RUN chmod 755 /sys/kernel/mm/transparent_hugepage/enabled 3 | RUN chmod 755 /sys/kernel/mm/transparent_hugepage/defrag 4 | RUN echo never > /sys/kernel/mm/transparent_hugepage/enabled 5 | RUN echo never > /sys/kernel/mm/transparent_hugepage/defrag 6 | EXPOSE 27017 7 | CMD mongod -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kubernetes-mongodb-cluster 2 | Deploy a mongo cluster on kubernetes. 3 | Based on [Enabling Microservices: Containers & Orchestration Explained](https://www.mongodb.com/collateral/microservices-containers-and-orchestration-explained) 4 | 5 | # MongoDB replica set 6 | 7 | `replica/mongo-replica-rs.yaml` creates 3 mongodb replication controllers and their corresponding services. The 3 mongodb instances can consist a replica set named as "my_replica_set". 8 | 9 | One of mongodb replication controller's yaml: 10 | ``` 11 | apiVersion: v1 12 | kind: ReplicationController 13 | metadata: 14 | name: mongo-replica-rc0 15 | labels: 16 | name: mongo-replica-rc 17 | spec: 18 | replicas: 1 19 | selector: 20 | name: mongo-replica-node0 21 | template: 22 | metadata: 23 | labels: 24 | name: mongo-replica-node0 25 | spec: 26 | containers: 27 | - name: mongo-replica-node0 28 | image: hyge/mongo-cluster 29 | env: 30 | - name: mongo_node_name 31 | value: mongo-replica-node 32 | - name: mongo_nodes_number 33 | value: "3" 34 | - name: mongo_replica_set_name 35 | value: my_replica_set 36 | ports: 37 | - containerPort: 27017 38 | volumeMounts: 39 | - name: mongo-replica-storage0 40 | mountPath: /data/db 41 | volumes: 42 | - name: mongo-replica-storage0 43 | emptyDir: {} 44 | ``` 45 | * To scale nodes of the mongo replica, promote the environmental variable "mongo_nodes_number". 46 | * Environmental variable "mongo_replica_set_name" is the name of replica set. 47 | * Environmental variable "mongo_node_name" is the name prefix for each node. The suffix of the name will be "Nth" number. It must match k8s svc's name. 48 | * See `replica/start_replica.sh` and `replica/Dockerfile` for more details. 49 | 50 | One mongo service yaml: 51 | ``` 52 | apiVersion: v1 53 | kind: Service 54 | metadata: 55 | name: mongo-replica-node-0 56 | labels: 57 | name: mongo-svc 58 | spec: 59 | clusterIP: None 60 | ports: 61 | - port: 27017 62 | targetPort: 27017 63 | protocol: TCP 64 | name: mongo-svc-port 65 | selector: 66 | name: mongo-replica-node0 67 | ``` 68 | 69 | ## How to deploy a replica set 70 | 71 | To start a 3 node mongo rs, run 72 | `kubectl create -f ./replica/mongo-replica-rs.yaml` 73 | 74 | #### Use driver to connect to mongo cluster 75 | 76 | For example: node.js 77 | ``` 78 | var connectionString = 'mongodb://mongo-replica-svc-a:27017,mongo-replica-svc-b:27017,mongo-replica-svc-c:27017/your_db?replicaSet=my_replica_set' + 79 | 80 | MongoClient.connect(connectionString, callback) 81 | ``` 82 | 83 | ### Issue 84 | 85 | Update: The bug has been fixed since k8s v1.2.4. 86 | Note: Before Kubernetes v1.2.4 has a [bug](https://github.com/kubernetes/kubernetes/issues/19930) that a pod cannot connect to itself via its service's cluster IP. I used `headless` services, which means all services do not have cluster IP and can be accessed only inside K8s cluster through service name like `mongo-replica-svc-a`. E.g. `mongodb://service-name:27017/test` 87 | * If the number of replica set members are even, you may add a mongodb arbiter to create an "imbalance" (optional). 88 | 89 | # MongoDB sharded cluster 90 | 91 | It is similar to build a replica set. 92 | 93 | `./run_shards.sh` 94 | It will deploy 3 config servers in replica set, and a `mongos` instance as controller. 95 | 96 | Then you can connect to `mongos` and add mongo instances as shards. e.g., Add replica set as one shard: `sh.addShard("my_replica_set/mongo-replica-svc-a")` 97 | -------------------------------------------------------------------------------- /mongodb_microservices_containers_orchestration.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harryge00/kubernetes-mongodb-cluster/908a476fdb4027ded65b817d1de5f88536f0d71f/mongodb_microservices_containers_orchestration.pdf -------------------------------------------------------------------------------- /plugin/main.go: -------------------------------------------------------------------------------- 1 | package k8s_client 2 | 3 | import ( 4 | "k8s.io/kubernetes/pkg/client/unversioned" 5 | restclient "k8s.io/kubernetes/pkg/client/restclient" 6 | ) 7 | 8 | // NewClient creates a new kubernetes client. 9 | func NewClient(host, username, password string) (*client.Clientset, error) { 10 | config := &restclient.Config{ 11 | Host: host, 12 | Username: username, 13 | Password: password, 14 | // TODO: For e2e cluster. Need one with DNS. 15 | Insecure: true, 16 | } 17 | client, err := unversioned.New(config) 18 | if err != nil { 19 | // handle error 20 | } 21 | pods, err := client.Pods(api.NamespaceDefault).List(api.ListOptions{}) 22 | if err != nil { 23 | // handle error 24 | } 25 | } -------------------------------------------------------------------------------- /replica/Dockerfile: -------------------------------------------------------------------------------- 1 | # mongo-cluster 2 | FROM mongo:latest 3 | 4 | EXPOSE 27017 5 | 6 | RUN mkdir -p /opt/mongo/ && \ 7 | apt-get update && apt-get install -y netcat 8 | 9 | COPY start_replica.sh /opt/mongo/ 10 | 11 | WORKDIR /opt/mongo 12 | 13 | CMD /opt/mongo/start_replica.sh 14 | -------------------------------------------------------------------------------- /replica/deployment/mongo-node-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: extensions/v1beta1 2 | kind: Deployment 3 | metadata: 4 | name: {{ mongo_node_name }} 5 | labels: 6 | name: {{ mongo_node_name }} 7 | kubernetes-admin.caicloud.io/type: solution 8 | kubernetes-admin.caicloud.io/solution: {{ solution_name }} 9 | spec: 10 | replicas: 1 11 | selector: 12 | matchLabels: 13 | name: {{ mongo_node_name }} 14 | kubernetes-admin.caicloud.io/type: solution 15 | kubernetes-admin.caicloud.io/solution: {{ solution_name }} 16 | template: 17 | metadata: 18 | labels: 19 | name: {{ mongo_node_name }} 20 | kubernetes-admin.caicloud.io/type: solution 21 | kubernetes-admin.caicloud.io/solution: {{ solution_name }} 22 | spec: 23 | containers: 24 | - name: mongo 25 | image: index.caicloud.io/caicloud/mongo:v3.2.0 26 | ports: 27 | - containerPort: 27017 28 | command: 29 | - mongod 30 | - "--replSet" 31 | - {{ mongo_replica_set_name }} 32 | -------------------------------------------------------------------------------- /replica/mongo-replica-rs-withLB.yaml: -------------------------------------------------------------------------------- 1 | #3 mongodb instances consist a replica set : "my_replica_set" 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: mongo-node-1 6 | labels: 7 | name: mongo-node-1 8 | spec: 9 | ports: 10 | - port: 27017 11 | targetPort: 27017 12 | protocol: TCP 13 | name: mongo-node-1 14 | selector: 15 | name: mongo-replica-node1 16 | type: LoadBalancer 17 | --- 18 | apiVersion: v1 19 | kind: Service 20 | metadata: 21 | name: mongo-node-b 22 | labels: 23 | name: mongo-node-b 24 | spec: 25 | ports: 26 | - port: 27017 27 | targetPort: 27017 28 | protocol: TCP 29 | name: mongo-node-b 30 | selector: 31 | name: mongo-replica-node2 32 | type: LoadBalancer 33 | --- 34 | apiVersion: v1 35 | kind: Service 36 | metadata: 37 | name: mongo-node-c 38 | labels: 39 | name: mongo-node-c 40 | spec: 41 | ports: 42 | - port: 27017 43 | targetPort: 27017 44 | protocol: TCP 45 | name: mongo-node-c 46 | selector: 47 | name: mongo-replica-node3 48 | type: LoadBalancer 49 | --- 50 | apiVersion: v1 51 | kind: ReplicationController 52 | metadata: 53 | name: mongo-replica-rc1 54 | labels: 55 | name: mongo-replica-rc 56 | spec: 57 | replicas: 1 58 | selector: 59 | name: mongo-replica-node1 60 | template: 61 | metadata: 62 | labels: 63 | name: mongo-replica-node1 64 | spec: 65 | containers: 66 | - name: mongo-replica-node1 67 | image: index.caicloud.io/caicloud/mongo:3.2 68 | ports: 69 | - containerPort: 27017 70 | volumeMounts: 71 | - name: mongo-replica-storage1 72 | mountPath: /data/db 73 | volumes: 74 | - name: mongo-replica-storage1 75 | emptyDir: {} 76 | --- 77 | apiVersion: v1 78 | kind: ReplicationController 79 | metadata: 80 | name: mongo-replica-rc2 81 | labels: 82 | name: mongo-replica-rc 83 | spec: 84 | replicas: 1 85 | selector: 86 | name: mongo-replica-node2 87 | template: 88 | metadata: 89 | labels: 90 | name: mongo-replica-node2 91 | spec: 92 | containers: 93 | - name: mongo-replica-node2 94 | image: index.caicloud.io/caicloud/mongo:3.2 95 | ports: 96 | - containerPort: 27017 97 | volumeMounts: 98 | - name: mongo-replica-storage2 99 | mountPath: /data/db 100 | volumes: 101 | - name: mongo-replica-storage2 102 | emptyDir: {} 103 | --- 104 | apiVersion: v1 105 | kind: ReplicationController 106 | metadata: 107 | name: mongo-replica-rc3 108 | labels: 109 | name: mongo-replica-rc 110 | spec: 111 | replicas: 1 112 | selector: 113 | name: mongo-replica-node3 114 | template: 115 | metadata: 116 | labels: 117 | name: mongo-replica-node3 118 | spec: 119 | containers: 120 | - name: mongo-replica-node3 121 | image: index.caicloud.io/caicloud/mongo:3.2 122 | ports: 123 | - containerPort: 27017 124 | volumeMounts: 125 | - name: mongo-replica-storage3 126 | mountPath: /data/db 127 | volumes: 128 | - name: mongo-replica-storage3 129 | emptyDir: {} -------------------------------------------------------------------------------- /replica/mongo-replica-rs.yaml: -------------------------------------------------------------------------------- 1 | #3 mongodb instances consist a replica set : "my_replica_set" 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: mongo-replica-node-0 6 | labels: 7 | name: mongo-svc 8 | spec: 9 | clusterIP: None 10 | ports: 11 | - port: 27017 12 | targetPort: 27017 13 | protocol: TCP 14 | name: mongo-svc-port 15 | selector: 16 | name: mongo-replica-node0 17 | --- 18 | apiVersion: v1 19 | kind: Service 20 | metadata: 21 | name: mongo-replica-node-1 22 | labels: 23 | name: mongo-svc 24 | spec: 25 | clusterIP: None 26 | ports: 27 | - port: 27017 28 | targetPort: 27017 29 | protocol: TCP 30 | name: mongo-svc-port 31 | selector: 32 | name: mongo-replica-node1 33 | --- 34 | apiVersion: v1 35 | kind: Service 36 | metadata: 37 | name: mongo-replica-node-2 38 | labels: 39 | name: mongo-svc 40 | spec: 41 | clusterIP: None 42 | ports: 43 | - port: 27017 44 | targetPort: 27017 45 | protocol: TCP 46 | name: mongo-svc-port 47 | selector: 48 | name: mongo-replica-node2 49 | --- 50 | apiVersion: v1 51 | kind: ReplicationController 52 | metadata: 53 | name: mongo-replica-rc0 54 | labels: 55 | name: mongo-replica-rc 56 | spec: 57 | replicas: 1 58 | selector: 59 | name: mongo-replica-node0 60 | template: 61 | metadata: 62 | labels: 63 | name: mongo-replica-node0 64 | spec: 65 | containers: 66 | - name: mongo-replica-node0 67 | image: hyge/mongo-cluster 68 | env: 69 | - name: mongo_node_name 70 | value: mongo-replica-node 71 | - name: mongo_nodes_number 72 | value: "3" 73 | - name: mongo_replica_set_name 74 | value: my_replica_set 75 | ports: 76 | - containerPort: 27017 77 | volumeMounts: 78 | - name: mongo-replica-storage0 79 | mountPath: /data/db 80 | volumes: 81 | - name: mongo-replica-storage0 82 | emptyDir: {} 83 | --- 84 | apiVersion: v1 85 | kind: ReplicationController 86 | metadata: 87 | name: mongo-replica-rc1 88 | labels: 89 | name: mongo-replica-rc 90 | spec: 91 | replicas: 1 92 | selector: 93 | name: mongo-replica-node1 94 | template: 95 | metadata: 96 | labels: 97 | name: mongo-replica-node1 98 | spec: 99 | containers: 100 | - name: mongo-replica-node1 101 | image: hyge/mongo-cluster 102 | env: 103 | - name: mongo_node_name 104 | value: mongo-replica-node 105 | - name: mongo_nodes_number 106 | value: "3" 107 | - name: mongo_replica_set_name 108 | value: my_replica_set 109 | ports: 110 | - containerPort: 27017 111 | volumeMounts: 112 | - name: mongo-replica-storage1 113 | mountPath: /data/db 114 | volumes: 115 | - name: mongo-replica-storage1 116 | emptyDir: {} 117 | --- 118 | apiVersion: v1 119 | kind: ReplicationController 120 | metadata: 121 | name: mongo-replica-rc2 122 | labels: 123 | name: mongo-replica-rc 124 | spec: 125 | replicas: 1 126 | selector: 127 | name: mongo-replica-node2 128 | template: 129 | metadata: 130 | labels: 131 | name: mongo-replica-node2 132 | spec: 133 | containers: 134 | - name: mongo-replica-node2 135 | image: hyge/mongo-cluster 136 | env: 137 | - name: mongo_node_name 138 | value: mongo-replica-node 139 | - name: mongo_nodes_number 140 | value: "3" 141 | - name: mongo_replica_set_name 142 | value: my_replica_set 143 | ports: 144 | - containerPort: 27017 145 | volumeMounts: 146 | - name: mongo-replica-storage2 147 | mountPath: /data/db 148 | volumes: 149 | - name: mongo-replica-storage2 150 | emptyDir: {} -------------------------------------------------------------------------------- /replica/start_replica.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ ! -z "$mongo_node_name" ] && [ ! -z "$mongo_replica_set_name" ]; then 4 | # Create a mongo shell to initialize the replica set. 5 | # Required environmental variables: $mongo_replica_set_name, $mongo_nodes_number, $mongo_node_name 6 | content="rs.initiate({_id:\"$mongo_replica_set_name\", members: [" 7 | mongo_members="{_id: 0, host:\"${mongo_node_name}-0\"}" 8 | i=1 9 | while [ $i -lt $mongo_nodes_number ]; do 10 | mongo_members="$mongo_members, {_id:$i, host:\"${mongo_node_name}-$i\"}" 11 | ((i++)); 12 | done; 13 | content="$content $mongo_members]});" 14 | # create the mongo-shell file: replica_init.js 15 | echo $content > replica_init.js 16 | 17 | mongod --replSet $mongo_replica_set_name & 18 | until nc -z localhost 27017 19 | do 20 | echo "Wait mongoDB to be ready" 21 | sleep 1 22 | done 23 | echo "MongoDB is ready" 24 | # Start replica set 25 | mongo < ./replica_init.js 26 | tail -f /dev/null 27 | else 28 | echo "Starting up in standalone mode" 29 | mongod 30 | fi -------------------------------------------------------------------------------- /replica/tmp.yaml: -------------------------------------------------------------------------------- 1 | #3 mongodb instances consist a replica set : "my_replica_set" 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | name: mongo-replica-node-0 6 | labels: 7 | name: mongo-svc 8 | spec: 9 | clusterIP: None 10 | ports: 11 | - port: 27017 12 | targetPort: 27017 13 | protocol: TCP 14 | name: mongo-svc-port 15 | selector: 16 | name: mongo-replica-node0 17 | --- 18 | apiVersion: v1 19 | kind: Service 20 | metadata: 21 | name: mongo-replica-node-1 22 | labels: 23 | name: mongo-svc 24 | spec: 25 | clusterIP: None 26 | ports: 27 | - port: 27017 28 | targetPort: 27017 29 | protocol: TCP 30 | name: mongo-svc-port 31 | selector: 32 | name: mongo-replica-node1 33 | --- 34 | apiVersion: v1 35 | kind: Service 36 | metadata: 37 | name: mongo-replica-node-2 38 | labels: 39 | name: mongo-svc 40 | spec: 41 | clusterIP: None 42 | ports: 43 | - port: 27017 44 | targetPort: 27017 45 | protocol: TCP 46 | name: mongo-svc-port 47 | selector: 48 | name: mongo-replica-node2 -------------------------------------------------------------------------------- /rsInit.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/harryge00/kubernetes-mongodb-cluster/908a476fdb4027ded65b817d1de5f88536f0d71f/rsInit.sh -------------------------------------------------------------------------------- /shards/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mongo:latest 2 | CMD ["mongos","--configdb", "configReplSet/localhost:27012,localhost:27013,localhost:27014"] 3 | EXPOSE 27017 4 | -------------------------------------------------------------------------------- /shards/build_shard.js: -------------------------------------------------------------------------------- 1 | rs.initiate({ 2 | _id:"configReplSet", 3 | configsvr: true, 4 | members: 5 | [{ _id:0, host:"mongo-svc-configsvr-a:27019" }, 6 | { _id:1, host:"mongo-svc-configsvr-b:27019" }, 7 | { _id:2, host:"mongo-svc-configsvr-c:27019" } 8 | ]}); 9 | rs. -------------------------------------------------------------------------------- /shards/mongo-shards-configsvr-rs.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: mongo-cfgsvr-svc-a 5 | labels: 6 | name: mongo-cfgsvr-svc-a 7 | spec: 8 | clusterIP: None 9 | ports: 10 | - port: 27019 11 | targetPort: 27019 12 | protocol: TCP 13 | selector: 14 | name: mongo-configsvr-node1 15 | --- 16 | apiVersion: v1 17 | kind: Service 18 | metadata: 19 | name: mongo-cfgsvr-svc-b 20 | labels: 21 | name: mongo-cfgsvr-svc-b 22 | spec: 23 | clusterIP: None 24 | ports: 25 | - port: 27019 26 | targetPort: 27019 27 | protocol: TCP 28 | selector: 29 | name: mongo-configsvr-node2 30 | --- 31 | apiVersion: v1 32 | kind: Service 33 | metadata: 34 | name: mongo-cfgsvr-svc-c 35 | labels: 36 | name: mongo-cfgsvr-svc-c 37 | spec: 38 | clusterIP: None 39 | ports: 40 | - port: 27019 41 | targetPort: 27019 42 | protocol: TCP 43 | selector: 44 | name: mongo-configsvr-node3 45 | --- 46 | apiVersion: v1 47 | kind: ReplicationController 48 | metadata: 49 | name: mongo-configsvr-rc1 50 | labels: 51 | name: mongo-configsvr-rc 52 | spec: 53 | replicas: 1 54 | selector: 55 | name: mongo-configsvr-node1 56 | template: 57 | metadata: 58 | labels: 59 | name: mongo-configsvr-node1 60 | spec: 61 | containers: 62 | - name: mongo-configsvr-node1 63 | image: index.caicloud.io/caicloud/mongo:3.2 64 | command: 65 | - mongod 66 | - "--configsvr" 67 | - "--replSet" 68 | - configReplSet 69 | ports: 70 | - containerPort: 27019 71 | volumeMounts: 72 | - name: mongo-persistent-storage1 73 | mountPath: /data/db 74 | volumes: 75 | - name: mongo-persistent-storage1 76 | emptyDir: {} 77 | --- 78 | apiVersion: v1 79 | kind: ReplicationController 80 | metadata: 81 | name: mongo-configsvr-rc2 82 | labels: 83 | name: mongo-configsvr-rc 84 | spec: 85 | replicas: 1 86 | selector: 87 | name: mongo-configsvr-node2 88 | template: 89 | metadata: 90 | labels: 91 | name: mongo-configsvr-node2 92 | spec: 93 | containers: 94 | - name: mongo-configsvr-node2 95 | image: index.caicloud.io/caicloud/mongo:3.2 96 | command: 97 | - mongod 98 | - "--configsvr" 99 | - "--replSet" 100 | - configReplSet 101 | ports: 102 | - containerPort: 27019 103 | volumeMounts: 104 | - name: mongo-persistent-storage2 105 | mountPath: /data/db 106 | volumes: 107 | - name: mongo-persistent-storage2 108 | emptyDir: {} 109 | --- 110 | apiVersion: v1 111 | kind: ReplicationController 112 | metadata: 113 | name: mongo-configsvr-rc3 114 | labels: 115 | name: mongo-configsvr-rc 116 | spec: 117 | replicas: 1 118 | selector: 119 | name: mongo-configsvr-node3 120 | template: 121 | metadata: 122 | labels: 123 | name: mongo-configsvr-node3 124 | spec: 125 | containers: 126 | - name: mongo-configsvr-node3 127 | image: index.caicloud.io/caicloud/mongo:3.2 128 | command: 129 | - mongod 130 | - "--configsvr" 131 | - "--replSet" 132 | - configReplSet 133 | ports: 134 | - containerPort: 27019 135 | volumeMounts: 136 | - name: mongo-persistent-storage3 137 | mountPath: /data/db 138 | volumes: 139 | - name: mongo-persistent-storage3 140 | emptyDir: {} -------------------------------------------------------------------------------- /shards/mongo-shards-controller-rs.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: mongo-shardsctl-svc 5 | labels: 6 | name: mongo-shardsctl-svc 7 | spec: 8 | clusterIP: None 9 | ports: 10 | - port: 27017 11 | targetPort: 27017 12 | protocol: TCP 13 | selector: 14 | name: mongo-shardsctl 15 | --- 16 | apiVersion: v1 17 | kind: ReplicationController 18 | metadata: 19 | name: mongo-shardsctl-rc 20 | labels: 21 | name: mongo-shardsctl-rc 22 | spec: 23 | replicas: 1 24 | selector: 25 | name: mongo-shardsctl 26 | template: 27 | metadata: 28 | labels: 29 | name: mongo-shardsctl 30 | spec: 31 | containers: 32 | - name: mongo-shardsctl 33 | image: index.caicloud.io/caicloud/mongo:3.2 34 | command: 35 | - mongos 36 | - "--configdb" 37 | - "configReplSet/mongo-cfgsvr-svc-a:27019,mongo-cfgsvr-svc-a:27019,mongo-cfgsvr-svc-a:27019" 38 | ports: 39 | - containerPort: 27017 -------------------------------------------------------------------------------- /shards/mongo-shards-starter-rc.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ReplicationController 3 | metadata: 4 | name: mongo-shards-starter 5 | labels: 6 | name: mongo-shards-rc 7 | spec: 8 | replicas: 1 9 | template: 10 | metadata: 11 | labels: 12 | name: mongo-shards-starter 13 | spec: 14 | containers: 15 | - name: mongo-shards-starter 16 | image: index.caicloud.io/caicloud/mongo:shards-starter3 #this image has .js which initialize the Replica set 17 | ports: 18 | - containerPort: 27017 19 | volumeMounts: 20 | - name: mongo-shards-starter-storage 21 | mountPath: /data/db 22 | volumes: 23 | - name: mongo-shards-starter-storage 24 | emptyDir: {} -------------------------------------------------------------------------------- /shards/run_shards.sh: -------------------------------------------------------------------------------- 1 | echo "building 3 mongodb config servers" 2 | kubectl create -f mongo-shards-configsvr-rs.yaml 3 | #wait until the mongodb finish initiation 4 | sleep 15; 5 | echo "initializing mongodb shards" 6 | kubectl create -f mongo-shards-starter-rc.yaml 7 | kubectl create -f mongo-shards-controller-rs.yaml 8 | echo "delete shards starter" 9 | kubectl delete rc mongo-shards-starter -------------------------------------------------------------------------------- /shards/shards-rs.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: mongo-svc-shardsctl 5 | labels: 6 | name: mongo-svc-shardsctl 7 | spec: 8 | clusterIP: None 9 | ports: 10 | - port: 27017 11 | targetPort: 27017 12 | protocol: TCP 13 | name: mongo-svc-shardsctl 14 | selector: 15 | name: mongos-node 16 | --- 17 | apiVersion: v1 18 | kind: ReplicationController 19 | metadata: 20 | name: mongos-rc 21 | labels: 22 | name: mongos-rc 23 | spec: 24 | replicas: 1 25 | selector: 26 | name: mongos-node 27 | template: 28 | metadata: 29 | labels: 30 | name: mongos-node 31 | spec: 32 | containers: 33 | - name: mongos-node 34 | image: index.caicloud.io/caicloud/mongo:3.2 35 | command: 36 | - mongos 37 | - "--configdb" 38 | - "configReplSet/mongo-svc-configsvr-a:27019,mongo-svc-configsvr-b:27019,mongo-svc-configsvr-c:27019" 39 | ports: 40 | - containerPort: 27017 41 | --- 42 | apiVersion: v1 43 | kind: Service 44 | metadata: 45 | name: mongo-svc-shard-db-a 46 | labels: 47 | name: mongo-svc-shard-db-a 48 | spec: 49 | type: LoadBalancer 50 | clusterIP: None 51 | ports: 52 | - port: 27017 53 | targetPort: 27017 54 | protocol: TCP 55 | name: mongo-svc-shard-db-a 56 | selector: 57 | name: mongo-db-a 58 | --- 59 | apiVersion: v1 60 | kind: ReplicationController 61 | metadata: 62 | name: mongo-rc-shard-db-a 63 | labels: 64 | name: mongo-rc-shard 65 | spec: 66 | replicas: 1 67 | selector: 68 | name: mongo-db-a 69 | template: 70 | metadata: 71 | labels: 72 | name: mongo-db-a 73 | spec: 74 | containers: 75 | - name: mongo-shard-db-a 76 | image: index.caicloud.io/caicloud/mongo:3.2 77 | command: 78 | - mongod 79 | ports: 80 | - containerPort: 27017 81 | volumeMounts: 82 | - name: mongo-persistent-storage-a 83 | mountPath: /data/db 84 | volumes: 85 | - name: mongo-persistent-storage-a 86 | emptyDir: {} 87 | --- 88 | apiVersion: v1 89 | kind: Service 90 | metadata: 91 | name: mongo-svc-shard-db-b 92 | labels: 93 | name: mongo-svc-shard-db-b 94 | spec: 95 | type: LoadBalancer 96 | clusterIP: None 97 | ports: 98 | - port: 27017 99 | targetPort: 27017 100 | protocol: TCP 101 | name: mongo-svc-shard-db-b 102 | selector: 103 | name: mongo-db-b 104 | --- 105 | apiVersion: v1 106 | kind: ReplicationController 107 | metadata: 108 | name: mongo-rc-shard-db-b 109 | labels: 110 | name: mongo-rc-shard 111 | spec: 112 | replicas: 1 113 | selector: 114 | name: mongo-db-b 115 | template: 116 | metadata: 117 | labels: 118 | name: mongo-db-b 119 | spec: 120 | containers: 121 | - name: mongo-shard-db-a 122 | image: index.caicloud.io/caicloud/mongo:3.2 123 | command: 124 | - mongod 125 | ports: 126 | - containerPort: 27017 127 | volumeMounts: 128 | - name: mongo-persistent-storage-b 129 | mountPath: /data/db 130 | volumes: 131 | - name: mongo-persistent-storage-b 132 | emptyDir: {} --------------------------------------------------------------------------------