Rocky Linux is a community-driven enterprise operating system designed to be 100% bug-for-bug compatible with Red Hat Enterprise Linux (RHEL).
Rocky Linux provides:
Rocky Linux is supported on the following cloud providers:
Rocky Linux is not supported on: Google Cloud Platform, Hetzner Cloud, Nutanix, VMware Cloud Director
OSM officially supports:
To use Rocky Linux as the operating system:
spec:
template:
spec:
providerSpec:
value:
operatingSystem: "rockylinux"
operatingSystemSpec:
distUpgradeOnBoot: false
operatingSystemSpec:
# Perform distribution upgrade on first boot
distUpgradeOnBoot: false
# Disable automatic updates
disableAutoUpdate: true
# RHEL subscription (if using RHEL instead of Rocky)
# Not needed for Rocky Linux
rhelSubscriptionManagerUser: ""
rhelSubscriptionManagerPassword: ""
Rocky Linux instances are provisioned using cloud-init. The machine-controller generates cloud-init configuration that:
Rocky Linux provides official AMIs:
cloudProviderSpec:
# Specify Rocky Linux AMI
ami: "ami-xxxxx" # Rocky Linux 9 AMI for your region
region: "us-east-1"
instanceType: "t3.medium"
To find Rocky Linux AMIs:
aws ec2 describe-images \
--owners 792107900819 \
--filters "Name=name,Values=Rocky-9-EC2-*" \
--query 'Images[*].[ImageId,Name,CreationDate]' \
--output table
Rocky Linux images are available in Azure Marketplace:
cloudProviderSpec:
imageReference:
publisher: "resf"
offer: "rockylinux-x86_64"
sku: "9-base"
version: "latest"
DigitalOcean provides Rocky Linux as a distribution:
cloudProviderSpec:
# DigitalOcean automatically selects Rocky Linux image
region: "nyc3"
size: "s-2vcpu-4gb"
For OpenStack, upload a Rocky Linux cloud image:
Download Rocky Linux cloud image:
wget https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2
Upload to OpenStack Glance:
openstack image create \
--disk-format qcow2 \
--container-format bare \
--file Rocky-9-GenericCloud-Base.latest.x86_64.qcow2 \
rocky-linux-9
Reference in MachineDeployment:
cloudProviderSpec:
image: "rocky-linux-9"
For vSphere, prepare a Rocky Linux template VM:
cloudProviderSpec:
templateVMName: "rocky-linux-9-template"
See the vSphere Rocky Linux Template Guide.
Rocky Linux has SELinux enabled by default. Machine-controller automatically configures SELinux policies for Kubernetes.
# Check SELinux status
getenforce
# Should return: Enforcing
# View SELinux denials
ausearch -m avc -ts recent
Machine-controller sets SELinux contexts for:
If you encounter SELinux issues:
# Check audit logs
tail -f /var/log/audit/audit.log | grep denied
# Temporarily set to permissive (for debugging only)
sudo setenforce 0
# Re-enable enforcing
sudo setenforce 1
Rocky Linux uses firewalld by default. Machine-controller configures necessary ports:
# Check firewall status
sudo firewall-cmd --state
# List allowed services
sudo firewall-cmd --list-all
# Required ports are automatically configured:
# - 10250 (Kubelet API)
# - 30000-32767 (NodePort services)
Rocky Linux uses DNF (YUM) for package management:
# Update packages
sudo dnf update -y
# Install additional packages
sudo dnf install -y vim htop
# List installed packages
dnf list installed | grep kube
Machine-controller installs:
kubeletkubeadmkubectlcontainerdRocky Linux can be configured for automatic updates:
operatingSystemSpec:
# Disable automatic updates (recommended for Kubernetes nodes)
disableAutoUpdate: true
For manual updates:
# Update all packages
sudo dnf update -y
# Update specific package
sudo dnf update kubelet
# Check for updates
sudo dnf check-update
After kernel updates, reboot is required:
# Cordon node
kubectl cordon <node-name>
# Drain node
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# Reboot
sudo reboot
# Uncordon after reboot
kubectl uncordon <node-name>
Check cloud-init logs for provisioning issues:
# View cloud-init output
sudo cat /var/log/cloud-init-output.log
# View cloud-init logs
sudo cat /var/log/cloud-init.log
# Check cloud-init status
sudo cloud-init status --long
# Check DNF logs
sudo cat /var/log/dnf.log
# Verify repositories
sudo dnf repolist
# Clean cache
sudo dnf clean all
sudo dnf makecache
# Check for SELinux denials
sudo ausearch -m avc -ts recent
# Generate SELinux policy (if needed)
sudo audit2allow -a -M mypolicy
sudo semodule -i mypolicy.pp
# Check SELinux boolean settings
getsebool -a | grep container
# Check kubelet status
sudo systemctl status kubelet
# View kubelet logs
sudo journalctl -u kubelet -f
# Restart kubelet
sudo systemctl restart kubelet
Rocky Linux is designed as a CentOS replacement:
To migrate from CentOS to Rocky Linux:
Example:
# Create Rocky Linux MachineDeployment
kubectl apply -f rocky-workers.yaml
# Scale up
kubectl scale machinedeployment rocky-workers --replicas=3 -n kube-system
# Wait for nodes
kubectl get nodes -w
# Drain CentOS nodes
kubectl drain -l os=centos --ignore-daemonsets --delete-emptydir-data
# Scale down
kubectl scale machinedeployment centos-workers --replicas=0 -n kube-system
apiVersion: cluster.k8s.io/v1alpha1
kind: MachineDeployment
metadata:
name: rocky-workers
namespace: kube-system
spec:
replicas: 3
selector:
matchLabels:
name: rocky-workers
template:
metadata:
labels:
name: rocky-workers
os: rockylinux
spec:
providerSpec:
value:
cloudProvider: "aws"
cloudProviderSpec:
region: "us-east-1"
availabilityZone: "us-east-1a"
instanceType: "t3.medium"
vpcId: "vpc-xxxxx"
subnetId: "subnet-xxxxx"
ami: "ami-xxxxx" # Rocky Linux 9 AMI
diskSize: 50
tags:
KubernetesCluster: "my-cluster"
OS: "rocky-linux-9"
operatingSystem: "rockylinux"
operatingSystemSpec:
distUpgradeOnBoot: false
disableAutoUpdate: true
versions:
kubelet: "<YOUR-KUBERNETES-VERSION>"
Install additional packages using cloud-init:
spec:
template:
spec:
providerSpec:
value:
operatingSystem: "rockylinux"
cloudInit: |
#cloud-config
packages:
- vim
- htop
- curl
runcmd:
- echo "Custom configuration"
- systemctl enable --now myservice