Custom Roles and Service Account
Service Account
Create custom roles for service account to view,list and watch
- configmaps
- pods
- services
- namespaces
- endpoints
- secrets
- *nodes*
Remark: nodes need cluster role
Create Service Account
- Create Service Account - oc create sa sa-discovery -n demo- Output - serviceaccount/sa-discovery created
Custom Roles
Local Role
- Create role for service account. - oc create role app-discovery \ --verb=get,list,watch \ --resource=configmaps,pods,services,namespaces,endpoints \ -n demo oc describe role app-discovery -n demo- or create from app-discovery yaml - oc create -f manifests/app-discovery-role.yaml -n demo oc describe role app-discovery -n demo oc describe role list-secret -n demo- Output - role.rbac.authorization.k8s.io/app-discovery created Name: app-discovery Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- configmaps [] [] [get list watch] endpoints [] [] [get list watch] namespaces [] [] [get list watch] pods [] [] [get list watch] secrets [] [] [get list watch] services [] [] [get list watch]
- Assign role to service account - oc adm policy add-role-to-user app-discovery \ system:serviceaccount:demo:sa-discovery --role-namespace=demo -n demo- Output - role.rbac.authorization.k8s.io/app-discovery added: "system:serviceaccount:demo:sa-discovery"
Create cluster role
- Create cluster role to view node - oc create clusterrole view-nodes \ --verb=get,list,watch --resource=nodes- or create from view-nodes yaml - oc create -f manifests/clusterrole-view-nodes.yaml- Output - clusterrole.rbac.authorization.k8s.io/view-nodes created
- Assign role to service account - oc adm policy add-cluster-role-to-user \ view-nodes system:serviceaccount:demo:sa-discovery- Output - clusterrole.rbac.authorization.k8s.io/view-nodes added: "system:serviceaccount:demo:sa-discovery"
Test Service Account
CLI
- Test service account sa-discovery with CLI tool - Get service account sa-discovery token - TOKEN=$(oc sa get-token sa-discovery -n demo)
- Login with service account token - oc login --token=$TOKEN oc whoami- Output - Using project "demo". system:serviceaccount:demo:app-discovery
- Test list resources - clear printf "List configmaps\n" oc get configmaps -n demo echo "Press any keys to continue...";read clear printf "List secrets\n" oc get secrets -n demo echo "Press any keys to continue...";read clear printf "List pods\n" oc get pods -n demo echo "Press any keys to continue...";read clear printf "List services\n" oc get svc -n demo echo "Press any keys to continue...";read clear printf "List nodes\n" oc get nodes echo "Press any keys to continue...";read clear
- Test get secret - oc describe secrets/$(oc get secrets --no-headers|head -n 1|awk '{print $1}')- You will get following error because sa-discovery has only list action - Error from server (Forbidden): secrets "builder-dockercfg-cjfz6" is forbidden: User "system:serviceaccount:demo:sa-discovery" cannot get resource "secrets" in API group "" in the namespace "demo"- REST API
 
- List pods - API=$(oc whoami --show-server) NAMESPACE=demo curl -k -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" $API/api/v1/namespaces/$NAMESPACE/pods- Output - "items": [ { "metadata": { "name": "backend-797f8bfdcc-xrzkw", "generateName": "backend-797f8bfdcc-", "namespace": "demo", "selfLink": "/api/v1/namespaces/demo/pods/backend-797f8bfdcc-xrzkw", "uid": "e6845671-6e46-4b20-aa7b-ced5839341e2", "resourceVersion": "56509", "creationTimestamp": "2021-06-10T09:10:10Z", "labels": { "app": "backend", "pod-template-hash": "797f8bfdcc", "version": "v1" },
- Get sepcified pod - curl -k -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" $API/api/v1/namespaces/$NAMESPACE/pods/<pod-name>
- Get node - curl -k -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" $API/api/v1/nodes/$(oc get nodes --no-headers|head -n 1|awk '{print $1}')
Use Service Account with Deployment
- Backend deployment (backend-discovery-sa.yaml) with custom service account - spec: replicas: 1 selector: matchLabels: app: backend version: v1 template: metadata: creationTimestamp: null labels: app: backend version: v1 annotations: sidecar.istio.io/inject: "false" spec: serviceAccountName: svip-ignite-discovery automountServiceAccountToken: false containers: - name: backend
- Check service account used by pod - oc get pod/<pod-name> -o jsonpath='{.spec.serviceAccountName}'