-
Notifications
You must be signed in to change notification settings - Fork 3
internal/checks/kube: add more API resource requirements #10
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,20 +6,53 @@ import ( | |
"github.com/cdr/coder-doctor/internal/api" | ||
) | ||
|
||
// This is a list of all known Resource and/or RBAC requirements for each verison of Coder. | ||
// Order by version DESCENDING. | ||
var allRequirements = []VersionedResourceRequirements{ | ||
{ | ||
VersionConstraints: api.MustConstraint(">= 1.20"), | ||
ResourceRequirements: map[*ResourceRequirement]ResourceVerbs{ | ||
NewResourceRequirement("", "v1", "pods"): verbsCreateDeleteList, | ||
NewResourceRequirement("", "v1", "secrets"): verbsCreateDeleteList, | ||
NewResourceRequirement("", "v1", "serviceaccounts"): verbsCreateDeleteList, | ||
NewResourceRequirement("", "v1", "services"): verbsCreateDeleteList, | ||
NewResourceRequirement("apps", "apps/v1", "deployments"): verbsCreateDeleteList, | ||
NewResourceRequirement("apps", "apps/v1", "replicasets"): verbsCreateDeleteList, | ||
NewResourceRequirement("apps", "apps/v1", "statefulsets"): verbsCreateDeleteList, | ||
NewResourceRequirement("networking.k8s.io", "networking.k8s.io/v1", "ingresses"): verbsCreateDeleteList, | ||
NewResourceRequirement("rbac.authorization.k8s.io", "rbac.authorization.k8s.io/v1", "roles"): verbsCreateDeleteList, | ||
NewResourceRequirement("rbac.authorization.k8s.io", "rbac.authorization.k8s.io/v1", "rolebindings"): verbsCreateDeleteList, | ||
NewResourceRequirement("", "v1", "events"): verbsAll, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Putting this here so we can have a threaded discussion:
@johnstcn I think it's preferable to figure out if we can reduce our requests before we parallelize, because doing stuff in parallel increases load on the API server and it might have throttling in place anyways. Is it possible to check multiple RBAC settings in one API call? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agreed, I believe doing the equivalent of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, working code is better than perfect code :) |
||
NewResourceRequirement("", "v1", "persistentvolumeclaims"): verbsAll, | ||
NewResourceRequirement("", "v1", "pods"): verbsAll, | ||
NewResourceRequirement("", "v1", "secrets"): verbsAll, | ||
NewResourceRequirement("", "v1", "serviceaccounts"): verbsAll, | ||
NewResourceRequirement("", "v1", "services"): verbsAll, | ||
NewResourceRequirement("apps", "apps/v1", "deployments"): verbsAll, | ||
NewResourceRequirement("apps", "apps/v1", "replicasets"): verbsAll, | ||
NewResourceRequirement("apps", "apps/v1", "statefulsets"): verbsAll, | ||
NewResourceRequirement("metrics.k8s.io", "metrics.k8s.io/v1beta1", "pods"): verbsGetListWatch, | ||
NewResourceRequirement("networking.k8s.io", "networking.k8s.io/v1", "ingresses"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "networking.k8s.io/v1", "networkpolicies"): verbsAll, | ||
NewResourceRequirement("rbac.authorization.k8s.io", "rbac.authorization.k8s.io/v1", "roles"): verbsGetCreate, | ||
NewResourceRequirement("rbac.authorization.k8s.io", "rbac.authorization.k8s.io/v1", "rolebindings"): verbsGetCreate, | ||
NewResourceRequirement("storage.k8s.io", "storage.k8s.io/v1", "storageclasses"): verbsGetListWatch, | ||
}, | ||
RoleOnlyResourceRequirements: map[*ResourceRequirement]ResourceVerbs{ | ||
// The below permissions are required by the default coder role created by the Helm chart. | ||
// Installation will fail if these are not present in the role being used to install Coder. | ||
NewResourceRequirement("", "v1", "deployments"): verbsAll, | ||
NewResourceRequirement("", "v1", "networkpolicies"): verbsAll, | ||
NewResourceRequirement("", "v1", "pods/exec"): verbsAll, | ||
NewResourceRequirement("", "v1", "pods/log"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "events"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "networkpolicies"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "persistentvolumeclaims"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "pods"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "pods/exec"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "pods/log"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "secrets"): verbsAll, | ||
NewResourceRequirement("apps", "v1", "services"): verbsAll, | ||
NewResourceRequirement("metrics.k8s.io", "v1beta1", "storageclasses"): verbsGetListWatch, | ||
NewResourceRequirement("networking.k8s.io", "v1", "deployments"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "v1", "events"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "v1", "persistentvolumeclaims"): verbsAll, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. some of these don't appear to be networking requirements, maybe a typo of the group name here? Not sure if that's related to your comment:
There might be an issue in our Helm chart... The RBAC permissions are done very generically at an API level, so do not account for whether or not the resources actually exist. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, the enterprise helm chart specifies the following: rules:
- apiGroups: ["", "apps", "networking.k8s.io"] # "" indicates the core API group
resources: ["persistentvolumeclaims", "pods", "deployments", "services", "secrets", "pods/exec","pods/log", "events", "networkpolicies"]
verbs: ["create", "get", "list", "watch", "update", "patch", "delete", "deletecollection"]
- apiGroups: ["metrics.k8s.io", "storage.k8s.io"]
resources: ["pods", "storageclasses"]
verbs: ["get", "list", "watch"] That seems to be exploded by Kubernetes to the things we're seeing. |
||
NewResourceRequirement("networking.k8s.io", "v1", "pods"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "v1", "pods/exec"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "v1", "pods/log"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "v1", "secrets"): verbsAll, | ||
NewResourceRequirement("networking.k8s.io", "v1", "services"): verbsAll, | ||
NewResourceRequirement("storage.k8s.io", "v1", "pods"): verbsGetListWatch, | ||
}, | ||
}, | ||
} | ||
|
@@ -39,11 +72,16 @@ type ResourceVerbs []string | |
type VersionedResourceRequirements struct { | ||
VersionConstraints *semver.Constraints | ||
ResourceRequirements map[*ResourceRequirement]ResourceVerbs | ||
// These are only required because the role in the Helm chart specifies broad swathes of permissions that | ||
// don't necessarily exist in the real world. | ||
RoleOnlyResourceRequirements map[*ResourceRequirement]ResourceVerbs | ||
} | ||
|
||
var verbsCreateDeleteList ResourceVerbs = []string{"create", "delete", "list"} | ||
var verbsAll ResourceVerbs = []string{"create", "delete", "deletecollection", "get", "list", "update", "patch", "watch"} | ||
var verbsGetListWatch = []string{"get", "list", "watch"} | ||
var verbsGetCreate = []string{"get", "create"} | ||
|
||
// NewResourceRequirement is just a convenience function for creating ResourceRequirements. | ||
// NewResourceRequirement is just a convenience function for creating ResourceRequirements for which the resource type must exist. | ||
func NewResourceRequirement(apiGroup, version, resource string) *ResourceRequirement { | ||
return &ResourceRequirement{ | ||
Group: apiGroup, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is 100% duplicated code, but it's easy to delete.