K3s Deployment and Configuration on CentOS

K3s represents a highly optimized, certified Kubernetes distribution specifically engineered for the demands of IoT, Edge computing, and resource-constrained environments. Developed by Rancher Labs and currently maintained as a Cloud Native Computing Foundation (CNCF) project, K3s is designed to provide a fully compliant Kubernetes experience while drastically reducing the operational overhead and resource footprint. The naming convention "K3s" is a deliberate play on "K8s" (the common shorthand for Kubernetes); while the 8 in K8s refers to the eight letters between the 'k' and the 's' in Kubernetes, the 3 in K3s symbolizes the reduction of requirements by half, reflecting its streamlined architecture.

For users deploying on CentOS, K3s offers a production-ready pathway to container orchestration. Because it is a CNCF-certified distribution, K3s must pass the same rigorous software conformance tests as any other certified Kubernetes distribution. This ensures that configurations, manifests, and workloads designed for standard Kubernetes will operate seamlessly within a K3s environment. K3s achieves this efficiency by packaging the entire distribution into a single binary smaller than 70MB, which effectively minimizes the dependency chain and simplifies the installation, execution, and auto-update processes.

CentOS System Requirements and Prerequisites

Deploying K3s on CentOS requires adherence to specific baseline requirements to ensure cluster stability and connectivity. These requirements focus on the foundational layer of the node and do not account for the additional resources that will be consumed by the actual workloads and pods deployed to the cluster.

The most critical prerequisite for any K3s cluster is the uniqueness of node hostnames. Kubernetes relies on hostnames for node identification and communication. If two nodes share the same hostname, the cluster will experience identification conflicts, leading to unstable behavior or failure to join the cluster.

To mitigate hostname collisions, especially in environments where automated provisioning systems reuse hostnames, K3s provides several configuration options:

  • Use the --with-node-id option to append a random suffix to the node, ensuring each instance is uniquely identified.
  • Define a specific unique name using the --node-name flag during the installation process.
  • Set the $K3S_NODE_NAME environment variable to specify the identity of the node.

In terms of hardware architecture, K3s is highly versatile and supports the following platforms:

  • x86_64
  • armhf
  • arm64/aarch64

This architectural flexibility allows K3s to scale from small-scale deployments on a Raspberry Pi to high-performance environments, such as an AWS a1.4xlarge server featuring 32GiB of RAM.

Operating System Integration for CentOS

K3s is designed to function across most modern Linux distributions, but CentOS requires specific attention due to its default security configurations and system management tools.

SELinux Configuration

Security-Enhanced Linux (SELinux) is enabled by default on CentOS. For K3s to operate correctly, appropriate SELinux policies must be in place. Failure to implement these policies can result in permission errors that prevent the K3s binary from accessing necessary system resources or managing container runtimes.

K3s handles SELinux policies through two primary methods:

  • Automatic Installation: When using the standard installation script on a compatible CentOS system, K3s will automatically install the necessary SELinux RPM from the Rancher RPM repository.
  • Manual Installation: In environments where automatic installation is not possible, such as air-gapped installations, the administrator must manually ensure the SELinux policies are applied.

Firewalld Management

The CentOS firewalld service can obstruct the communication required for a Kubernetes cluster to function. The primary recommendation for K3s is to disable firewalld entirely to ensure an unobstructed network path.

To disable firewalld, the following command is used:

systemctl disable firewalld --now

If organizational security policies mandate that firewalld remain enabled, specific rules must be configured to allow the K3s API server and internal pod/service communication. The following commands establish the mandatory baseline rules:

  • To open the API server port:
    firewall-cmd --permanent --add-port=6443/tcp
  • To allow pod communication:
    firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16
  • To allow service communication:
    firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16
  • To apply the changes:
    firewall-cmd --reload

It is important to note that depending on the specific workload or networking plugin used, additional ports may need to be opened.

Installation Methodologies

K3s provides several pathways for installation on CentOS, ranging from a quick script to containerized deployments.

Standard Installation

The most common method for deploying K3s is via the installation script. This method simplifies the process by handling the download and execution of the binary.

To initiate the installation, run:

curl -sfL https://get.k3s.io | sh -

Once the installation is complete, the node status can be verified using the following command, which typically takes approximately 30 seconds to reflect a "Ready" state:

sudo k3s kubectl get node

Containerized Deployment via Docker

For local development or isolated environments, K3s can be run within a Docker container using the rancher/k3s images. This approach allows the K3s server and agent to operate without modifying the host system extensively.

To launch a K3s server using Docker, use the following command:

sudo docker run \ --privileged \ --name k3s-server-1 \ --hostname k3s-server-1 \ -p 6443:6443 \ -d rancher/k3s:v1.24.10-k3s1 \ server

When using Docker, specific versioning rules apply:

  • Valid K3s versions must be specified as the tag; the latest tag is not maintained and should be avoided.
  • Docker tags do not support the plus sign (+); therefore, a hyphen (-) must be used in the tag instead.

After the container is operational, the admin kubeconfig must be extracted from the container to allow the host to communicate with the cluster:

sudo docker cp k3s-server-1:/etc/rancher/k3s/k3s.yaml ~/.kube/config

Cluster Architecture and Node Management

K3s utilizes a server-agent architecture to distribute the workload of the Kubernetes control plane and the execution of containers.

Server Nodes

The server node hosts the Kubernetes control plane. When the server is started via the command sudo k3s server &, it initializes the cluster and writes the kubeconfig file to /etc/rancher/k3s/k3s.yaml. The server is responsible for managing the cluster state, scheduling pods, and handling API requests.

Agent Nodes

Agent nodes are used to extend the capacity of the cluster. Agents connect to the server and execute the workloads. To join an agent to a server, the agent must be provided with the server's URL and a secure token.

The token is retrieved from the server node at the following path:
/var/lib/rancher/k3s/server/node-token

The agent is then started using the following command:

sudo k3s agent --server https://myserver:6443 --token ${NODE_TOKEN}

Advanced Configuration and Management

Beyond initial installation, K3s requires ongoing management of certificates, tokens, and system resources.

Certificate Management

K3s employs an automated system for managing the certificates required for secure communication.

  • Certificate Authority (CA) Certificates: The first server node in a cluster generates self-signed CA certificates. These certificates have a validity period of 10 years and are not automatically renewed. For renewals or the implementation of custom CA certificates, the k3s certificate rotate-ca command is used.
  • Client and Server Certificates: These certificates are issued with a validity period of 365 days. K3s automatically renews any certificates that are expired or within 90 days of expiration each time the K3s service starts. Manual rotation can be performed via the k3s certificate rotate command.

Token Management

For simplicity in small to medium clusters, K3s uses a single static token by default. This token is used for both server and agent authentication, streamlining the process of adding new nodes to the cluster.

Rootless K3s and Cgroups

K3s supports rootless operation, allowing the cluster to run without root privileges. This increases security by limiting the impact of a potential container breakout.

In rootless mode, networking is detached from the host. To access Services, port forwards must be established. A rootless controller automatically binds port 6443 and service ports below 1024 to the host using an offset of 10000. For example, a service on port 80 is mapped to 10080 on the host. However, ports above 1024, such as 8080, are mapped directly without an offset. Currently, this automatic binding is only supported for LoadBalancer Services.

Rootless K3s has strict requirements for Cgroups:

  • Only pure Cgroup v2 is supported.
  • Cgroup v1 and Hybrid v1/v2 are not supported.
  • If a rootless K3s instance fails to start due to missing cgroups, it is often because the node is in Hybrid mode, meaning the cgroups are still bound to a v1 controller.

To enable rootless servers, users must enable cgroup v2 delegation.

Cluster Limitations

Certain architectural limitations exist for specific deployment modes. For instance, multi-node rootless clusters or the execution of multiple rootless K3s processes on a single node are not currently supported.

Troubleshooting Common CentOS Issues

Deployment on CentOS can occasionally encounter environment-specific failures, particularly regarding dependencies and system versions.

OpenSSL and Installation Failures

A common issue reported by CentOS users (specifically on CentOS Linux release 7.8.2003) involves installation failures related to the OpenSSL version. Because K3s depends on specific cryptographic libraries for its certificates and secure communication, an outdated or incompatible OpenSSL version can cause the installation script to fail.

In these scenarios, the solution involves updating the system's OpenSSL package to a version compatible with the K3s binary. Once the appropriate OpenSSL version is installed, the K3s installation script can be successfully executed.

Summary of K3s Specifications and Requirements

The following table outlines the technical requirements and support matrices for K3s on CentOS.

Component Requirement/Support Notes
Architecture x86_64, armhf, arm64/aarch64 Supports Raspberry Pi to AWS a1.4xlarge
OS Support CentOS, Ubuntu, Debian, RHEL, SUSE Works on most modern Linux systems
Binary Size < 70MB Single binary reduces dependencies
CA Validity 10 Years Not automatically renewed
Cert Validity 365 Days Auto-renewed within 90 days of expiry
Cgroups Pure v2 Required for rootless mode
API Port 6443/tcp Primary port for API server
Pod Network 10.42.0.0/16 Default pod subnet
Service Network 10.43.0.0/16 Default service subnet

Detailed Analysis of K3s Operational Impact

The implementation of K3s on CentOS transforms the operational landscape for edge computing. By reducing the complexity of the Kubernetes control plane, K3s eliminates the need for the extensive resource overhead typically associated with "full" Kubernetes distributions.

The impact of this reduction is most visible in the deployment phase. The use of a single binary means that the dependency hell often encountered in Linux distributions—where library version mismatches prevent software from running—is significantly mitigated. For CentOS users, this means a faster transition from bare metal to a functioning cluster.

Furthermore, the optimization for ARM architectures ensures that K3s can be deployed on low-power hardware. The ability to run a certified Kubernetes distribution on a Raspberry Pi enables the creation of "edge clusters" where data is processed locally, reducing the need to send all telemetry to a centralized cloud. This has significant implications for latency and bandwidth costs.

From a security perspective, the integration of SELinux policies and the option for rootless operation allow administrators to tailor the security posture of the cluster. While rootless mode introduces some networking complexities (such as the 10000-port offset), it removes the risk associated with giving a container orchestration tool root access to the host operating system.

Finally, the certificate management system ensures that the cluster remains secure without requiring constant manual intervention. The 10-year CA validity combined with the automatic 365-day rotation of client and server certificates creates a "set and forget" environment for the foundational security layer.

Sources

  1. K3s Installation Requirements
  2. K3s Advanced Configuration
  3. K3s GitHub Discussions
  4. K3s Official Website
  5. Sysdig: What is K3s

Related Posts