Exercise 15.2: Authentication and Authorization
CP 노드에 연결된 터미널로 이동
Namespace 생성
{ kubectl create ns development kubectl create ns production }
Pod 생성
{ kubectl run app-dev --image=nginx -n development kubectl run app-prod --image=nginx -n production }
현재 설정된 Context 확인 - 클러스터, 인증, 네임스페이스 정보
kubectl config get-contexts
John 유저가 사용할 Private Key 키 생성
openssl genrsa -out john.key 2048
Certificate Signing Request (CSR) 생성
{ touch $HOME/.rnd openssl req -new -key john.key -out john.csr \ -subj "/CN=john/O=development" }
Certificate 생성
sudo openssl x509 -req -in john.csr \ -CA /etc/kubernetes/pki/ca.crt \ -CAkey /etc/kubernetes/pki/ca.key \ -CAcreateserial \ -out john.crt -days 45
위에서 생성한 인증서 리뷰
openssl x509 -in john.crt -text -noout
~/.kube/config
에 명시된 인증서 리뷰grep client-cert $HOME/.kube/config |cut -d" " -f 6 \ | base64 -d | openssl x509 -text -noout -in -
위에서 생성한 인증서 검증
openssl verify -CAfile /etc/kubernetes/pki/ca.crt john.crt
~/.kube/config
에 명시된 인증서 검증grep client-cert $HOME/.kube/config |cut -d" " -f 6 | base64 -d \ | openssl verify -CAfile /etc/kubernetes/pki/ca.crt
현재 설정된 kubeconfig에 위에서 생성한 인증서 반영
kubectl config set-credentials john \ --client-certificate=/root/john.crt \ --client-key=/root/john.key
이전 실습에서 복사해놓은 kubeconfig 파일과 새로 업데이트된 kubeconfig 파일 비교
diff cluster-api-config .kube/config -y
Context 생성
kubectl config set-context john-dev \ --cluster=kubernetes \ --namespace=development \ --user=john
위에서 생성한 Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-dev get pods
생성된 Context 목록 확인
kubectl config get-contexts
이전 실습에서 복사해놓은 kubeconfig 파일과 새로 업데이트된 kubeconfig 파일 다시 비교
diff cluster-api-config .kube/config -y
Role 생성
cat <<EOF | kubectl create -f - kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: workload-full-access namespace: development rules: - apiGroups: ["", "extensions", "apps"] resources: ["deployments", "replicasets", "pods"] verbs: ["list", "get", "watch", "create", "update", "patch", "delete"] EOF
RoleBinding 생성
cat <<EOF | kubectl create -f - kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: workload-full-access-to-john namespace: development subjects: - kind: User name: john apiGroup: "" roleRef: kind: Role name: workload-full-access apiGroup: "" EOF
john-dev Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-dev get pods
john-dev Context를 이용해서 Context에 설정된 Namespace에 Deployment 생성
kubectl --context=john-dev \ create deployment nginx --image=nginx
john-dev Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-dev get pods
john-dev Context를 이용해서 Context에 설정된 Namespace에 Deployment 삭제
kubectl --context=john-dev delete deploy nginx
ClusterRole 생성
cat <<EOF | kubectl create -f - kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: workload-readonly-access rules: - apiGroups: ["", "extensions", "apps"] resources: ["deployments", "replicasets", "pods"] verbs: ["get", "list", "watch"] EOF
RoleBinding 생성
cat <<EOF | kubectl create -f - kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: workload-readonly-access-to-dev-group namespace: production subjects: - kind: Group name: development apiGroup: "" roleRef: kind: ClusterRole name: workload-readonly-access apiGroup: "" EOF
Context 생성
kubectl config set-context john-prod \ --cluster=kubernetes \ --namespace=production \ --user=john
john-prod Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-prod get pods
john-prod Context를 이용해서 Context에 설정된 kube-system Namespace에 있는 Pod 확인
kubectl --context=john-prod get pods -n kube-system
john-prod Context를 이용해서 Context에 설정된 Namespace에 Deployment 생성
kubectl --context=john-prod \ create deployment nginx --image=nginx
workload-readonly-access Role에 부여된 권한 확인
kubectl describe clusterrole workload-readonly-access
John 유저가 development 네임스페이스에서 할수 있는 Action 목록 확인
kubectl auth can-i --as john --list -n development
John 유저가 production 네임스페이스에서 할수 있는 Action 목록 확인
kubectl auth can-i --as john --list -n production
John 유저가 속한 그룹이 production 네임스페이스에서 할수 있는 Action 목록 확인
kubectl auth can-i --as john --as-group development --list -n production
John 유저가 production 네임스페이스에 Deployment를 생성할수 있는지 확인
kubectl auth can-i --as john --as-group development \ create deploy -n production
John 유저가 production 네임스페이스에 있는 Deployment 정보를 볼수있는지 확인
kubectl auth can-i --as john --as-group development \ get deploy -n production
리소스 삭제
kubectl delete ns development production
Last updated