Kubernetes部署高可用MongoDB集群
<p> </p><p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">在Kubernetes中,部署MongoDB主要用到的是<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">mongo-db-sidecar</code>。<br style="box-sizing: border-box">Docker Hub</p>
<h3 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 20px">1. 架构</h3>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">Mongodb的集群搭建方式主要有三种,主从模式,Replica set模式,sharding模式, 三种模式各有优劣,适用于不同的场合,属Replica set应用最为广泛,主从模式现在用的较少,sharding模式最为完备,但配置维护较为复杂。<br style="box-sizing: border-box"><code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">mongo-db-sidecar</code>使用的是Replica set模式,Mongodb的Replica Set即副本集方式主要有两个目的,一个是数据冗余做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。另一个是做读写分离,读的请求分流到副本上,减轻主(Primary)的读压力。<br style="box-sizing: border-box">二进制部署MongoDB集群无需其他服务,直接在主节点执行类似以下的命令即可创建集群:</p>
<pre><code class="hljs javascript" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">cfg={ <span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">_id</span>:<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"testdb"</span>, <span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">members</span>:[ {<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">_id</span>:<span class="hljs-number" style="box-sizing: border-box">0</span>,<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">host</span>:<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'192.168.255.141:27017'</span>,<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">priority</span>:<span class="hljs-number" style="box-sizing: border-box">2</span>}, {<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">_id</span>:<span class="hljs-number" style="box-sizing: border-box">1</span>,<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">host</span>:<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'192.168.255.142:27017'</span>,<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">priority</span>:<span class="hljs-number" style="box-sizing: border-box">1</span>}, {<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">_id</span>:<span class="hljs-number" style="box-sizing: border-box">2</span>,<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">host</span>:<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'192.168.255.142:27019'</span>,<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">arbiterOnly</span>:<span class="hljs-literal" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">true</span>}] };
rs.initiate(cfg)</code></pre>
<hr style="box-sizing: content-box; height: 0; margin: 1.5em auto; border-top: 2px dotted rgba(238, 238, 238, 1); border-right: 0; border-bottom: 0; border-left: 0; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">
<h3 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 20px">2. 部署</h3>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace"><span style="box-sizing: border-box; font-weight: bold">本文是部署Mongodb的实践,因为此服务需要用到<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">namespace</code>下的<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">pods</code>的<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">list</code>权限进行集群操作,所以如果在实际部署时,请记得先进行2.5的RBAC操作,然后再进行2.4的Statefulset部署。</span></p>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">2.1 Namespace</h4>
<pre><code class="hljs sql" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">kubectl <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">create</span> ns mongo</code></pre>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">2.2 StorageClass</h4>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">这里需要提前部署好NFS或者其他可提供SC的存储集群。<br style="box-sizing: border-box">Kubernetes使用NFS做持久化存储</p>
<pre><code class="hljs shell" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">#</span><span class="bash" style="box-sizing: border-box"> mongo-clutser-sc.yaml</span>
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mongodb-data
provisioner: fuseim.pri/ifs
<span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">
#</span><span class="bash" style="box-sizing: border-box"> create</span>
kubectl create -f mongo-clutser-sc.yaml</code></pre>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">2.3 Headless Service</h4>
<pre><code class="hljs python" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">apiVersion: v1
kind: Service
metadata:
name: mongo
namespace: mongo
labels:
name: mongo
spec:
ports:
- port: <span class="hljs-number" style="box-sizing: border-box">27017</span>
targetPort: <span class="hljs-number" style="box-sizing: border-box">27017</span>
clusterIP: <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">None</span>
selector:
role: mongo</code></pre>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">2.4 Statefulset</h4>
<pre><code class="hljs cpp" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongo
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">namespace</span>: mongo
spec:
serviceName: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"mongo"</span>
replicas: <span class="hljs-number" style="box-sizing: border-box">3</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">template</span>:
metadata:
labels:
role: mongo
environment: prod
spec:
terminationGracePeriodSeconds: <span class="hljs-number" style="box-sizing: border-box">10</span>
containers:
- name: mongo
image: harbor.s.com/redis/mongo:<span class="hljs-number" style="box-sizing: border-box">3.4</span><span class="hljs-number" style="box-sizing: border-box">.22</span>
command:
- mongod
- <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"--replSet"</span>
- rs0
- <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"--bind_ip"</span>
- <span class="hljs-number" style="box-sizing: border-box">0.0</span><span class="hljs-number" style="box-sizing: border-box">.0</span><span class="hljs-number" style="box-sizing: border-box">.0</span>
- <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"--smallfiles"</span>
- <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"--noprealloc"</span>
ports:
- containerPort: <span class="hljs-number" style="box-sizing: border-box">27017</span>
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
- name: mongo-sidecar
image: harbor.s.com/redis/mongo-k8s-sidecar
env:
- name: MONGO_SIDECAR_POD_LABELS
value: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"role=mongo,environment=prod"</span>
volumeClaimTemplates:
- metadata:
name: mongo-persistent-storage
spec:
accessModes: [<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ReadWriteOnce"</span>]
storageClassName: mongodb-data
resources:
requests:
storage: <span class="hljs-number" style="box-sizing: border-box">10</span>Gi</code></pre>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">2.5 RBAC</h4>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">这时候查看集群状态,发现是不可用的。</p>
<pre><code class="hljs sql" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">kubectl exec -it mongo-0 -n mongo <span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)">-- mongo</span>
Defaulting container name to mongo.
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">Use</span> <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'kubectl describe pod/mongo-0 -n mongo'</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">to</span> see all <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">of</span> the containers <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">in</span> this pod.
MongoDB shell <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">version</span> v3<span class="hljs-number" style="box-sizing: border-box">.4</span><span class="hljs-number" style="box-sizing: border-box">.22</span>
connecting <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">to</span>: mongodb://<span class="hljs-number" style="box-sizing: border-box">127.0</span><span class="hljs-number" style="box-sizing: border-box">.0</span><span class="hljs-number" style="box-sizing: border-box">.1</span>:<span class="hljs-number" style="box-sizing: border-box">27017</span>
MongoDB <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">server</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">version</span>: <span class="hljs-number" style="box-sizing: border-box">3.4</span><span class="hljs-number" style="box-sizing: border-box">.22</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">Server</span> has <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">startup</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">warnings</span>:
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.039</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.039</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">WARNING</span>: <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">Access</span> control <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">is</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">not</span> enabled <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">for</span> the database.
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.039</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">Read</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">and</span> write <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">access</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">to</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">data</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">and</span> configuration <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">is</span> unrestricted.
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.039</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">WARNING</span>: You <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">are</span> running this process <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">as</span> the root <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">user</span>, which <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">is</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">not</span> recommended.
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.039</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">WARNING</span>: /<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">sys</span>/kernel/mm/transparent_hugepage/enabled <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">is</span> <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'always'</span>.
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** We suggest setting it <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">to</span> <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'never'</span>
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">WARNING</span>: /<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">sys</span>/kernel/mm/transparent_hugepage/defrag <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">is</span> <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'always'</span>.
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL ** We suggest setting it <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">to</span> <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'never'</span>
<span class="hljs-number" style="box-sizing: border-box">2019</span><span class="hljs-number" style="box-sizing: border-box">-08</span><span class="hljs-number" style="box-sizing: border-box">-24</span>T09:<span class="hljs-number" style="box-sizing: border-box">23</span>:<span class="hljs-number" style="box-sizing: border-box">57.040</span>+<span class="hljs-number" style="box-sizing: border-box">0000</span> I CONTROL
> rs.status()
{
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"info"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"run rs.initiate(...) if not yet done for the set"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ok"</span> : <span class="hljs-number" style="box-sizing: border-box">0</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"errmsg"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"no replset config has been received"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"code"</span> : <span class="hljs-number" style="box-sizing: border-box">94</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"codeName"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"NotYetInitialized"</span>
}
> </code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">应该是<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">mongo k8s sidecar</code>没有正确的配置,查看其日志:</p>
<pre><code class="hljs javascript" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">kubectl logs mongo<span class="hljs-number" style="box-sizing: border-box">-0</span> mongo-sidecar -n mongo
···
<span class="hljs-built_in" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">Error</span> <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">in</span> workloop { [<span class="hljs-built_in" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">Error</span>: ]
message:
{ <span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">kind</span>: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'Status'</span>,
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">apiVersion</span>: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'v1'</span>,
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">metadata</span>: {},
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">status</span>: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'Failure'</span>,
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">message</span>:
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'pods is forbidden: User "system:serviceaccount:mongo:default" cannot list resource "pods" in API group "" at the cluster scope'</span>,
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">reason</span>: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'Forbidden'</span>,
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">details</span>: { <span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">kind</span>: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">'pods'</span> },
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">code</span>: <span class="hljs-number" style="box-sizing: border-box">403</span> },
<span class="hljs-attr" style="box-sizing: border-box; color: rgba(255, 0, 0, 1)">statusCode</span>: <span class="hljs-number" style="box-sizing: border-box">403</span> }</code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">信息显示默认分配的sa账号没有list此namespace下pods的权限,搜索了下这个问题早在很久之前在github上就有人提出,作者也给出了对应的解决方案,需要给默认的sa账号提权,增加list pods的权限,但是实际测试发现虽然给<code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 12.6px; padding: 2px 4px; color: rgba(199, 37, 78, 1); background-color: rgba(249, 242, 244, 1); border-radius: 4px">system:serviceaccount:mongo:dafault</code>赋予pods的list权限,仍然会报错,以下是rbac配置:<br style="box-sizing: border-box">mongo-k8s-sidecar/role.yaml at 2640ed1c2971b1279c2961efd257cde9fbe39574 · cvallance/mongo-k8s-sidecar · GitHub</p>
<pre><code class="hljs cpp" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"># 使用后仍然无用的配置
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">namespace</span>: mongo
name: mongo-pod-read
rules:
- apiGroups: [<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>]
resources: [<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"pods"</span>]
verbs: [<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"get"</span>, <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"watch"</span>, <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"list"</span>]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: mongo-pod-read
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">namespace</span>: mongo
subjects:
- kind: ServiceAccount
name: <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">default</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">namespace</span>: mongo
roleRef:
kind: Role
name: mongo-pod-read
apiGroup: rbac.authorization.k8s.io</code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">所以我们需要重新想办法,给此sa更大的权限,这里使用默认的clusterrole view权限进行赋权,我们可以使用clusterrole对sa进行界定namespace的赋权,相当于clusterrole是一个可以进行clusterrole与role进行binding的模板:<br style="box-sizing: border-box">GCE - K8s 1.8 - pods is forbidden - Cannot list pods - Unknown user "system:serviceaccount:default:default" · Issue #75 · cvallance/mongo-k8s-sidecar · GitHub</p>
<pre><code class="hljs cs" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)"># 正确的rbac配置</span>
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: mongo-<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">default</span>-view
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: view
subjects:
- kind: ServiceAccount
name: <span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">default</span>
<span class="hljs-keyword" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">namespace</span>: <span class="hljs-title" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">mongo</span></code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">但是pod在创建后,是无法更换sa账号与sa权限的,所以需要重建pod:</p>
<pre><code class="hljs shell" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">#</span><span class="bash" style="box-sizing: border-box"> 查看statefulset</span>
kubectl get statefulset -n mongo
NAME READY AGE
mongo 3/3 23h
<span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">
#</span><span class="bash" style="box-sizing: border-box"> scale</span>
kubectl scale statefulset mongo -n mongo --replicas=0
statefulset.apps/mongo scaled
<span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">
#</span><span class="bash" style="box-sizing: border-box"> 过会重新配置副本数为3</span>
kubectl scale statefulset mongo -n mongo --replicas=3
statefulset.apps/mongo scaled
<span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">
#</span><span class="bash" style="box-sizing: border-box"> 查看已经建立完毕</span>
kubectl get all -n mongo
NAME READY STATUS RESTARTS AGE
pod/mongo-0 2/2 Running 0 21s
pod/mongo-1 2/2 Running 0 17s
pod/mongo-2 2/2 Running 0 12s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mongo ClusterIP None <none> 27017/TCP 23h
NAME READY AGE
statefulset.apps/mongo 3/3 23h
</code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">再次查看集群状态,发现状态已经正常,集群创建成功:</p>
<pre><code class="hljs bash" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">kubectl <span class="hljs-built_in" style="box-sizing: border-box; color: rgba(0, 0, 255, 1)">exec</span> -it mongo-0 -n mongo -- mongo
rs0:PRIMARY> rs.<span class="hljs-function" style="box-sizing: border-box"><span class="hljs-title" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">status</span></span>()
{
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"set"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"rs0"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"date"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:12.550Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"myState"</span> : 1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"term"</span> : NumberLong(2),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncingTo"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceHost"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceId"</span> : -1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"heartbeatIntervalMillis"</span> : NumberLong(2000),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimes"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastCommittedOpTime"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"appliedOpTime"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"durableOpTime"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
}
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"members"</span> : [
{
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"_id"</span> : 0,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"name"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.4.87:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"health"</span> : 1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"state"</span> : 2,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"stateStr"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"SECONDARY"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"uptime"</span> : 19,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optime"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDurable"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDate"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:05Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDurableDate"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:05Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeat"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:11.877Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeatRecv"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:11.192Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"pingMs"</span> : NumberLong(0),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeatMessage"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncingTo"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.3.65:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceHost"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.3.65:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceId"</span> : 3,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"infoMessage"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"configVersion"</span> : 171757
},
{
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"_id"</span> : 1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"name"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.5.9:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"health"</span> : 1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"state"</span> : 2,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"stateStr"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"SECONDARY"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"uptime"</span> : 19,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optime"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDurable"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDate"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:05Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDurableDate"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:05Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeat"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:11.875Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeatRecv"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:11.478Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"pingMs"</span> : NumberLong(0),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeatMessage"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncingTo"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.4.87:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceHost"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.4.87:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceId"</span> : 0,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"infoMessage"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"configVersion"</span> : 171757
},
{
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"_id"</span> : 3,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"name"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"10.244.3.65:27017"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"health"</span> : 1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"state"</span> : 1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"stateStr"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"PRIMARY"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"uptime"</span> : 80,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optime"</span> : {
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ts"</span> : Timestamp(1566723485, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"t"</span> : NumberLong(2)
},
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"optimeDate"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:58:05Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncingTo"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceHost"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"syncSourceId"</span> : -1,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"infoMessage"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"could not find member to sync from"</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"electionTime"</span> : Timestamp(1566723473, 1),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"electionDate"</span> : ISODate(<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"2019-08-25T08:57:53Z"</span>),
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"configVersion"</span> : 171757,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"self"</span> : <span class="hljs-literal" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">true</span>,
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"lastHeartbeatMessage"</span> : <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">""</span>
}
],
<span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"ok"</span> : 1
}
rs0:PRIMARY> </code></pre>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">2.6 扩容</h4>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">如果需要对mongo扩容,只需要调整statefulset的replicas即可:</p>
<pre><code class="hljs sql" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">kubectl scale statefulset mongo <span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)">--replicas=4 -n mongo</span></code></pre>
<hr style="box-sizing: content-box; height: 0; margin: 1.5em auto; border-top: 2px dotted rgba(238, 238, 238, 1); border-right: 0; border-bottom: 0; border-left: 0; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">
<h3 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 20px">3. 使用/访问</h3>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">mongo cluster访问默认连接为:</p>
<pre><code class="hljs cpp" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">mongodb:<span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)">//mongo1,mongo2,mongo3:27017/dbname_?</span></code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">在kubernetes中最常用的FQDN连接服务的连接为:</p>
<pre><code class="hljs shell" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-meta" style="box-sizing: border-box; color: rgba(43, 145, 175, 1)">#</span><span class="bash" style="box-sizing: border-box">appName.<span class="hljs-variable" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)">$HeadlessServiceName</span>.<span class="hljs-variable" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)">$Namespace</span>.svc.cluster.local</span></code></pre>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">因为我们采用statefulset部署的pod,所以命名均有规则,所以实际上如果连接4副本的mongodb cluster,上面的默认连接该为(默认为namespace之外):</p>
<pre><code class="hljs cpp" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px">mongodb:<span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)">//mongo-0.mongo.mongo.svc.cluster.local:27017,mongo-1.mongo.mongo.svc.cluster.local:27017,mongo-2.mongo.mongo.svc.cluster.local:27017,mongo-3.mongo.mongo.svc.cluster.local:27017/?replicaSet=rs0</span></code></pre>
<hr style="box-sizing: content-box; height: 0; margin: 1.5em auto; border-top: 2px dotted rgba(238, 238, 238, 1); border-right: 0; border-bottom: 0; border-left: 0; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">
<h3 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 20px">4. 监控</h3>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">使用helm chart prometheus-mongodb-exporter进行监控。</p>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">4.1 部署exporter</h4>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace"><span style="box-sizing: border-box; font-weight: bold">注意,这里的uri后如果是集群,必须使用“”,不然会各种告警,我在这踩了无数的坑</span><br style="box-sizing: border-box">看起来uri是固定的,而不是自动发现,所以如果需要对集群的副本进行增加或删除,则需要helm修改uri,更新配置后重建pod。<br style="box-sizing: border-box">image是为了内网容易部署,将默认image下载后放入harbor,并未做任何其他修改,可忽略。</p>
<pre><code class="hljs python" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)"># vi values.yaml 编辑定制参数</span>
mongodb:
uri: <span class="hljs-string" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">"mongodb://mongo-0.mongo.mongo.svc.cluster.local:27017,mongo-1.mongo.mongo.svc.cluster.local:27017,mongo-2.mongo.mongo.svc.cluster.local:27017,mongo-3.mongo.mongo.svc.cluster.local:27017/?replicaSet=rs0"</span>
image:
repository: harbor.s.com/mongo/mongodb-exporter
tag: <span class="hljs-number" style="box-sizing: border-box">0.7</span><span class="hljs-number" style="box-sizing: border-box">.0</span></code></pre>
<pre><code class="hljs nginx" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)"># 部署</span>
<span class="hljs-attribute" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">helm</span> upgrade --install mongo-exporter stable/prometheus-mongodb-exporter -f values.yaml --namespace mongo --force</code></pre>
<pre><code class="hljs nginx" style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: inherit; padding: 0; color: rgba(0, 0, 0, 1); background-color: rgba(0, 0, 0, 0); border-radius: 0; overflow-wrap: normal; display: block; overflow-x: auto; position: relative; margin: 10px 10px 1px 50px"><span class="hljs-comment" style="box-sizing: border-box; color: rgba(0, 128, 0, 1)"># 查看结果</span>
<span class="hljs-attribute" style="box-sizing: border-box; color: rgba(163, 21, 21, 1)">kubectl</span> port-forward service/mongo-exporter-prometheus-mongodb-exporter <span class="hljs-number" style="box-sizing: border-box">9216</span>
curl http://127.0.0.1:9216/metrics</code></pre>
<h4 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 15px">4.2 配置prometheus operator</h4>
<hr style="box-sizing: content-box; height: 0; margin: 1.5em auto; border-top: 2px dotted rgba(238, 238, 238, 1); border-right: 0; border-bottom: 0; border-left: 0; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">
<h3 style="box-sizing: border-box; font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace; line-height: 1.4; color: rgba(102, 102, 102, 1); margin: 30px 0 10px; font-size: 20px">感谢:</h3>
<p style="box-sizing: border-box; margin: 0 0 20px; word-break: break-all; color: rgba(88, 102, 110, 1); font-family: "Source Sans Pro", "Hiragino Sans GB", "Microsoft Yahei", SimSun, Helvetica, Arial, sans-serif, monospace">1.Kubernetes RBAC 详解-www.qikqiak.com|阳明的博客|Kubernetes|Docker|istio|Python|Golang|Cloud Native<br style="box-sizing: border-box">2.使用 StatefulSet 搭建 MongoDB 集群 - Kubernetes - Wiki.Shileizcc.com<br style="box-sizing: border-box">3.GitHub - cvallance/mongo-k8s-sidecar: Kubernetes sidecar for Mongo<br style="box-sizing: border-box">4.MongoDB集群搭建及使用 - SuperMap技术控 - CSDN博客</p><br><br>
来源:https://www.cnblogs.com/evenchen/p/11936706.html
頁:
[1]