<p>I'm just getting started with kubernetes and setting up a cluster on AWS using kops.  In many of the examples I read (and try), there will be commands like:</p>

<pre><code>kubectl run my-app --image=mycompany/myapp:latest --replicas=1 --port=8080

kubectl expose deployment my=app --port=80 --type=LoadBalancer
</code></pre>

<p>This seems to do several things behind the scenes, and I can view the manifest files created using <code>kubectl edit deployment</code>, and so forth  However, i see many examples where people are creating the manifest files by hand, and using commands like <code>kubectl create -f</code> or <code>kubectl apply -f</code></p>

<p>Am I correct in assuming that both approaches accomplish the same goals, but that by creating the manifest files yourself, you have a finer grain of control?</p>

<p>Would I then have to be creating Service, ReplicationController, and Pod specs myself?</p>

<p>Lastly, if you create the manifest files yourself, how do people generally structure their projects as far as storing these files?  Are they simply in a directory alongside the project they are deploying?</p>

<p>The fundamental question is how to apply all of the K8s objects into the k8s cluster. There are several ways to do this job. </p>

<ul>
<li>Using Generators (Run, Expose)</li>
<li>Using Imperative way (Create)</li>
<li>Using Declarative way (Apply)</li>
</ul>

<p>All of the above ways have a different purpose and simplicity. For instance, If you want to check quickly whether the container is working as you desired then you might use <strong>Generators</strong> .</p>

<p>If you want to version control the k8s object then it's better to use <strong>declarative</strong> way which helps us to determine the accuracy of data in k8s objects. </p>

<p>Deployment, ReplicaSet and Pods are different layers which solve different problems.All of these concepts provide flexibility to k8s.</p>

<ul>
<li>Pods: It makes sure that related containers are together and provide efficiency.</li>
<li>ReplicaSet: It makes sure that k8s cluster has desirable replicas of the pods</li>
<li>Deployment: It makes sure that you can have different version of Pods and provide the capability to rollback to the previous version  </li>
</ul>

<p><strong>Lastly</strong>, It depends on use case how you want to use these concepts or methodology. It's not about which is good or which is bad. </p>
