Authors – All

If you have a few years of experience in the DevOps ecosystem, and you're interested in sharing that experience with the community, have a look at our Contribution Guidelines.

1. Introduction

In Kubernetes, secrets are an essential component for managing sensitive data such as API keys, passwords, and certificates. However, when creating these secrets, we may encounter an “Illegal Base64 Data” error.

In this tutorial, we’ll explore why this error occurs and how to resolve it. First, we’ll recap the basics of Kubernetes secrets. Then, we’ll discuss the causes of the error and look into how to encode data correctly for Kubernetes secrets. Let’s get started!

2. Understanding Kubernetes Secrets

Kubernetes secrets securely store sensitive information that we don’t want to expose in our application code. By using secrets, we can keep our sensitive data separate from our application logic, enhancing security and manageability.

There are several types of Kubernetes secrets. Let’s briefly recap their concepts.

First, we have opaque secrets, the default type of Kubernetes secrets. We use them to store arbitrary user-defined data like API keys or database credentials. We must encode them in base64.

Next, we have TLS secrets, which store Transport Layer Security (TLS) certificates and keys. They provide secure and encrypted communications between clients and servers.

Lastly, we have Docker registry secrets to store credentials for accessing private Docker registries, enabling Kubernetes to pull images securely.

Now, each type of secret plays a crucial role in securing different aspects of a Kubernetes environment. However, the most common type, the opaque secret, offers the most versatility for general use cases.

Opaque secrets allow us to store any data. Therefore, we shall focus on opaque secrets for the rest of our troubleshooting process.

3. Identifying the Illegal Base64 Data Error

The “Illegal Base64 Data” error typically occurs when the data under the data field in our YAML file is not correctly encoded in base64. This can happen for several reasons:

  • The data was not encoded using the correct base64 encoding tool or command
  • The encoded data includes invalid characters
  • The encoded string has an incorrect length, not a multiple of 4, which is required by base64 encoding

To illustrate, let’s look at an example scenario of a dummy-secret.yaml file:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: af76fsdK_cQ89_Hj1Aq
  API_SECRET: bsdfmkwegwegwe

When we attempt to create this secret using kubectl create -f dummy-secret.yaml, we might see the following error:

Error from server (BadRequest): error when creating "dummy-secret.yaml": Secret in version "v1" cannot be handled as a Secret: v1.Secret: Data: decode base64: illegal base64 data at input byte 8, error found in #10 byte of ...|Q89_Hj1Aq","API_SECR|..., bigger context ...|sion":"v1","data":{"API_KEY":"af76fsdK_cQ89_Hj1Aq","API_SECRET":"bsdfmkwegwegwe"},"kind":"Secret","m|...

This error message indicates that the data for API_KEY and API_SECRET is not valid, base64-encoded data. It suggests that the encoding process was either incorrect or the data has been corrupted.

4. Base64 Encoding Basics

To resolve the “Illegal Base64 Data” error, first, we need to properly understand the basics of base64 encoding.

Base64 is a binary-to-text encoding scheme that converts binary data into an ASCII string format. This is useful in scenarios where binary data needs to be transmitted over text-based protocols.

In Kubernetes, secrets data must be base64 encoded to ensure that the data is stored and transmitted correctly. Base64 encoding ensures that binary data is safely represented in a text format, preventing corruption or misinterpretation during transmission.

To encode data in base64, we can use various tools and commands. For instance, on Unix-like systems like Linux, we commonly use the base64 utility.

Here are some basic and quick commands for base64 encoding and decoding:

# Encoding
$ echo -n 'our_data' | base64
b3VyX2RhdGE=

#Decoding
$ echo 'b3VyX2RhdGE=' | base64 -d
our_data

Importantly, the -n flag in the echo command is crucial because it prevents the addition of a newline character at the end of the string, which can lead to encoding errors.

5. Base64 Encoding for Kubernetes Secrets

Now that we understand the basics of base64 encoding, let’s examine how to encode data correctly for Kubernetes secrets.

5.1. Encoding the Data

To encode data for Kubernetes secrets, we use the echo -n command combined with the base64 utility:

$ echo -n 'mega_secret_key' | base64
bWVnYV9zZWNyZXRfa2V5

This method correctly formats our data for inclusion in a Kubernetes secret.

5.2. Validating the Encoded Data

We can decode the base64 string and check if it matches the original data:

$ echo 'bWVnYV9zZWNyZXRfa2V5' | base64 -d
mega_secret_key

Validating encoded data helps prevent errors that could arise from incorrect encoding, ensuring that our secrets work as expected when deployed in Kubernetes.

5.3. Updating the YAML File

Once we have the correctly encoded data, we can now update our Kubernetes secret YAML file. This file defines the secret and its data, encoded in base64.

Let’s see an example of a YAML configuration for a Kubernetes secret:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
data:
  API_KEY: bWVnYV9zZWNyZXRfa2V5
  API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTE=

In this YAML file, API_KEY and API_SECRET are the keys, and their values are the base64 encoded strings. Kubernetes will decode these values when we use them in our applications.

Now that the YAML file has the correct structure, we can apply the secret to our Kubernetes cluster:

$ kubectl create -f dummy-secret.yaml

If the encoded data is correct with the proper steps, kubectl creates the secret without any errors.

6. Using the stringData Field

If we’re still having issues with the data field, Kubernetes provides an alternative to the data field called stringData. This field allows us to input our secret data in plaintext without the need for base64 encoding. Kubernetes will automatically encode the data into base64 format before storing it.

With stringData over data, we won’t need to manually encode values in base64. Also, plaintext values are easier to read and manage.

6.1. Sample Illustration

To use stringData, we create our YAML file (e.g., dummy-secret.yaml) with the stringData field:

apiVersion: v1
kind: Secret
metadata:
  name: dummy-secret
type: Opaque
stringData:
  API_KEY: mega_secret_key
  API_SECRET: really_secret_value1

Then, we use kubectl to apply the secret:

$ kubectl create -f dummy-secret.yaml

To confirm, we can check that the secret was created successfully:

$ kubectl get secret dummy-secret
NAME           TYPE     DATA   AGE
dummy-secret   Opaque   2      1m

Our result confirms the creation of the secret.

After creating the secret, we can now use it in our pods by referencing it in our deployment or pod YAML files:

apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: busybox
      env:
        - name: API_KEY
          valueFrom:
            secretKeyRef:
              name: dummy-secret
              key: API_KEY
  restartPolicy: Never

Applying the secret in this way ensures that our sensitive data is securely passed to our applications.

6.2. Note on stringData and data Fields

We should note that Kubernetes can handle the presence of both stringData and data fields in the same YAML file.

However, if we specify a key in both fields, the value in the stringData field takes precedence. This means that Kubernetes will use the value from stringData for that key, overriding any value provided in the data field.

Let’s see a quick example to illustrate this behavior:

apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
data:
  API_KEY: YmFzZTY0X2VuY29kZWRfdmFsdWU=
stringData:
  API_KEY: plaintext_value
  API_SECRET: another_plaintext_value

When we apply this secret, Kubernetes will encode the stringData values and merge them into the data field. The key API_KEY from stringData will override the one in the data field, resulting in the following practical data:

  • API_KEY will be set to the base64 encoded value of plaintext_value
  • API_SECRET will be set to the base64 encoded value of another_plaintext_value

This behavior allows for more accessible updates and secret management, providing flexibility in how we define and maintain our sensitive data.

7. Conclusion

In this article, we explored the common causes of the “Illegal Base64 Data” error and how to resolve it. By understanding the importance of correct base64 encoding and leveraging Kubernetes features like stringData, we can effectively manage our secrets and enhance the security of our applications.

Authors – All

If you have a few years of experience in the DevOps ecosystem, and you're interested in sharing that experience with the community, have a look at our Contribution Guidelines.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments