Skip to main content

[SOLVED] kubectl apply vs kubectl create? - kubernetes

[SOLVED] Understanding the Differences Between kubectl apply and kubectl create in Kubernetes

In Kubernetes, we need to manage resources well. This is important for deploying and running applications smoothly. Two common commands we use are kubectl apply and kubectl create. Both help us manage resources in Kubernetes. But they work in different ways. In this chapter, we will look at the differences between kubectl apply and kubectl create. This will help us choose the right command for different situations.

Here are the solutions we will discuss:

  • Solution 1: Understanding kubectl create
  • Solution 2: Understanding kubectl apply
  • Solution 3: When to use kubectl create
  • Solution 4: When to use kubectl apply
  • Solution 5: Handling updates with kubectl apply
  • Solution 6: Practical examples of kubectl create and apply

By the end of this chapter, we will understand how to use kubectl apply and kubectl create in our Kubernetes tasks. For more help with Kubernetes commands, we can check our guide on how to run kubectl commands and other topics related.

Solution 1 - Understanding kubectl create

The kubectl create command is a basic command in Kubernetes. We use it to create resources from command line settings or manifest files. This command is mainly for making new resources in our Kubernetes cluster. We can specify a resource directly or use a YAML/JSON file.

Key Characteristics of kubectl create

  • Idempotence: kubectl create is not idempotent. If we try to create a resource that is already there, we get an error saying the resource already exists.

  • Resource Creation: It can create many resources like Pods, Deployments, Services, ConfigMaps, and more.

  • Declarative vs. Imperative: It works in an imperative way. This means we specify what we want in the command directly. We do not define it and wait for Kubernetes to adjust it.

Basic Syntax

The general syntax of the command is:

kubectl create [resource] [name] [options]

Example of Creating a Pod

Here is how we can create a Pod using kubectl create:

kubectl create pod my-pod --image=nginx

In this example, we create a new Pod named my-pod with the nginx image.

Creating Resources from YAML Files

We can also create resources from a manifest file. For example, if we have a YAML file named pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: nginx-container
      image: nginx

We can create the Pod using this command:

kubectl create -f pod.yaml

Common Use Cases

  • To create a new Deployment:
kubectl create deployment my-deployment --image=nginx
  • To create a Service:
kubectl create service clusterip my-service --tcp=80:80

Limitations

We need to know that kubectl create does not let us update existing resources. If we want to change an existing resource, we should use kubectl apply instead.

For more details about operations and commands in Kubernetes, check this guide on running kubectl commands.

Solution 2 - Understanding kubectl apply

kubectl apply is a strong command in Kubernetes. We use it to create and update resources in a clear way. This means we can write down what we want in a YAML or JSON file. Then, kubectl apply makes sure the resource in the cluster matches what we wrote in our file.

Key Features of kubectl apply

  • Declarative Configuration: We tell the system what we want in a configuration file. Then, kubectl apply takes care of making those changes. This is really helpful for managing complicated applications and settings.

  • Update Management: When we run kubectl apply, Kubernetes looks at the file and the current state of the resource. If there are any differences, it makes the needed changes. This helps us update things easily without deleting and recreating resources.

  • No Overwriting: Unlike kubectl create, which will show an error if the resource is already there, kubectl apply will update existing resources. It does this without changing other settings that we did not mention in the file.

Basic Usage

To use kubectl apply, we usually create a YAML file that defines the resource we want to manage. Here’s an example of how to apply a deployment configuration:

  1. Define the Deployment: We create a file named nginx-deployment.yaml with this content:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:1.14.2
              ports:
                - containerPort: 80
  2. Apply the Configuration: We use this command to apply the deployment configuration:

    kubectl apply -f nginx-deployment.yaml
  3. Update the Deployment: If we want to change the image version in our deployment, we update the nginx-deployment.yaml file:

    spec:
      template:
        spec:
          containers:
            - name: nginx
              image: nginx:1.16.1 # Updated version

    Then, we run the apply command again:

    kubectl apply -f nginx-deployment.yaml

Practical Considerations

  • Resource Management: We really should use kubectl apply for managing configurations in version control systems. This way, we can see changes over time and go back to previous settings if we need.

  • Idempotency: The kubectl apply command is idempotent. This means we can run it many times with the same configuration file. It will not create duplicate resources or errors.

  • JSON Patch and Strategic Merge Patch: When we update resources with kubectl apply, Kubernetes uses a method called strategic merge patch. This allows us to change only certain parts of a resource without replacing the whole thing.

For more detailed help on using kubectl commands, check this kubectl command tutorial. This will help us understand best practices and advanced use of kubectl.

In conclusion, kubectl apply is a key command for managing Kubernetes resources well. It helps us with clear configurations and makes the update process easier.

Solution 3 - When to use kubectl create

We use the kubectl create command to create resources in Kubernetes. It is very helpful when we want to make resources for the first time. We do not need to manage or check their current state. Here are some situations when we should use kubectl create:

  1. Initial Resource Creation: We should use kubectl create when we want to make a resource that is not already in our cluster. For example, when we are deploying a new application or service for the first time, kubectl create is the simple choice.

    Example command to create a deployment:

    kubectl create deployment my-deployment --image=my-image:latest
  2. Simplicity in Resource Definitions: If our resource definitions are easy and we do not need advanced features like merging configurations, kubectl create is perfect. It helps us quickly set up resources without extra complexity.

    Example command to create a service:

    kubectl create service clusterip my-service --tcp=80:80
  3. Creating Non-Declarative Resources: We can use kubectl create when we make resources that we do not plan to manage in a declarative way. For instance, creating temporary resources or those that do not need ongoing management.

  4. Single Resource Creation: If we need to quickly create one resource and do not have a YAML or JSON file ready, kubectl create lets us define the resource right away.

    Example of creating a config map:

    kubectl create configmap my-config --from-literal=key1=value1
  5. Avoiding Overwrites: When we want to prevent accidentally overwriting existing resources, kubectl create will not work if the resource already exists. This makes it a safer choice in these cases.

  6. When Resource State is Not Important: If we do not need to keep the state or setup of the resource over time, using kubectl create can make our work easier.

In cases where we want to create resources without needing updates or tracking their setup, kubectl create is a good command. For more complex cases where we need to update resources and manage their setup, we should think about using kubectl apply.

For more help on using kubectl commands and fixing issues, you can check this guide on running kubectl commands.

Solution 4 - When to use kubectl apply

The kubectl apply command is a strong tool in Kubernetes. It helps us manage our resources in a clear way. We use it when we want to create or change resources. This command makes sure that the current state matches what we want, as shown in our configuration files.

Use Cases for kubectl apply

  1. Managing Resource Updates:
    When we need to change existing resources, we should use kubectl apply. It lets us make updates without deleting and recreating the resource. This is important to keep our applications running smoothly in the cluster.

    kubectl apply -f deployment.yaml

    This command updates the deployment to match what we wrote in deployment.yaml.

  2. Declarative Configurations:
    If we are using GitOps or CI/CD practices, kubectl apply works well with our workflow. We keep our resource definitions in version control. We can apply changes by running the command with our updated YAML files. This way, our cluster state matches what we have in our repository.

  3. Handling Merges and Conflicts:
    kubectl apply uses a three-way merge method to handle changes. It looks at the last-applied configuration, the current state, and the new configuration. This makes updates safer, especially when many users change the same resource.

  4. Creating Resources:
    We can also use kubectl apply to create new resources. If the resource is not there, it will be created. If it is there, it will update to match the new configuration.

    kubectl apply -f service.yaml
  5. Simplifying Management of Multiple Resources:
    We can apply many configuration files at once using the -f flag with a directory. This helps us manage related resources together easily.

    kubectl apply -f ./manifests/
  6. Automatic Rollbacks:
    If a deployment fails after we apply changes, we can go back to the last stable state easily with this command:

    kubectl rollout undo deployment/my-deployment

Conclusion

Using kubectl apply is very important for good Kubernetes management. It helps us create or update resources while keeping the state and reducing disruptions. This command is very useful when we change configurations often and many users manage the cluster. For more tips on managing Kubernetes resources, we can look at guides on how to run kubectl commands well.

Solution 5 - Handling updates with kubectl apply

When we manage resources in Kubernetes, we must know how to handle updates well. The kubectl apply command is great for this. It lets us manage the desired state of our Kubernetes resources easily.

Updating Resources with kubectl apply

The kubectl apply command helps us create or update resources that we define in a manifest file. This file can be in YAML or JSON format. If the resource already exists, kubectl apply will find the difference between what is now and what we want. Then it will make only the changes we need.

Example: Updating a Deployment

  1. Initial Deployment Configuration

    Let’s say we have a deployment defined in a file called nginx-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:1.14.2
              ports:
                - containerPort: 80

    We can create this deployment using:

    kubectl apply -f nginx-deployment.yaml
  2. Updating the Image

    To change the Nginx image version, we need to modify the nginx-deployment.yaml file to use a new image version:

    
    ---
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.0 # Updated image version
          ports:
            - containerPort: 80

    Now, we apply these changes:

    kubectl apply -f nginx-deployment.yaml

    This command will update the deployment to use the new image. It will keep the existing replicas. This way, we reduce disruption. Kubernetes will do a rolling update. It replaces the old pods with new ones that run the updated image.

Key Benefits of Using kubectl apply for Updates

  • Declarative Management: We can manage what we want for our applications without worrying about what is currently there.
  • Idempotency: If we run kubectl apply many times with the same setup, it will not create errors or unwanted changes. This makes it safe to apply our configurations again and again.
  • Automatic Rollouts and Rollbacks: Kubernetes tracks changes. We can easily go back to a previous version if something goes wrong.

Handling Updates with Configuration Changes

We also need to handle updates when we change other things, like environment variables or resource limits. For example, to add an environment variable to our Nginx deployment:

  1. Update the nginx-deployment.yaml to include the new environment variable:

    
    ---
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.0
          ports:
            - containerPort: 80
          env:
            - name: NGINX_ENV
              value: "production" # New environment variable
  2. Then we apply the changes:

    kubectl apply -f nginx-deployment.yaml

This action will update the deployment and add the new environment variable to the running containers.

For more info on using kubectl commands well, check this article on how to run kubectl commands.

By learning kubectl apply for updates, we can make sure our Kubernetes resources match our desired settings. This helps improve our deployment management strategies.

Solution 6 - Practical examples of kubectl create and apply

We need to understand how to use kubectl create and kubectl apply for managing Kubernetes. Here, we show some examples that help us see how to use both commands in real situations.

Example 1: Using kubectl create

To create a new deployment with kubectl create, we can use the command line or a YAML file.

Creating a Deployment with a YAML file:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

To create the deployment, we run:

kubectl create -f deployment.yaml

This command creates a new deployment named nginx-deployment with 3 replicas.

Example 2: Using kubectl apply

When we want to manage resources that change often, we should use kubectl apply. This command lets us update resources easily.

Creating or Updating a Deployment: Using the same deployment.yaml, if we need to change the image version, we can update the file:

# Updated deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.16.1 # Updated image
          ports:
            - containerPort: 80

Now, we apply the changes with:

kubectl apply -f deployment.yaml

This command updates the existing deployment instead of creating a new one. This way, our changes go through without problems.

Example 3: Creating a Service

We can also create services with both methods.

Creating a Service with kubectl create:

kubectl expose deployment nginx-deployment --type=LoadBalancer --name=nginx-service

Creating a Service with kubectl apply: To create a service using a YAML file, we can define it like this:

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx

We can create the service using:

kubectl apply -f service.yaml

Example 4: Handling Configuration Changes

If we have a ConfigMap, we can manage it well with kubectl apply for tracking versions.

Creating a ConfigMap:

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_URL: "mysql://user:password@mysql:3306/db"

We apply the ConfigMap like this:

kubectl apply -f configmap.yaml

If we need to change the DATABASE_URL later, we just update configmap.yaml and run the same apply command again:

kubectl apply -f configmap.yaml

This way, we keep track of our changes and manage our configurations well.

Summary of Differences in Practical Usage

  • kubectl create is for making new resources. If the resource is already there, it gives an error.
  • kubectl apply is best for creating new resources and updating existing ones. This makes it more flexible for ongoing management.

These examples show us how to use kubectl create and kubectl apply in different situations. This helps us manage Kubernetes resources more easily. For more help with Kubernetes commands, we can check this guide on how to run kubectl commands.

Conclusion

In this article, we looked at the differences between kubectl apply and kubectl create. We talked about what each command does and when to use them in Kubernetes. Knowing when to use these commands can help us improve our deployment plans and make updates easier.

For more information on Kubernetes commands and how to fix problems, we can check out our guides on how to run kubectl commands and handling updates better.

Comments