Skip to content

Commit 91c6a8d

Browse files
Merge pull request #220 from asauber/docs-limited-kubeconfigs
Document Role-limited kubeconfigs
2 parents 7b8e6e5 + ea185f0 commit 91c6a8d

File tree

5 files changed

+194
-0
lines changed

5 files changed

+194
-0
lines changed

docs/SUMMARY.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
- [The `chime-live` Cluster](./operations/chime-live-cluster.md)
1414
- [Deploy to Heroku](./operations/heroku.md)
1515
- [Deploy to Your Own Cluster](./operations/byok8s.md)
16+
- [Limited Cluster Access for Deployment][1]
1617
- [Code of Conduct](CODE_OF_CONDUCT.md)
1718
- [Maintainers](MAINTAINERS.md)
1819
- [Glossary](GLOSSARY.md)
20+
21+
[1]: ./operations/limited-kubeconfigs/limited-kubeconfigs.md
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# Creating Kubeconfigs with Limited Permissions
2+
3+
## Create a Role
4+
5+
Kubernetes has two primary resources which represent a set of permissions,
6+
Roles and ClusterRoles. ClusterRoles apply to resources in all namespaces,
7+
whereas Roles are limited to a specific namespace. Let's create a Role in the
8+
chime namespace which will allow read/write access to Deployments and
9+
read-only access to Pods.
10+
11+
deployer.yaml:
12+
13+
```
14+
apiVersion: rbac.authorization.k8s.io/v1
15+
kind: Role
16+
metadata:
17+
name: deployer
18+
namespace: chime
19+
rules:
20+
- apiGroups:
21+
- apps
22+
resources:
23+
- deployments
24+
verbs:
25+
# we are _not_ including 'create' and 'delete'
26+
- get
27+
- list
28+
- watch
29+
- update
30+
- patch
31+
- apiGroups:
32+
- ""
33+
resources:
34+
- pods
35+
verbs:
36+
# so that we can observe our pods getting created
37+
- get
38+
- list
39+
- watch
40+
```
41+
42+
## Create a ServiceAccount
43+
44+
One of the subjects which can take on a Role is a ServiceAccount. Let's
45+
create a ServiceAccount called penn-deployer in the chime namespace:
46+
47+
```
48+
apiVersion: v1
49+
kind: ServiceAccount
50+
metadata:
51+
name: penn-deployer
52+
namespace: chime
53+
```
54+
55+
## Create a RoleBinding
56+
57+
We can now give the ServiceAccount the Role that we created earlier using a
58+
RoleBinding in the chime namespace.
59+
60+
```
61+
apiVersion: rbac.authorization.k8s.io/v1
62+
kind: RoleBinding
63+
metadata:
64+
name: penn-deployer:deployer
65+
namespace: chime
66+
roleRef:
67+
apiGroup: rbac.authorization.k8s.io
68+
kind: Role
69+
name: deployer
70+
subjects:
71+
- kind: ServiceAccount
72+
name: penn-deployer
73+
namespace: chime
74+
```
75+
76+
## Grabbing the token for the ServiceAccount
77+
78+
Every ServiceAccount gets a token, lets grab it.
79+
80+
```
81+
k get secrets -n chime
82+
```
83+
84+
Look for `penn-deployer-token-<hash>`
85+
86+
```
87+
k get secrets -n chime penn-deployer-token-<hash>
88+
```
89+
90+
Grab the "token:" base64 encoded token.
91+
92+
*base64 decode this token, which will produce base64*
93+
94+
## Creating a token-based kubeconfig
95+
96+
Now take a look at the Kubeconfig that you are currently using. Does it use a
97+
token? If so, you can construct a Kubeconfig for this ServiceAccount by copying
98+
your kubeconfig and replacing the token and user name with this decoded token
99+
and the user name "penn-deployer".
100+
101+
It will look something like this:
102+
103+
```
104+
apiVersion: v1
105+
kind: Config
106+
preferences: {}
107+
108+
clusters:
109+
- name: chime-cluster
110+
cluster:
111+
certificate-authority-data: <ca-cert-base64, same as existing>
112+
server: https://<server-hostname>:<server-port>
113+
114+
users:
115+
- name: penn-deployer
116+
user:
117+
as-user-extra: {}
118+
token: <ServiceAccount token! Be very sure that this is the ServiceAccount token!>
119+
120+
contexts:
121+
- name: penn-deployer-chime
122+
context:
123+
cluster: chime-cluster
124+
user: penn-deployer
125+
namespace: chime
126+
127+
current-context: penn-deployer-chime
128+
```
129+
130+
## Test out your token-based Kubeconfig
131+
132+
You can now use this ServiceAccount to modify Deployments, and view Pods, but do nothing else.
133+
134+
```
135+
$ k get pods -A
136+
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:chime:penn-deployer" cannot list resource "pods" in API group "" at the cluster scope
137+
```
138+
139+
```
140+
$ export KUBECONFIG=new-kubeconfig.yaml
141+
$ k get pods -n chime
142+
$ k get deployments -n chime
143+
# deploy version 0.5.0
144+
$ k set image deployment/chime -n chime chime=docker.pkg.github.com/codeforphilly/chime/penn-chime:0.5.0 --record
145+
# observe status of deployment
146+
$ k get pods -n chime
147+
```
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
apiVersion: rbac.authorization.k8s.io/v1
2+
kind: Role
3+
metadata:
4+
name: deployer
5+
namespace: chime
6+
rules:
7+
- apiGroups:
8+
- apps/v1
9+
resources:
10+
- deployments
11+
verbs:
12+
# we are _not_ including 'create' and 'delete'
13+
- get
14+
- list
15+
- watch
16+
- update
17+
- patch
18+
- apiGroups:
19+
- ""
20+
resources:
21+
- pods
22+
verbs:
23+
# so that we can observe our pods getting created
24+
- get
25+
- list
26+
- watch
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: rbac.authorization.k8s.io/v1
2+
kind: RoleBinding
3+
metadata:
4+
name: penn-deployer:deployer
5+
namespace: chime
6+
roleRef:
7+
apiGroup: rbac.authorization.k8s.io
8+
kind: Role
9+
name: deployer
10+
subjects:
11+
- kind: ServiceAccount
12+
name: penn-deployer
13+
namespace: chime
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
apiVersion: v1
2+
kind: ServiceAccount
3+
metadata:
4+
name: penn-deployer
5+
namespace: chime

0 commit comments

Comments
 (0)