개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - Accounts

nineDeveloper 2021. 1. 20.
728x90

Accounts


어카운츠에는 두 가지의 타입이 존재

  • 사용자를 위한 user
  • 애플리케이션(포드 외)를 위한 service account


Static Token File

  • Apiserver 서비스를 실행할 때 --token-auth-file=SOMEFILE.csv 전달 (kube-apiserver 수정 필요)

  • API 서버를 다시 시작해야 적용됨

  • 토큰, 사용자 이름, 사용자 uid, 선택적으로 그룹 이름 다음에 최소 3 열의 csv 파일

    password1,user1,uid001,"group1"
    password2,user2,uid002
    password3,user3,uid003
    password3,user4,uid004

Static Token File 을 적용했을 때 사용 방법

  • HTTP 요청을 진행할 때 다음과 같은 내용을 헤더에 포함해야함
  • Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269
$ TOKEN=password1
$ APISERVER=https://127.0.0.1:6443
$ curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
  • Kubectl에 등록하고 사용하는 방법
$ kubectl config set-credentials user1 --token=password1
$ kubectl config set-context user1-context --cluster=kubernetes --namespace=frontend --user=user1
$ kubectl get pod --user user1

서비스 어카운트 만들기

  • 포드에 별도의 설정을 주지 않으면 기본적은 service account가 생성

    $ kubectl get sa default -o yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      creationTimestamp: "2019-07-06T06:12:26Z"
      name: default
      namespace: default
      resourceVersion: "279"
      selfLink: /api/v1/namespaces/default/serviceaccounts/default
      uid: 06b46c38-9fb5-11e9-a520-42010a920176
    secrets:
    - name: default-token-ppzqk
  • 명령어를 사용하여 serviceaccount sa1를 생성

    • Kubectl create serviceaccount sa1
  • Pod 에 spec.serviceAccount: service-account-name과 같은 형식으로 지정


연습문제

  • http-go라는 이름을 가진 ServiceAccount를 생성하고 http-go 포드를 생성해 http-go 서비스 어카운트를 사용하도록 설정하라

  • 다음 csv 파일을 생성하고 apiserver에 토큰을 등록하여 재시작하자

    password1,user1,uid001,"group1"
    password2,user2,uid002
    password3,user3,uid003
    password3,user4,uid004
    • 마스터 노드에 문제가 발생하는가? 어떤 서비스가 문제가 발생하는가?
    • 문제가 발생하는 서비스의 컨테이너를 확인하기 위해 docker logs를 사용하고 그 해결 방법을 찾으라
    • 정상적으로 서비스가 시작됐다면 kubectl에 유저정보를 등록하고 등록한 유저 권한으로 kubectl get pod 요청을 수행하라
      • 반드시 Fobidden이라는 결과가 나와야 함 (유저는 있으되 권한은 없다)

풀이

somefile.csv 파일 생성

$ vi somefile.csv

/etc/kubernetes/manifests/kube-apiserver.yamltoken-auth-file 옵션 추가

$ sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    ...
    - --authorization-mode=Node,RBAC
    - --token-auth-file=/home/server1/somefile.csv # somefile.csv 경로 추가
    ...

docker 명령으로 확인해보면 kube-apiserver 가 정상적으로 구동되지 않고 있음

$ docker ps -a | grep kube-apiserver
7e3c7afb096b   75c7f7112080           "kube-apiserver --ad…"   9 seconds ago    Exited (1) 7 seconds ago                k8s_kube-apiserver_kube-apiserver-master_kube-system_cd6a4c3fdf1ad1a357eaffa42b1feac3_2

$ docker logs 7e3c7afb096b
Flag --insecure-port has been deprecated, This flag has no effect now and will be removed in v1.24.
I0120 04:23:14.226988       1 server.go:632] external host was not specified, using 10.0.2.15
I0120 04:23:14.227593       1 server.go:182] Version: v1.20.1
Error: open /home/server1/somefile.csv: no such file or directory

hostPath 경로가 /etc/kubernetes/pki 경로이기 때문에
신규로 만들기보다는 해당 경로를 이용하도록 수정

spec:
  containers:
  - command:
    ...
    - --authorization-mode=Node,RBAC
    - --token-auth-file=/etc/kubernetes/pki/somefile.csv # somefile.csv 경로 수정
    ...

somefile.csv 파일을 /etc/kubernetes/pki 경로로 이동

$ sudo mv somefile.csv /etc/kubernetes/pki

docker 명령으로 컨테이너가 잘 구동됐는지 확인

$ docker ps -a | grep kube-apiserver
97e7b9820c97   75c7f7112080           "kube-apiserver --ad…"   18 minutes ago   Up 18 minutes                           k8s_kube-apiserver_kube-apiserver-master_kube-system_55ba4a5d69f9689f0e08e66172e7f2fc_4

kubectl get pod 명령이 잘 수행되는 것을 확인
정의한 ID 와 PASSWORD 가 잘 등록이 된 것으로 기대할 수 있음

$ kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
http-go-568f649bb-crtcr   1/1     Running   1          19h

user1 ID 와 password 를 등록 아직 로그인한 상태는 아님

$ kubectl config set-credentials user1 --token=password1
User "user1" set.

kubernetes 클러스터에 로그인하기 위해서는 위에 등록한 정보를 이용하겠다고 user1-context 에 등록

$ kubectl config set-context user1-context --cluster=kubernetes --namespace=frontend --user=user1
Context "user1-context" created.

user1-context 사용할 수 있도록 처리

$ kubectl config use-context user1-context
Switched to context "user1-context".

아래와 같이 Forbidden 에러 메세지가 출력된다면 잘 적용된 것

$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "user1" cannot list resource "pods" in API group "" in the namespace "frontend"

아래와 같이 에러 메세지가 출력됐다면 로그인 조차 되지 않은 것이므로 잘못 적용된 것

$ kubectl get pod
error: You must be logged in to the server (Unauthorized)

아래 명령으로 admin 계정인 kubernetes-admin@kubernetes 를 사용하도록 다시 변경처리

$ kubectl config use-context kubernetes-admin@kubernetes
728x90

댓글

💲 추천 글