드문드문 k8s를 사용하다보니 매번 반복적으로 쉬운 것들을 잊곤 합니다.
오랜만에 또 새로운 클러스터를 새로운 환경에 만드느라 삽질하는 요즈음,
잊었던 것들을 또 하나씩 적어 볼까 합니다.
ServiceAccount 생성
이번에는 CI/CD 연동 등을 통해 k8s 클러스터에 대한 작업을 같이 수행하고 있습니다.
빌드 배포시마다 k8s 환경이 잘 구축되어 있는지를 점검하려는 욕심에 그만...
그래서 ServiceAccount 의 생성이 필요해졌습니다.
요약하면... 걍 만들면 됩니다.
그래도 우리는 선언적으로 만드는게 좋겠죠.
네, drone을 쓰려는 중입니다 ㅎㅎ
apiVersion: v1
kind: ServiceAccount
metadata:
name: drone-bot
Role 선언
이번엔 ServiceAccount에 연결할 Role을 정의해 봅시다.
Role을 정의하려다 보니 apiGroups와 해당되는 resources
그리고 사용 가능한 verbs가 뭐가 있는지 또 헤메기 시작합니다.
% kubectl api-resources -o wide
kubectl로 위 명령을 입력하면 필요한 모든 것들이 쫘아악~
필요한 권한과 대상 리소스에 대한 내용을 확인하면 됩니다.
늘 느끼는 거지만 APIVERSION은 왜 이리 아스트랄한지...
몇 가지 골라서 일단 때려 넣습니다.
보안 헛점은 일단 고려치 않습니다 ㅎㅎ
필요한 동사들은 조금 더 발라내 봐야겠네요.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: drone-bot
rules:
- apiGroups: [""]
resources: ["configmaps", "secrets", "services", "namespaces"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get", "list","watch", "create", "update", "patch", "delete"]
복수형에 주의하시고,
엉뚱한 apiGroups에 넣지 않도록 주의합시다!
ServiceAccount와 Role을 연결하는 RoleBinding
이렇게 두개의 k8s 객체를 만들었으니 이제 연결해야겠죠?
RBAC으로 권한 부여를 할 것이기 때문에 RoleBinding을 하면 됩니다.
이름이 다 drone-bot이라 헷갈릴 수 있지만...
metadata.name 은 RoleBinding의 이름이고
subjects.kind[].name은 생성한 ServieAccount의 이름이며
roleRef.name은 생성한 Role의 이름입니다.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: drone-bot
subjects:
- kind: ServiceAccount
name: drone-bot
roleRef:
kind: Role
name: drone-bot
apiGroup: rbac.authorization.k8s.io
그럼... 이제 생성해보러...