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-contextsJohn 유저가 사용할 Private Key 키 생성
openssl genrsa -out john.key 2048Certificate 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 -yContext 생성
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 -yRole 생성
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"] EOFRoleBinding 생성
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: "" EOFjohn-dev Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-dev get podsjohn-dev Context를 이용해서 Context에 설정된 Namespace에 Deployment 생성
kubectl --context=john-dev \ create deployment nginx --image=nginxjohn-dev Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-dev get podsjohn-dev Context를 이용해서 Context에 설정된 Namespace에 Deployment 삭제
kubectl --context=john-dev delete deploy nginxClusterRole 생성
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"] EOFRoleBinding 생성
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: "" EOFContext 생성
kubectl config set-context john-prod \ --cluster=kubernetes \ --namespace=production \ --user=johnjohn-prod Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인
kubectl --context=john-prod get podsjohn-prod Context를 이용해서 Context에 설정된 kube-system Namespace에 있는 Pod 확인
kubectl --context=john-prod get pods -n kube-systemjohn-prod Context를 이용해서 Context에 설정된 Namespace에 Deployment 생성
kubectl --context=john-prod \ create deployment nginx --image=nginxworkload-readonly-access Role에 부여된 권한 확인
kubectl describe clusterrole workload-readonly-accessJohn 유저가 development 네임스페이스에서 할수 있는 Action 목록 확인
kubectl auth can-i --as john --list -n developmentJohn 유저가 production 네임스페이스에서 할수 있는 Action 목록 확인
kubectl auth can-i --as john --list -n productionJohn 유저가 속한 그룹이 production 네임스페이스에서 할수 있는 Action 목록 확인
kubectl auth can-i --as john --as-group development --list -n productionJohn 유저가 production 네임스페이스에 Deployment를 생성할수 있는지 확인
kubectl auth can-i --as john --as-group development \ create deploy -n productionJohn 유저가 production 네임스페이스에 있는 Deployment 정보를 볼수있는지 확인
kubectl auth can-i --as john --as-group development \ get deploy -n production리소스 삭제
kubectl delete ns development production
Last updated