Chapter 11. Using service accounts in applications
11.1. Service accounts overview
A service account is an OpenShift Container Platform account that allows a component to directly access the API. Service accounts are API objects that exist within each project. Service accounts provide a flexible way to control API access without sharing a regular user’s credentials.
When you use the OpenShift Container Platform CLI or web console, your API token authenticates you to the API. You can associate a component with a service account so that they can access the API without using a regular user’s credentials. For example, service accounts can allow:
- Replication controllers to make API calls to create or delete pods.
- Applications inside containers to make API calls for discovery purposes.
- External applications to make API calls for monitoring or integration purposes.
Each service account’s user name is derived from its project and name:
Every service account is also a member of two groups:
Includes all service accounts in the system.
Includes all service accounts in the specified project.
Each service account automatically contains two secrets:
- An API token
- Credentials for the OpenShift Container Registry
The generated API token and registry credentials do not expire, but you can revoke them by deleting the secret. When you delete the secret, a new one is automatically generated to take its place.
11.2. Default service accounts
Your OpenShift Container Platform cluster contains default service accounts for cluster management and generates more service accounts for each project.
11.2.1. Default cluster service accounts
Several infrastructure controllers run using service account credentials. The following service accounts are created in the OpenShift Container Platform infrastructure project (
openshift-infra) at server start, and given the following roles cluster-wide:
| || |
| || |
| || |
11.2.2. Default project service accounts and roles
Three service accounts are automatically created in each project:
| || |
Used by build pods. It is given the
| || |
Used by deployment pods and given the
| || |
Used to run all other pods unless they specify a different service account.
All service accounts in a project are given the
system:image-puller role, which allows pulling images from any imagestream in the project using the internal container image registry.
11.2.3. About automatically-generated service account token secrets
In 4.12, OpenShift Container Platform is adopting an enhancement from upstream Kubernetes, which enables the
LegacyServiceAccountTokenNoAutoGeneration feature by default. As a result, when creating new service accounts (SA), a service account token secret is no longer automatically generated. Previously, OpenShift Container Platform automatically added a service account token to a secret for each new SA.
However, some features and workloads need service account token secrets to communicate with the Kubernetes API server, for example, the OpenShift Controller Manager. While this requirement will be changed in a future release, it remains in OpenShift Container Platform 4.12. As a result, if you need a service account token secret, you must manually use the TokenRequest API to request bound service account tokens or create a service account token secret.
After upgrading to 4.12, existing service account token secrets are not deleted and continue to function as expected.
In 4.12, service account token secrets are still automatically generated. Instead of creating two secrets per service account, OpenShift Container Platform now only creates one. In a future release, the number will be further reduced to zero. Note that
dockercfg secrets are still generated and no secrets are deleted during upgrades.
- For information about requesting bound service account tokens, see Configuring bound service account tokens using volume projection
- For information about creating a service account token secret, see Creating a service account token secret.
11.3. Creating service accounts
You can create a service account in a project and grant it permissions by binding it to a role.
Optional: To view the service accounts in the current project:
$ oc get sa
NAME SECRETS AGE builder 2 2d default 2 2d deployer 2 2d
To create a new service account in the current project:
$ oc create sa <service_account_name> 1
- To create a service account in a different project, specify
serviceaccount "robot" createdTip
You can alternatively apply the following YAML to create the service account:
apiVersion: v1 kind: ServiceAccount metadata: name: <service_account_name> namespace: <current_project>
Optional: View the secrets for the service account:
$ oc describe sa robot
Name: robot Namespace: project1 Labels: <none> Annotations: <none> Image pull secrets: robot-dockercfg-qzbhb Mountable secrets: robot-dockercfg-qzbhb Tokens: robot-token-f4khf Events: <none>