Dev.to Security 🔐 Cybersecurity 👁 1 📖 2 min read

Create a Kubernetes service account and assign permissions

When deploying applications to Kubernetes, it's important to ensure they have only the permissions they actually need. This is where ServiceAccounts and RBAC (Role-Based Access Control) come into play. In our case, the

When deploying applications to Kubernetes, it's important to ensure they have only the permissions they actually need. This is where ServiceAccounts and RBAC (Role-Based Access Control) come into play.

In our case, the ServiceAccount is required for the Agentic CLI to authenticate with the AKS cluster when running in cluster mode.

What is a ServiceAccount?

A ServiceAccount is an identity used by applications running inside a Kubernetes cluster. Unlike user accounts, which are intended for administrators and developers, ServiceAccounts allow pods to securely authenticate with the Kubernetes API.

Applications commonly use a ServiceAccount to:

  • Read Pods
  • Create Jobs
  • Access ConfigMaps and Secrets
  • Watch Deployments
  • Integrate with cloud identity providers (Azure Workload Identity, AWS IAM Roles for Service Accounts, OCI Workload Identity)

Rather than granting broad cluster-wide permissions, Kubernetes lets you assign only the permissions an application requires, following the Principle of Least Privilege.

Default ServiceAccount

Every Kubernetes namespace includes a default ServiceAccount.

kubectl get sa

Example output:

NAME      SECRETS   AGE
default   0         10d

If no ServiceAccount is specified in a Pod or Deployment, Kubernetes automatically uses the default ServiceAccount.

Creating a ServiceAccount

Create a file named serviceaccount.yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-app-sa
  namespace: alpha

Apply it:

kubectl apply -f serviceaccount.yaml

Verify it exists:

kubectl get sa -n alpha

Using a ServiceAccount in a Pod or Deployment

Reference the ServiceAccount using the serviceAccountName field.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  serviceAccountName: my-app-sa
  containers:
    - name: nginx
      image: nginx

Any pod using this ServiceAccount will authenticate to the Kubernetes API as my-app-sa.

A ServiceAccount Has No Permissions by Default

Creating a ServiceAccount does not automatically grant access to Kubernetes resources.

Permissions are assigned using RBAC:

  • Role + RoleBinding → Namespace-scoped permissions
  • ClusterRole + ClusterRoleBinding → Cluster-wide permissions

Creating a Role

The following Role allows read-only access to Pods, Services, and Endpoints.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1

metadata:
  namespace: dev
  name: endpoints-reader

rules:
- apiGroups: [""]
  resources:
    - pods
    - services
    - endpoints
  verbs:
    - get
    - list
    - watch

Binding the Role to the ServiceAccount

Next, bind the Role to the ServiceAccount.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1

metadata:
  name: read-access
  namespace: dev

subjects:
- kind: ServiceAccount
  name: my-app-sa
  namespace: dev

roleRef:
  kind: Role
  name: endpoints-reader
  apiGroup: rbac.authorization.k8s.io

After applying the Role and RoleBinding, the ServiceAccount can:

  • Get Pods
  • List Pods
  • Watch Pods
  • Get Services
  • List Services
  • Watch Services
  • Get Endpoints
  • List Endpoints
  • Watch Endpoints

Nothing more.

Verifying the Role

Describe the Role to verify its permissions.

kubectl describe role endpoints-reader -n test-magik

Example output:

Name:         endpoints-reader
PolicyRule:
  Resources   Verbs
  ---------   ----------------
  endpoints   get, list, watch
  pods        get, list, watch
  services    get, list, watch

You can also verify what a ServiceAccount is allowed to do:

kubectl auth can-i list pods \
  --as=system:serviceaccount:dev:my-app-sa \
  -n dev

If configured correctly, Kubernetes will return:

yes

Why This Matters

Giving every application cluster-admin privileges is a significant security risk.

Using ServiceAccounts together with RBAC enables you to:

  • Grant only the permissions an application requires
  • Reduce the impact of compromised workloads
  • Improve Kubernetes security
  • Follow the Principle of Least Privilege
  • Support secure authentication for tools such as the Agentic CLI running in AKS cluster mode

Properly configured ServiceAccounts are a foundational security practice for any production Kubernetes environment.

📰 Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.