0부터 시작하는 Kubernetes 공부 - Role 부여하기 & Kubernetes API Server 접속

Jaehong Lee·2022년 9월 8일
2
post-thumbnail
post-custom-banner

1. Service Account 에 Role 부여하기

현재 user1 은 아무런 role 이 없는 상태이다

  • default = kubernetes-admin ( 전체 관리 가능 )
  • user1 = 매핑된 권한 ( role ) 없음
  • 현재 role 은 없지만, Clusterrole 은 있다

Role 배포 - get, list, watch

  • api 버전을 확인하자
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: user1role
rules: 
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get", "list"]
  • rules 에는 사용할 수 있는 api 그룹, 리소스, 명령을 작성한다

    api 그룹은 apiversion 에서 / 를 기준으로 구분한다

    • 만약, v1 만 써있다면 그룹이 "" 이고, 이를 core group 이라고 한다
    • apps/v1 은 그룹이 apps 이다
  • 만약, Service 에 대하여 명령을 실행할 계획이고, 리스트만 확인하고 싶다면

    그룹 -> ""
    리소스 -> service
    verb(s) -> list

get & list & watch

  • 서비스 전체를 확인할 때에는 kubectl get svc 로 확인하였다. 이는 list 이다. 옵션을 사용하여 Pod 가 아닌 특정 Pod 의 정보를 확인하고 싶다면 뒤에 특정 Pod 의 이름을 지정한다. 이는 get 이다

    • list 는 전체를 확인한다. 큰 범위. list 만 부여해도 get 이 가능하다
    • get 은 특정 무언가를 확인한다. 작은 범위. 허나, get 을 사용하고 싶다면, 전체 리스트를 확인 가능 해야 한다. 따라서, get 을 사용하면 앞에 list 를 포함해야 실행된다. 따라서 get 과 list 를 함께 표기해야 한다
  • watch 는 상태 정보를 확인 가능하다

  • Role 이 생성되었다

Role Binding - SA & Role 연결

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: user1-rolebinding
subjects: # sa 정의
- kind: ServiceAccount
  name: user1
  namespace: default
roleRef: # role 정의
  kind: Role
  name: user1role
  apiGroup: rbac.authorization.k8s.io
  • 위와 같이 연결할 SA 와 Role 을 정의해준다

권한 확인

root@manager:~/k8slab/0908# k get svc --as system:serviceaccount:default:user1
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   27h
root@manager:~/k8slab/0908# k get pod --as system:serviceaccount:default:user1
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:user1" cannot list resource "pods" in API group "" in the namespace "default"
  • Service 에 대한 list 권한을 주었기에 확인이 가능하다. 허나, Pod 에 대해서는 권한을 부여하지 않았으므로, 확인이 불가능 하다

2. Deployment Get 권한 부여

user1 이 Deployment 에 대해 Get 이 가능하게 해보자

Q.(객관식) 다음중 정상동작하는 것은? ( 1 )

  1. kubectl get deployment --as list-only [list 만 추가]
  2. kubectl get deployment --as get-only [get 만 추가]
  3. kubectl get deployment --as watch-only [watch 만 추가]

Role 배포

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: 
  namespace: default 
  name: user2role 
rules: 
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list"]
  • deployments 의 api 그룹은 apps 이다. get 을 위해서는 list 도 필요하다

RoleBinding 배포

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: 
  namespace: default
  name: user1-rolebinding2
subjects: 
- kind: ServiceAccount 
  name: user1 
  namespace: default 
roleRef: 
  kind: Role 
  name: user2role 
  apiGroup: rbac.authorization.k8s.io

확인하기

  • 권한이 부여되었다!

3. Kubernetes API Server 접속 without Token

Kubernetes API Server 확인 및 접속

root@manager:~/k8slab/0908# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@manager:~/k8slab/0908# cat ~/.kube/config 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: [ 공개 키 ]
    server: https://211.183.3.100:6443
  name: kubernetes
contexts:
- 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: [ 공개 키 ]
    client-key-data: [ 개인 키 ]
  • config 파일을 살펴보자. 클라이언트 공개 키 / 개인 키, cluster 공개 키 / Kubernetes API Server 주소를 확인할 수 있다
  • Token 이 없기에 계정 정보가 없어서 Data 를 확인할 수 없다

인증서 없이 접근하기 - k 옵션

  • 위와 같이 https 로 Kubernetes API Server 에 접근하면 인증서가 필요하다고 나온다
  • curl 이용시 뒤에 k 옵션을 붙이면 공인인증서 여부를 확인하지 않는다. 따라서 공인인증서 없이 접속이 된다. 허나, token 정보가 포함되지 않은 상태에서 api 로 접속했으므로 결과 내용을 볼 수 없다. SA 가 누구인가를 알 수 없기 때문이다

4. Kubernetes API Server 접속 with Token

Token 변수에 저장

  • user1 의 Secret 이름을 전역 변수에 저장하자
  • -o jsonpath 를 통해 출력 형태를 json 타입으로 출력하고, token 만 json 형태로 출력하게 하였다. 이때 base64 -d 를 통해 디코딩을 하여 원래 Data 를 출력했다. 우리는 이 디코딩 된 값이 필요하다
export DTKN=$(kubectl get secret $SECNAME -o jsonpath='{.data.token}' | base64 -d)
  • 이 결과를 전역 변수에 담자

Token 을 통해 접속하기 및 확인

K8S 에서 명령어 방식으로 Kubectl 을 통해 명령을 내리면, 이는 API 로 Api Server 에 전달된다. 이를 Api 방식으로 명령을 내려 바로 Api Server 에 전달할 수도 있다. 허나, 오늘은 Kubernetes API Server 에 접속해서 Data 확인만 해보겠다

아직 https 에 대한 인증서가 없으므로 -k 를 통해 접속이 가능하게 한다. Token 은 계정에 대한 인증 정보를 가지고 있으므로 Kubernetes API Server 에 접속하여 Data 를 확인할 수 있다

root@manager:~/k8slab/0908# curl https://211.183.3.100:6443/apis --header "Authorization: Bearer $DTKN" -k
{
  "kind": "APIGroupList",
  "apiVersion": "v1",
  "groups": [
    {
      "name": "apiregistration.k8s.io",
      "versions": [
        {
          "groupVersion": "apiregistration.k8s.io/v1",
          "version": "v1"
        },
        {
          "groupVersion": "apiregistration.k8s.io/v1beta1",
          "version": "v1beta1"
        }
      ],
      "preferredVersion": {
        "groupVersion": "apiregistration.k8s.io/v1",
        "version": "v1"
      }
    },
  • 위와 같이 header 에 Token 을 넣어주자. Token 타입은 Bearer 이다
    • Token 을 넣어 접속하면, 계정 정보와 함께 접속하므로 Kubernetes API Server 접속하여 Data 를 확인할 수 있다

우리는 user1 에 대해 Deployment 와 Service 에 대해 get, list 를 허용한 role 을 주었다. 이 정보는 Token 에 담겨있으므로 user1 Token 으로 Cluster Api Server 에 접속하여 Data 를 확인할 수 있다

curl https://211.183.3.100:6443/api/v1/namespaces/default/services --header "Authorization: Bearer $DTKN" -k
  • 현재 배포된 services 에 대한 Data 를 확인하자. 이는 그룹명/버전/namespaces/namespace 명/services 순으로 현재 default namespace 에 속한 Service 정보를 출력해준다
curl https://localhost:6443/apis/apps/v1/namespaces/default/deployments -k --header "Authorization: Bearer $DTKN"
  • 현재 default namespace 에 배포된 Deployment 에 대한 정보를 확인하자
 curl https://211.183.3.100:6443/api/v1/namespaces/default/services/kubernetes --header "Authorization: BBearer $DTKN" -k
  • services 의 kubernetes 서비스에 대한 Data 를 확인하자

    • 이거에 대한 Data 이다
profile
멋진 엔지니어가 될 때까지
post-custom-banner

0개의 댓글