kubectl 명령을 실행했을 때 요청했던 유저는 kubernetes-admin 유저이다.
# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.100.0.104:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: ingress-nginx
user: kubernetes-admin
name: ingress-admin@kubernetes
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
kubenetes-admin의 인증 정보는 ~/.kube/config 아래에 등록되어있다.
# cat ~/.kube/config
API 접근제어
- API 인증요청
1) User/Group, Service Account(application)
- Authentication
1) user 또는 applicatoin이 API에 접근을 허가 받는 과정
2) 인증방식 : 클라이언트 인증서, 베어러 토큰(bearer token), HTTP 기본인증 지원
- Authorization
1) RBAC 모델기반
2) 요청 ID에 적절한 role이 있는지 확인
- Admission Control
1) 요청이 올바른 형식인지 판별
2) 요청이 처리되기 전에 수정사항을 잠재적으로 적용
API 인증
- 서버에 접근하기 위해서는 인증작업 필요
1) 일반사용자 또는 그룹 : 클러스터 외부에서 쿠버네티스를 조작하는 사용자로 다양한 방법으로 인증을 거친다.
2) 서비스계정 : 쿠버네티스 내부적으로 관리되며 Pod가 쿠버네티스 API를 다룰 때 사용하는 계정이다.
API 유저 생성
- 쿠버네티스 사이트 내용을 바탕으로 유저 생성 진행
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/
openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"
ls
myuser.csr myuser.key
.csr : 인증서 요청 파일
.key : private 키 파일
CertificateSigningRequest 만들기
vi csr-myuser.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
/// request 키 파일과 expirationSeconds 삭제
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request:
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
EOF
// 인증서 파일 생성 후 request 에 추가한다.
cat myuser.csr | base64 | tr -d "\n"
인증서 파일을 등록한 후 확인 하면 pending 상태가 나오며, 승인 요청을 해줘야한다.
kubectl apply -f csr-myuser.yaml
certificatesigningrequest.certificates.k8s.io/myuser created
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
myuser 57s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Pending
kubectl certificate approve myuser
certificatesigningrequest.certificates.k8s.io/myuser approved
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
myuser 2m47s kubernetes.io/kube-apiserver-client kubernetes-admin <none> Approved,Issued
myuser의 csr 정보를 yaml 형태로 확인
kubectl get csr myuser -o yaml
인증서 저장
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
Service Account
- 쿠버네티스 내부적으로 관리되는 Account
- Pod가 실행될 때 특별히 ServiceAccount를 설정하지 않으면 같은 namespace에 default 라는 ServiceAccount가 할당됨
kubectl get serviceaccounts
NAME SECRETS AGE
default 0 66d
testpod 생성 후 serviceAccount가 default로 할당되는지 확인
kubectl run testpod --image=nginx
pod/testpod created
kubectl get pods testpod -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-01-29T07:34:49Z"
labels:
run: testpod
name: testpod
namespace: default
resourceVersion: "169974"
uid: 7542d68b-15d0-4ee0-86d3-3335a3cf37cf
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: testpod
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-4nstk
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: node1.example.com
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
pod-viewer 라는 serviceaccount 생성 후 testpod.yaml 에 serviceAccount 추가 후 pod를 실행한 다음 설정 확인
kubectl create serviceaccount pod-viewer
serviceaccount/pod-viewer created
kubectl get sa
NAME SECRETS AGE
default 0 66d
pod-viewer 0 5s
vi testpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: testpod
namespace: default
spec:
containers:
- image: nginx
name: testpod
serviceAccount: pod-viewer
kubectl create -f testpod.yaml
pod/testpod created
kubectl get pods
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 8s
kubectl get pods -o yaml
apiVersion: v1
items:
- apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-01-29T07:40:38Z"
name: testpod
namespace: default
resourceVersion: "170477"
uid: eec52623-4b50-4c4a-9e68-3bd0ca1b55e5
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: testpod
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-f9qdx
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: node1.example.com
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: pod-viewer
serviceAccountName: pod-viewer
[참고]
- 유투브 따배쿠 강의
'Kubernetes' 카테고리의 다른 글
[kubernetes] Kubernetes 스토리지 (0) | 2023.01.30 |
---|---|
[Kubernetes] Kubernetes 권한 (0) | 2023.01.29 |
[Kubernetes] taint&toleraton, cordon&drain (0) | 2023.01.27 |
[Kubernetes] Pod Scheduling (1) | 2023.01.26 |
[Kubernetes] Istio 정리 (0) | 2023.01.25 |