Kubernetes API: 서비스 계정을 사용자 정의하는 방법
14217 단어 tutorialkubernetesnode
.kubeconfig
파일을 사용하여 그룹에 대한 완전한 접근에 의존했다.그룹 내cron 작업으로 내보내기를 원한다면, 적절한 접근 권한이 필요합니다.처음에 나는cron 작업의 실현에 관한 글을 쓰고 싶었지만 Kubernetes 접근 권한을 연구하는 작업 방식이 매우 교육적인 의미를 가진다는 것을 발견했다.이것이 바로 왜 그것이 네가 지금 읽고 있는 문장이 되었는가 하는 것이다.본문은 최초로 발표되었다my blog.
쿠베르네트스 기본 개념
Kubernetes 클러스터에서 Pod을 실행할 때 기본적으로 기본 설정과 보안 설정이 설정되어 있습니다.풍부한 Kubernetes API에 대한 접근권을 확인하기 위해 기본 자원은
ServiceAccount
, Role
와 RoleBindings
를 포함한다.cron이pod 로그를 읽는 작업 원리를 고려함으로써 이러한 개념을 이해할 수 있습니다.작업이 실행될 때, 이름 공간과pod에 대한 읽기 접근이 필요합니다.액세스는
Role
또는 ClusterRole
에 정의됩니다.Role
는 하나의 명칭 공간에만 한정되어 있기 때문에 우리는 ClusterRole
을 사용할 것이다.pod를 만들면 K8S API에 액세스할 수 있는 기본 시스템 계정 및 기본 시스템 계정 토큰이 제공됩니다.그러나 이 계정은 필요한 접근 권한이 없기 때문에 사용자 정의 ServiceAccount
를 정의해야 합니다.마지막 블록은 RoleBinding
또는 ClusterRoleBinding
: 연결ClusterRole
과 ServiceAccount
입니다.K8S API: 직접 액세스
Kubernetes를 사용할 때 이러한 개념이 어떻게 응용되는지 알아보기 위해 저는 아래excellent article를 따랐습니다. 그 중에서 API는
curl
를 통해 직접 방문했습니다.창설
api-explorer
pod부터 다음 내용으로 파일을 작성api-explorer-pod.yaml
하겠습니다.apiVersion: v1
kind: Pod
metadata:
name: api-explorer
spec:
containers:
- name: alpine
image: alpine
args: ['sleep', '3600']
그리고 용기를 만들고 시작하기를 기다립니다.> kubectl create -f api-explorer-pod.yaml
pod/api-explorer created
그리고 우리는 용기에 뛰어들어 curl
가방을 설치했다.> kubectl api-explorer -it sh
> apk add curl
Kubernetes API에 액세스하려면 항상 유효한 보안 토큰을 보내야 합니다.이 영패는pod내 위치/run/secrets/kubernetes.io/serviceaccount/token
에 저장됩니다.이 영패가 있으면 우리는 API 요청을 보낼 수 있다.> TOKEN=$(cat /run/secrets/kubernetes.io/serviceaccount/token)
> curl -H "Authorization: Bearer $TOKEN" https://kubernetes/api/v1/namespaces/default/pods/ --insecure
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "pods is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"pods\" in API group \"\" in the namespace \"default\"",
"reason": "Forbidden",
"details": {
"kind": "pods"
},
"code": 403
}
그러나 보시다시피 기본 서비스 계정에 정확한 접근 권한이 없기 때문에pod에 접근할 수 없습니다.사용자 지정 서비스 계정 정의
따라서, Kubernetes API에 접근할 수 있도록 정확한 설정
ServiceAccount
이 필요합니다.파일
pod-read-access-service-account.yaml
을 생성하고 정의ServiceAccount
를 맨 위에 놓습니다.이 자원은 기본적으로 메타데이터일 뿐이다.---
apiVersion: v1
kind: ServiceAccount
metadata:
name: log-exporter-sa
namespace: default
labels:
app: log-exporter
---
다음은 ClusterRole
의 정의다.spec
블록에서 방문할 apiGroups
와 resources
를 정의합니다.핵심 API 그룹은 ""
로 표시됩니다resources
.마지막으로, 함수 pods
는 우리가 자원에 응용하고자 하는 동작을 확정했다. 우리의 예에서, 함수의 읽기와 목록이다.---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: log-exporter-cr
labels:
app: log-exporter
rules:
- apiGroups:
- ''
resources:
- pods
- pods/log
- namespaces
verbs:
- get
- list
---
마지막으로 우리는 verbs
자원을 만들어서 RoleBinding
와 SeviceAccount
를 조합한다.---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: log-exporter-rb
roleRef:
kind: ClusterRole
name: log-exporter-cr
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: log-exporter-sa
namespace: default
---
이제 우리는 모든 자원을 창조한다.> kubectl create -f pod-read-access-service-account.yaml
serviceaccount/log-exporter-sa created
clusterrole.rbac.authorization.k8s.io/log-exporter-cr created
rolebinding.rbac.authorization.k8s.io/log-exporter-rb created
더 자세한 정보: 보시다시피 ClusterRole
는 ServiceAccount
명칭 공간에서 현식으로 만들어졌습니다.주의 default
는 정의된 명칭 공간에서 인용해야 하기 때문에 ClusterRoleBinding
그렇지 않으면 정상적으로 작동할 수 없습니다.K8S API: 사용자 지정 서비스 계정으로 액세스
새로 만든
ServiceAccount
을 사용하기 위해pod에서 새로운 캐릭터를 사용하도록 정의했습니다.ServiceAccount
파일로 돌아가서 새 설정 항목api-explorer-pod.yaml
을 추가했습니다.apiVersion: v1
kind: Pod
metadata:
name: api-explorer
spec:
serviceAccountName: log-exporter-sa
containers:
- name: alpine
image: alpine
args: ['sleep', '3600']
용기로 돌아가서, 우리는 영패를 잡고 요청을 했다. 그것은 성공했다.curl -H "Authorization: Bearer $TOKEN" https://kubernetes/api/v1/namespaces/default/pods/ --insecure
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/pods/",
"resourceVersion": "320995"
},
"items": [
{
"metadata": {
"name": "api-explorer2",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/pods/api-explorer2",
"uid": "343aaf7e-1be5-45da-aadb-e83ee329a7fd",
"resourceVersion": "320976",
"creationTimestamp": "2020-05-24T10:16:58Z"
},
...
이제 개념의 최종 증명으로 서로 다른 이름 공간에서pod에서 로그를 읽어봅시다.우리는 spec.serviceAccountName
명칭 공간에서 coredns
pod를 얻었다.kb get pods -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-6d684c7b5-6ww29 1/1 Running 7 8d
coredns-d798c9dd-pdswq 1/1 Running 7 8d
이pod에 접근하는 URL은 다음과 같은 내용으로 구성됩니다: kube-system
.따라서 이 요청이 효력을 발생하려면 정확한 명칭 공간과 정확한pod명칭이 필요합니다./api/v1/namespaces/{namespace}/pods/{name}/log
크레인으로 돌아가서 로그 파일을 보십시오.> curl -H "Authorization: Bearer $TOKEN" https://kubernetes/api/v1/namespaces/kube-system/pods/coredns-d798c9dd-pdswq/log --insecure
[INFO] plugin/reload: Running configuration MD5 = 4665410bf21c8b272fcfd562c482cb82
______ ____ _ _______
/ ____/___ ________ / __ \/ | / / ___/ ~ CoreDNS-1.6.3
/ / / __ \/ ___/ _ \/ / / / |/ /\__ \ ~ linux/arm, go1.12.9, 37b9550
/ /___/ /_/ / / / __/ /_/ / /| /___/ /
\____/\____/_/ \___/_____/_/ |_//____/
우리는 그것이 예상대로 운행하는 것을 보고 매우 기뻤다.결론
본 논문에서, 우리는 모든 이름 공간에서 POD와 로그 파일에 접근하는 데 필요한 Kubernetes 자원을 이해했다.A
api-explorer
는 어떤 자원과 그 자원에 대해 어떤 행동을 취해야 하는지를 정의했다.이러한 접근 권한은 aClusterRole
에서 aClusterRoleBinding
까지의 제약을 받는다.그리고 우리는 이것ServiceAccount
을 사용하여 ServiceAccount
에 대한 접근 권한을 제공합니다.우리는 Pod
명령을 사용하여pod에서Kubernetes API에 접근하는 방법을 보여 주었다.다음 글은 이 서비스 계정을 사용하여 로그 파일을 내보내는cron 작업을 어떻게 하는지 보여 줍니다.
Reference
이 문제에 관하여(Kubernetes API: 서비스 계정을 사용자 정의하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/admantium/kubernetes-access-rights-and-custom-service-account-3plh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)