@media only screen and (max-width:991px){.lgUA-dd{display:block;}}/*!sc*/ @media only screen and (min-width:992px){.lgUA-dd{display:grid;grid-template-columns:20% 50% 30%;}}/*!sc*/ data-styled.g1[id="sc-bdnylx"]{content:"lgUA-dd,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){.jqIXaF{grid-row-start:3;grid-row-end:4;}}/*!sc*/ data-styled.g2[id="sc-gtssRu"]{content:"jqIXaF,"}/*!sc*/ @media only screen and (max-width:991px){.cWHJEl{height:50px;grid-row-start:1;grid-row-end:2;border-bottom:none;display:block;}}/*!sc*/ @media only screen and (min-width:992px){.cWHJEl{height:80px;grid-row-start:1;grid-row-end:2;border-bottom:1px solid var(--unaccepted-color);display:grid;grid-template-columns:80% 10% 10%;}}/*!sc*/ data-styled.g3[id="sc-dlnjPT"]{content:"cWHJEl,"}/*!sc*/ .jusCDq{font-family:'Roboto';}/*!sc*/ @media only screen and (max-width:991px){.jusCDq{margin-left:0;}}/*!sc*/ @media only screen and (min-width:992px){.jusCDq{margin-left:var(--margin);}}/*!sc*/ data-styled.g5[id="sc-eCApGN"]{content:"jusCDq,"}/*!sc*/ .kiTsHr{-webkit-text-decoration:none;text-decoration:none;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;background-color:papayawhip;border-radius:10px;padding:calc(var(--prism-padding)/4);}/*!sc*/ @media only screen and (max-width:991px){.kiTsHr{margin-left:auto;margin-right:auto;}}/*!sc*/ @media only screen and (min-width:992px){.kiTsHr{margin-left:0;margin-right:0;}}/*!sc*/ data-styled.g6[id="sc-jSFkmK"]{content:"kiTsHr,"}/*!sc*/ .gmemPO{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ @media only screen and (max-width:991px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ data-styled.g7[id="sc-gKAblj"]{content:"gmemPO,"}/*!sc*/ .hPRGzu{display:inline-block;color:#48c1eb;}/*!sc*/ @media only screen and (max-width:991px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ data-styled.g8[id="sc-iCoHVE"]{content:"hPRGzu,"}/*!sc*/ .jqApVD{display:inline-block;color:#b77eff;}/*!sc*/ @media only screen and (max-width:991px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ data-styled.g9[id="sc-fujyUd"]{content:"jqApVD,"}/*!sc*/ @media only screen and (max-width:991px){.diRbeU{grid-row-start:2;grid-row-end:3;}}/*!sc*/ @media only screen and (min-width:992px){.diRbeU{grid-column-start:1;grid-column-end:2;grid-row-start:2;grid-row-start:3;}}/*!sc*/ data-styled.g14[id="sc-crzoUp"]{content:"diRbeU,"}/*!sc*/ .beZpRy{border:3px var(--border-color) solid;box-shadow:var(--box-shadow-size) var(--box-shadow-size) var(--unaccepted-color);overflow-wrap:break-word;}/*!sc*/ @media only screen and (max-width:991px){.beZpRy{margin:0;padding:calc(var(--prism-padding) / 2);max-width:calc(100vw - calc(var(--prism-padding) / 0.4));}}/*!sc*/ @media only screen and (min-width:992px){.beZpRy{grid-column-start:1;grid-column-end:2;margin:var(--prism-padding);padding:var(--prism-padding);}}/*!sc*/ data-styled.g15[id="sc-dIsAE"]{content:"beZpRy,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g16[id="sc-bqGHjH"]{content:"jOGTxR,"}/*!sc*/ .hqplyp{color:gray;}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g17[id="sc-ksluoS"]{content:"hqplyp,"}/*!sc*/ .biJanX{text-align:right;font-style:italic;}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g18[id="sc-hBMVcZ"]{content:"biJanX,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g19[id="sc-fnVYJo"]{content:"hbxbBL,"}/*!sc*/ .gGxjsg{width:40%;height:5px;background-color:var(--unaccepted-color);border:none;margin:auto;margin-top:15px;margin-bottom:10px;}/*!sc*/ @media only screen and (max-width:991px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ data-styled.g20[id="sc-fFSRdu"]{content:"gGxjsg,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g21[id="sc-bkbjAj"]{content:"jRzNCt,"}/*!sc*/ @media only screen and (max-width:991px){.bYuBoO{grid-row-start:3;grid-row-end:4;}}/*!sc*/ @media only screen and (min-width:992px){.bYuBoO{grid-column-start:2;grid-column-end:3;padding:calc(var(--prism-padding) /1);}}/*!sc*/ data-styled.g22[id="sc-iemXMA"]{content:"bYuBoO,"}/*!sc*/ .kUvyRY{box-shadow:var(--box-shadow-size) var(--box-shadow-size) var(--primary-color);overflow-wrap:break-word;padding:calc(var(--prism-padding) / 2);border:1px solid blue;margin:calc(var(--prism-padding) / 2);}/*!sc*/ @media only screen and (max-width:991px){.kUvyRY{display:block;margin-left:0;margin-right:calc(var(--prism-padding) / 4);}}/*!sc*/ @media only screen and (min-width:992px){.kUvyRY{display:inline-block;}}/*!sc*/ data-styled.g23[id="sc-dIvqjp"]{content:"kUvyRY,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){.kgfarp{-webkit-text-decoration:none;text-decoration:none;}}/*!sc*/ data-styled.g24[id="sc-hHEjAm"]{content:"kgfarp,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){.jhbzHN{margin:calc(var(--prism-padding) / 4);}}/*!sc*/ data-styled.g25[id="sc-dlMBXb"]{content:"jhbzHN,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){.ipBxef{float:right;padding-top:var(--prism-padding);}}/*!sc*/ data-styled.g26[id="sc-kfYqjs"]{content:"ipBxef,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){.fNfboX{display:inline-block;padding:calc(var(--prism-padding) / 4);border:1px solid var(--secondary-color);color:var(--secondary-color);margin-right:calc(var(--prism-padding) / 4);margin-bottom:calc(var(--prism-padding) / 4);}}/*!sc*/ data-styled.g27[id="sc-fKgIGh"]{content:"fNfboX,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g28[id="sc-bCwgka"]{content:"kCbTfo,"}/*!sc*/ .eohSKo{color:gray;}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g29[id="sc-iwaifL"]{content:"eohSKo,"}/*!sc*/ .dvQjiN{text-align:right;font-style:italic;}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g30[id="sc-cxNIbT"]{content:"dvQjiN,"}/*!sc*/ @media only screen and (max-width:991px){}/*!sc*/ @media only screen and (min-width:992px){.lnacFT{grid-column-start:2;grid-column-end:4;}}/*!sc*/ data-styled.g31[id="sc-lmgQde"]{content:"lnacFT,"}/*!sc*/ @media only screen and (max-width:991px){.dmJaPZ{padding:calc(var(--prism-padding) / 2);display:grid;grid-template-rows:auto auto auto;}}/*!sc*/ @media only screen and (min-width:992px){.dmJaPZ{padding:0;display:grid;grid-template-columns:62.5% 37.5%;grid-template-rows:auto auto;}}/*!sc*/ data-styled.g32[id="sc-iJCRLp"]{content:"dmJaPZ,"}/*!sc*/ .jVqPkz{border:3px solid var(--border-color);box-shadow:var(--box-shadow-size) var(--box-shadow-size) var(--primary-color);grid-row-start:1;grid-row-end:2;overflow-wrap:break-word;}/*!sc*/ @media only screen and (max-width:991px){.jVqPkz{padding:calc(var(--prism-padding) / 2);max-width:calc(100vw - calc(var(--prism-padding) / 0.4));}}/*!sc*/ @media only screen and (min-width:992px){.jVqPkz{margin:var(--prism-padding);padding:var(--prism-padding);}}/*!sc*/ data-styled.g33[id="sc-giAqnE"]{content:"jVqPkz,"}/*!sc*/ @media only screen and (max-width:600px){}/*!sc*/ @media only screen and (min-width:600px){}/*!sc*/ @media only screen and (min-width:768px){}/*!sc*/ @media only screen and (min-width:992px){}/*!sc*/ @media only screen and (min-width:1200px){}/*!sc*/ data-styled.g34[id="sc-ezzayL"]{content:"kJKIJS,"}/*!sc*/ body{position:absolute;top:0;margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen', 'Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue', sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--prism-padding:20px;--margin:1.62em;--box-shadow-size:6px;--box-shadow:var(--box-shadow-size) var(--box-shadow-size) var(--primary-color);--box-shadow-hover:10px 10px var(--primary-color);--easing:200ms ease-in-out;--primary-color:#cdf2ff;--accepted-color:#bbffb8;--unaccepted-color:#eee;--border-color:#c8c8c8;--secondary-color:#9547b7;--dark-color:#282936;height:100vh;width:100%;}/*!sc*/ #root{height:100%;}/*!sc*/ h1{display:block;font-size:2em;margin-block-start:0.67em;margin-block-end:0.67em;margin-inline-start:0px;margin-inline-end:0px;font-weight:bold;}/*!sc*/ h2{display:block;font-size:1.5em;margin-block-start:0.83em;margin-block-end:0.83em;margin-inline-start:0px;margin-inline-end:0px;font-weight:bold;}/*!sc*/ img{width:100%;}/*!sc*/ pre{overflow-wrap:auto;overflow-x:scroll;}/*!sc*/ blockquote{border-left:2px solid var(--unaccepted-color);margin-block-start:0px;margin-inline-start:0px;padding-left:20px;}/*!sc*/ data-styled.g45[id="sc-global-bcwoHH1"]{content:"sc-global-bcwoHH1,"}/*!sc*/ gt; kubectl get cronjob/test -n my_namespace Error from server (Forbidden): cronjobs...."/>
Greetings fellow tinkerers !
What is my issue ?
In a nutshell, user toto can't "get" a cronjob, even though the permissions seem fine. More precisely:
gt; kubectl get cronjob/test -n my_namespace
Error from server (Forbidden): cronjobs.batch "test" is forbidden: User "toto" cannot get resource "cronjobs" in API group "batch" in the namespace "my_namespace"
gt; kubectl auth can-i get cronjob/test -n my_namespace
no
even tough:
gt; kubectl auth can-i get cronjobs -n my_namespace
yes
gt; kubectl auth can-i --list -n my_namespace
Resources Non-Resource URLs Resource Names Verbs
...
cronjobs.batch [] [] [get list watch list watch get]
...
gt; kubectl get cronjobs -n my_namespace
NAME SCHEDULE ... AGE
test */5 * * * * 2d21h
Please also note that the command works fine when executed by an admin-level user (from group system:masters), or if I add toto to the group system:masters.
What have I tried ?
I added full-permissions to all resources in all namespaces, to a group toto belongs to (let's call it my_group). The fact that it didn't work even then makes me think that my issue might not be caused by permissions but by another k8s mechanism.
Additional informations
As requested here are some additional informations:
gt; kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T23:41:55Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.9-eks-c0eccc", GitCommit:"c0eccca51d7500bb03b2f163dd8d534ffeb2f7a2", GitTreeState:"clean", BuildDate:"2019-12-22T23:14:11Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
The cluster is hosted on AWS using the EKS service, therefore:
aws-iam-authenticator
binaryaws-auth
ConfigMapWhich for those 2 latter points, translates to the following yaml files:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
...
mapUsers: |
...
- userarn: arn:aws:iam::xxxxxxxxxxxx:user/toto
username: toto
groups:
- system:basic-user
- my_group
...
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my_role
rules:
...
- apiGroups: ["batch"]
resources: ["cronjobs"]
resourceNames: [""]
verbs: ["list", "watch", "get"]
...
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my_rolebinding
namespace: my_namespace
subjects:
- kind: Group
name: my_group
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: my_role
apiGroup: rbac.authorization.k8s.io
OK. So got it. The issue is the parameter resourceNames
. When you specify this parameter, you need to also specify what specific resource name you mean.
Example:
If you create thisRole
...
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my_role
namespace: toto
rules:
- apiGroups: ["", "batch"]
resources: ["cronjobs"]
resourceNames: [""]
verbs: ["list", "watch", "get"]
...and get cronjobs, you will get them, but you won't get a specific cronJob
by name.
# kubectl -n toto --context toto-context get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-pod */1 * * * * False 0 4d21h 4d21h
# kubectl -n toto --context toto-context get cronjob cronjob-pod
Error from server (Forbidden): cronjobs.batch "cronjob-pod" is forbidden: User "toto" cannot get resource "cronjobs" in API group "batch" in the namespace "toto"
But if you remove the parameter resourceNames
, or write the resource name you want to get, it will work. So the following Role
would work:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my_role
namespace: toto
rules:
- apiGroups: ["", "batch"]
resources: ["cronjobs"]
verbs: ["list", "watch", "get"]
# kubectl -n toto --context toto-context get cronjob cronjob-pod
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-pod */1 * * * * False 0 4d21h 4d21h
Also, in my case, this one would work:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my_role
namespace: toto
rules:
- apiGroups: ["", "batch"]
resources: ["cronjobs"]
resourceNames: ["cronjob-pod"] <- specify the resource name
verbs: ["list", "watch", "get"]
Note: resourceNames: ["*"]
won't work.
If I'm not mistaken, the API group is batch
and resource is cronjobs
not cronjobs.batch
.
Kubernetes cluster-roles.yaml and docs for Kubernetes API cronjob.
yaml
role should look like the following:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: my_namespace
name: toto
rules:
- apiGroups: ["", "batch"]
resources: ["cronjobs"]
verbs: ["get", "list", "watch", "list", "watch"]