Create deployment vs run deployment

9/25/2019

Google course on Kubernetes proposes:

$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080  
  kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. 
  Use kubectl run --generator=run-pod/v1 or kubectl create instead.

Now I'm trying to use the new syntax:

$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1  
$ kubectl expose deployment/kubernetes-bootcamp --port=8080 type=NodePort

I'm sure that they are not the same. Could anyone help me?

Rr

Not duplicate: I'm asking about equivalence of two commands

-- Riccardo79
kubernetes

2 Answers

9/25/2019

You can see what these commands do by executing a dry-run and inspecting the generated manifests:

kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080 \
  --dry-run -o yaml > kubectl-run.yaml

And

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 \
  --dry-run -o yaml >kubectl-create.yaml

The only substantial difference between the two manifests is that there is no ports field in kubectl-create.yaml.

The kubectl create deployment command has no option for specifying any exposed ports of the container, so there's probably no easy way to achieve exactly the same output as kubectl run with a kubectl create command.

The kubectl expose command that you're using just creates a Service resource and doesn't modify the Deployment resource.

In general, kubectl create <resource> commands are rather limited. They're mostly useful to either create a resource with only default settings, or to create the base for a manifest with --dry-run -o yaml that you can then customise.

-- weibeld
Source: StackOverflow

9/25/2019

Deployments has no --port option as you are guessing correctly. It is the port the container listen to, which makes the difference.

The service you use to expose the deployment should say which container port should be exposed - and to which port of the service it should map the container port to.

$ kubectl expose deployment/kubernetes-bootcamp --port=80  --container-port=8080 type=NodePort

The above command exposes the bootcamp via port 80.

-- Charlie
Source: StackOverflow