<p>I want to create a Statefulset from a mongo image using a replica set (mongo).</p>

<p>For this, I have my statefulset:</p>

<pre><code>apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo-test
spec:
  selector:
    matchLabels:
      app: mongo-test
  serviceName: "mongo-test"
  replicas: 1
  template:
    metadata:
      labels:
        app: mongo-test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mongodb
        image: mongo:4.2.1
        ports:
        - containerPort: 27017
          name: web
        command: ["/bin/sh","-c"]
        args: ["mongod --oplogSize 128 --replSet rs0 --bind_ip_all &amp;&amp; mongo --eval \"rs.initiate()\""]
        volumeMounts:
        - name: mongo-persistent-storage
          mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: mongo-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 2Gi
</code></pre>

<p>Statefulset and pod created are ok, but the replica set is not initialized. I'm sending the command: mongo --eval "rs.initiate()" in order to create the replica but for some reason the replica is not created.</p>

<p>I also used the command: sleep 30 before the rs.initiate() command just like a delay but no luck.</p>

<p>Is there something wrong in my commands?</p>

<p>Pd. I'm not detailing the rest of configuration (services, pvc, pv) because everything is ok.</p>

<p>-- <strong>UPDATE</strong></p>

<p>Adding logs:</p>

<pre><code>2019-11-19T15:10:05.257+0000 I  CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] MongoDB starting : pid=8 port=27017 dbpath=/data/db 64-bit host=mongo-test-0
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] db version v4.2.1
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] git version: edf6d45851c0b9ee15548f0f847df141764a317e
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] allocator: tcmalloc
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] modules: none
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] build environment:
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten]     distmod: ubuntu1804
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten]     distarch: x86_64
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten]     target_arch: x86_64
2019-11-19T15:10:05.259+0000 I  CONTROL  [initandlisten] options: { net: { bindIp: "*" }, replication: { oplogSizeMB: 128, replSet: "rs0" } }
2019-11-19T15:10:05.259+0000 I  STORAGE  [initandlisten] 
2019-11-19T15:10:05.259+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-11-19T15:10:05.259+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-11-19T15:10:05.259+0000 I  STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=5442M,cache_overflow=(file_max=0M),session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress],
2019-11-19T15:10:06.307+0000 I  STORAGE  [initandlisten] WiredTiger message [1574176206:307928][8:0x7fa43d4aeb00], txn-recover: Set global recovery timestamp: (0,0)
2019-11-19T15:10:06.721+0000 I  RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2019-11-19T15:10:07.142+0000 I  STORAGE  [initandlisten] Timestamp monitor starting
2019-11-19T15:10:07.272+0000 I  CONTROL  [initandlisten] 
2019-11-19T15:10:07.272+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-11-19T15:10:07.272+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-11-19T15:10:07.272+0000 I  CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-11-19T15:10:07.272+0000 I  CONTROL  [initandlisten] 
2019-11-19T15:10:07.273+0000 I  SHARDING [initandlisten] Marking collection local.system.replset as collection version: &lt;unsharded&gt;
2019-11-19T15:10:07.273+0000 I  STORAGE  [initandlisten] Flow Control is enabled on this deployment.
2019-11-19T15:10:07.273+0000 I  SHARDING [initandlisten] Marking collection admin.system.roles as collection version: &lt;unsharded&gt;
2019-11-19T15:10:07.273+0000 I  SHARDING [initandlisten] Marking collection admin.system.version as collection version: &lt;unsharded&gt;
2019-11-19T15:10:07.273+0000 I  STORAGE  [initandlisten] createCollection: local.startup_log with generated UUID: acb2882f-a531-456a-8150-9d4eb0273ef1 and options: { capped: true, size: 10485760 }
2019-11-19T15:10:07.532+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns local.startup_log
2019-11-19T15:10:07.532+0000 I  SHARDING [initandlisten] Marking collection local.startup_log as collection version: &lt;unsharded&gt;
2019-11-19T15:10:07.532+0000 I  FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2019-11-19T15:10:07.533+0000 I  STORAGE  [initandlisten] createCollection: local.replset.oplogTruncateAfterPoint with generated UUID: 6c30e1dc-7da5-4698-a96e-d6736e450999 and options: {}
2019-11-19T15:10:07.773+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns local.replset.oplogTruncateAfterPoint
2019-11-19T15:10:07.774+0000 I  STORAGE  [initandlisten] createCollection: local.replset.minvalid with generated UUID: 703fef2a-479a-4ae9-9052-6c04cf942af4 and options: {}
2019-11-19T15:10:07.997+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns local.replset.minvalid
2019-11-19T15:10:07.997+0000 I  SHARDING [initandlisten] Marking collection local.replset.minvalid as collection version: &lt;unsharded&gt;
2019-11-19T15:10:07.998+0000 I  STORAGE  [initandlisten] createCollection: local.replset.election with generated UUID: 950b0919-e330-4983-a1ff-537fb0e28d72 and options: {}
2019-11-19T15:10:08.153+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns local.replset.election
2019-11-19T15:10:08.153+0000 I  SHARDING [ftdc] Marking collection local.oplog.rs as collection version: &lt;unsharded&gt;
2019-11-19T15:10:08.153+0000 W  REPL     [ftdc] Rollback ID is not initialized yet.
2019-11-19T15:10:08.154+0000 I  SHARDING [initandlisten] Marking collection local.replset.election as collection version: &lt;unsharded&gt;
2019-11-19T15:10:08.155+0000 I  REPL     [initandlisten] Did not find local initialized voted for document at startup.
2019-11-19T15:10:08.155+0000 I  REPL     [initandlisten] Did not find local Rollback ID document at startup. Creating one.
2019-11-19T15:10:08.156+0000 I  STORAGE  [initandlisten] createCollection: local.system.rollback.id with generated UUID: 9e2939db-087f-40a9-9710-585b4b26c57b and options: {}
2019-11-19T15:10:08.330+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns local.system.rollback.id
2019-11-19T15:10:08.330+0000 I  SHARDING [initandlisten] Marking collection local.system.rollback.id as collection version: &lt;unsharded&gt;
2019-11-19T15:10:08.331+0000 I  REPL     [initandlisten] Initialized the rollback ID to 1
2019-11-19T15:10:08.331+0000 I  REPL     [initandlisten] Did not find local replica set configuration document at startup;  NoMatchingDocument: Did not find replica set configuration document in local.system.replset
2019-11-19T15:10:08.332+0000 I  CONTROL  [LogicalSessionCacheRefresh] Sessions collection is not set up; waiting until next sessions refresh interval: Replication has not yet been configured
2019-11-19T15:10:08.333+0000 I  NETWORK  [initandlisten] Listening on /tmp/mongodb-27017.sock
2019-11-19T15:10:08.333+0000 I  NETWORK  [initandlisten] Listening on 0.0.0.0
2019-11-19T15:10:08.333+0000 I  NETWORK  [initandlisten] waiting for connections on port 27017
2019-11-19T15:10:08.339+0000 I  SHARDING [LogicalSessionCacheReap] Marking collection config.system.sessions as collection version: &lt;unsharded&gt;
2019-11-19T15:10:08.339+0000 I  CONTROL  [LogicalSessionCacheReap] Sessions collection is not set up; waiting until next sessions reap interval: config.system.sessions does not exist
</code></pre>

georgeos
<p>I am not expert in this matter but, as per your logs your options were passed during startup:</p>

<pre><code>options: { net: { bindIp: "*" }, replication: { oplogSizeMB: 128, replSet: "rs0" } }
</code></pre>

<p>But mongodb cant find repl settings during the startup:</p>

<pre><code>Did not find local replica set configuration document at startup;
  NoMatchingDocument: Did not find replica set configuration document in local.system.replset
</code></pre>

<p>The second issue with additional parameters:</p>

<blockquote>
  <p>Starting in version 4.2, MongoDB removes the deprecated MMAPv1 storage engine and the MMAPv1-specific configuration options:</p>
  
  <p>Removed Command-line Option:</p>
  
  <ul>
  <li>mongod --smallfiles</li>
  <li>mongod --noprealloc</li>
  </ul>
</blockquote>

<p>What I did:
I have applied below args:</p>

<pre><code>args:
  - mongod
  - "--replSet"
  - rs0
  - "--bind_ip_all"
</code></pre>

<p>For hostnames, stable network identifiers please refer to the statefulset basics:</p>

<blockquote>
  <p>For a StatefulSet with N replicas, each Pod in the StatefulSet will be assigned an integer ordinal, from 0 up through N-1, that is unique over the Set
  A StatefulSet can use a Headless Service to control the domain of its Pods. The domain managed by this Service takes the form: $(service name).$(namespace).svc.cluster.local, where “cluster.local” is the cluster domain. As each Pod is created, it gets a matching DNS subdomain, taking the form: <strong>$(podname).$(governing service domain)</strong>, where the governing service is defined by the serviceName field on the StatefulSet.</p>
</blockquote>

<p>As mentioned in the limitations section, you are responsible for creating the Headless Service responsible for the network identity of the pods.</p>

<p>According to those rules in my example I have also created headless service and provided those information during mongodb initialization:</p>

<pre><code>host: "mongo-test-0.mongo-test"
host: "mongo-test-1.mongo-test"
</code></pre>

<p>From the running pod I have initialized the cluster with this command:</p>

<pre><code>rs.initiate( {_id: "rs0", version:1, members: [
      { _id: 0, host: "mongo-test-0.mongo-test:27017" },
      { _id: 1, host: "mongo-test-1.mongo-test:27017" },
   ]
})

{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1574614871, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1574614871, 1)
}
</code></pre>

<p>Verification:</p>

<pre><code>rs0:PRIMARY&gt; rs.config()
{
    "_id" : "rs0",
    "version" : 1,
    "protocolVersion" : NumberLong(1),
    "writeConcernMajorityJournalDefault" : true,
    "members" : [
        {
            "_id" : 0,
            "host" : "mongo-test-0.mongo-test:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {

            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "mongo-test-1.mongo-test:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {

            },

rs0:PRIMARY&gt; rs.isMaster()
{
    "hosts" : [
        "mongo-test-0.mongo-test:27017",
        "mongo-test-1.mongo-test:27017"
    ],
    "setName" : "rs0",
    "setVersion" : 1,
    "ismaster" : true,
</code></pre>

<p>For more information about mongodb Replication plaese refer to the official <a href="https://docs.mongodb.com/manual/replication/" rel="nofollow noreferrer">mongodb docs</a>.</p>

<p>In my opinion you should prepare env variables and additional scripts/entrypoint applied into your deployment in order to manage f.e. proper hostnames, stable network identifiers, replication and initialization. </p>

<p>As an example I would like suggest to use <a href="https://github.com/helm/charts/tree/master/stable/mongodb" rel="nofollow noreferrer">helm charts for mongodb</a>.<br>
Hope this help.</p>
