I'm going through this post, where we bind a Role to a Service Account and then query the API Server using said Service Account. The role only has list
permission to the pods
resource.
I did an experiment where I mounted a random Secret into a Pod that is using the above Service Account and my expectation was that the Pod would attempt to query the Secret and fail the creation process, but the pod is actually running successfully with the secret mounted in place.
So I'm left wondering when does a pod actually needs to query the API Server for resources or if the pod creation process is special and gets the resources through other means.
Here is the actual list of resources I used for my test:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: example-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: example-role
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: example-rb
subjects:
- kind: ServiceAccount
name: example-sa
roleRef:
kind: Role
name: example-role
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Secret
metadata:
name: example-secret
data:
password: c3RhY2tvdmVyZmxvdw==
---
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
serviceAccountName: example-sa
containers:
- name: webserver
image: nginx
volumeMounts:
- name: secret-volume
mountPath: /mysecrets
volumes:
- name: secret-volume
secret:
secretName: example-secret
...
I must admit that at first I didn't quite get your point, but when I read your question again I think now I can see what it's all about. First of all I must say that your initial interpretation is wrong. Let me explain it.
You wrote:
I did an experiment where I mounted a random Secret into a Pod that is using the above Service Account
Actually the key word here is "I". The question is: who creates a Pod
and who mounts a random Secret
into this Pod
? And the answer to that question from your perspective is simple: me. When you create a Pod
you don't use the above mentioned ServiceAccount
but you authorize your access to kubernetes API** through entries in your .kube/config
file. During the whole Pod
creation process the ServiceAccount
you created is not used a single time.
and my expectation was that the Pod would attempt to query the Secret and fail the creation process, but the pod is actually running successfully with the secret mounted in place.
Why would it query the Secret
if it doesn't use it ?
You can test it in a very simple way. You just need to kubectl exec
into your running Pod
and try to run kubectl
, query kubernetes API directly or use one of the officially supported kubernetes cliet libraries. Then you will see that you're allowed to perform only specific operations, listed in your Role
i.e. list Pods
. If you attempt to run kubectl get secrets
from within your Pod
, it will fail.
The result you get is totally expected and there is nothig surprising in the fact that a random Secret
is successfully mounted and a Pod
is being created successfully every time. It's you who query kubernetes API and request creation of a Pod
with a Secret
mounted. **It's not Pod
's
ServiceAccount
.
So I'm left wondering when does a pod actually needs to query the API Server for resources or if the pod creation process is special and gets the resources through other means.
If you don't have specific queries e.g. written in python that use Kubernetes Python Client library that are run by your Pod
or you don't use kubectl
command from within such Pod
, you won't see it making any queries to kubernetes API as all the queries needed for its creation process are performed by you, with permissions given to your user.