개요
Kubeflow를 통해 ML Ops 생태계를 이해하고, 전 주기 파이프라인를 구성해본다.
목표
- 멀티 클러스터의 필요성을 이해한다.
- RBAC(Role-based access control)를 통해 클러스터 환경분리를 실습해본다.
여정
멀티 클러스터가 필요한 이유
현대 개발조직은 개발, 테스트, 프로덕션 등을 위해
환경 전반에 분산된 복수개의 클러스터를 보유하고 있다.
이러한 엔터프라이즈 환경에서는
테넌트(Tenant, 조직에 속한 개별 팀)들이 작업 부하를 공유한다.
때문에, 다른 테넌트(혹은 악의적인 테넌트)에 의해 단일 실패 지점이 생길 수 있게 된다.
따라서, 다중 테넌트 클러스터의 운영자는 각 테넌트를 격리하여
한 테넌트가 해킹을 당하거나 악의적인 행동을 할 때,
다른 테넌트와 클러스터가 입는 피해를 최소화해야 한다.
Kubernetes는 테넌트 간의 완벽한 보안 격리를 보장하지는 못하지만,
특정 사용 사례에서 충분한 보안성을 발휘하는 기능을 제공한다.
이외에도 멀티 클러스터 운영 시, 단일 테넌트 클러스터를 운영할 때보다 몇 가지 장점이 있다.
- 관리 오버헤드 감소
- 리소스 파편화 감소
- 신규 테넌트가 클러스터 생성을 기다릴 필요가 없음
클러스터 Config 커맨드 기초
config 파일을 구성하는 항목은 크게 3가지다.
- clusters → kubernetes로 구성되어 있는 클러스터 정보.
- users → cluster에 접근하기 위한 user 정보
- context → user, cluster, namespace 정보를 기준으로 클러스터 단위를 생성
# Config 파일 예시
kubectl config view --minify
---
apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
- cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: scratch
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
- context:
cluster: scratch
namespace: default
user: experimenter
name: exp-scratch
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
- name: experimenter
user:
password: some-password
username: exp
---
클러스터 Config 커맨드(시나리오 연습)
예제 시나리오
- 생성하고자 하는 클러스터 : 2개
- development : 접근 시 인증서 요구
- scratch : 실험공간이므로 자유롭게 사용
- 클러스터 별 사용자 : 2종류
- developer : 개인별 인증서 필요
- experimenter : 아이디 및 패스워드 필요
- 특이사항 : developer는 Frontend와 Backend 두 그룹으로 분리
- 최종 결과물은 클러스터 Config 알아보기 에 나와있는 코드와 동일하다.
# 클러스터 추가
kubectl config set-cluster ${옵션} [--kubeconfig=${적용할 Config 파일경로}]
# 예시
# 인증서를 요구하도록 설정
kubectl config set-cluster development \
--server=https://${해당 클러스터 마스터노드 IP} \
--certificate-authority=fake-ca-file
# 인증없이 사용가능하도록 설정
kubectl config set-cluster scratch \
--server=https://${해당 클러스터 마스터노드 IP} \
--insecure-skip-tls-verify
# 유저 추가
kubectl config set-credentials ${옵션} [--kubeconfig=${적용할 Config 파일경로}]
# 예시
# 인증서를 요구하도록 설정
kubectl config set-credentials developer \
--client-certificate=fake-cert-file \
--client-key=fake-key-seefile
# ID/PW를 요구하도록 설정
kubectl config set-credentials experimenter \
--username=exp \
--password=test
# 컨텍스트 추가
# 클러스터 + 네임스페이스 + 사용자 조합으로 생성
kubectl config set-context ${옵션} [--kubeconfig=${적용할 Config 파일경로}]
# 예시
kubectl config set-context dev-frontend \
--cluster=development \
--namespace=frontend \
--user=developer
kubectl config set-context dev-storage \
--cluster=development \
--namespace=backend \
--user=developer
kubectl config set-context exp-scratch \
--cluster=scratch \
--namespace=default \
--user=experimenter
Config 파일 병합/추출하기
# Config 파일 병합하기
# 클러스터 환경변수에 경로 추가
sudo vi /etc/bashrc
...
export KUBECONFIG=~/.kube/config:${config 파일 경로}
# 적용
exec $SHELL
# 환경변수 확인
env | grep KUBECONFIG
# 결과 확인
kubectl config get-contexts
kubectl config view # 병합된 결과 출력
# 한 파일로 합쳐서 추출하기
kubectl config view --merge --flatten > out.txt
# 특정 클러스터만 추출하기
kubectl config view --minify --flatten --context=cluster2 > cluster2.config
유저별 권한 설정하기(RBAC)
# 클러스터 내 계정생성 및 역할지정
vi clusterRoleBinding.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: watcher # 생성할 계정 이름
namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-clusterrole
rules: # 어떤 역할을 할 수 있는지 지정
- apiGroups: [""] # 사용할 api 목록 지정
resources: ["pods"] # Pod만 대상지정 가능
verbs: ["get", "list"] # 조회만 가능
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-clusterrolebinding
subjects:
- kind: ServiceAccount
name: watcher
namespace: default
apiGroup: ""
roleRef:
kind: ClusterRole
name: read-clusterrole
apiGroup: rbac.authorization.k8s.io
kubernetes 1.22버전까지는 Service Account 생성 시, Secret이 자동생성되었지만
이후버전은 kubectl create token 요청으로 생성할 것을 권장하고 있다.
# kubeconfig에 등록할 토큰 생성
kubectl create token ${생성한 Service Account 이름}
...토큰내용...
# Service Account를 Config에 등록
kubectl config set-credentials ${생성한 Service Account 이름} \
--token=${...토큰내용...} \
--kubeconfig=${적용할 Config 파일경로}
# Context는
kubectl config set-context ${사용할 Context 이름} \
--cluster=${대상 Cluster 이름} \
--user=${Service Account 이름} \
--kubeconfig=${적용할 Config 파일경로}
Clean Up
kubectl --kubeconfig=config-demo config unset users.<name>
kubectl --kubeconfig=config-demo config unset clusters.<name>
kubectl --kubeconfig=config-demo config unset contexts.<name>
마무리
참고자료
클러스터 멀티테넌시 | Google Kubernetes Engine(GKE) | Google Cloud
다중 클러스터 환경에서 context를 통한 접근 구성 방법 (sarc.io)
Kubernetes Context (Multi Cluster 접근관리) (tistory.com)
쿠버네티스 권한관리(Authorization) :: 아리수 (tistory.com)
개발 환경 구성: 561. kubectl 수행 시 다른 k8s 클러스터로 접속하는 방법 (sysnet.pe.kr)
'DevOps' 카테고리의 다른 글
IaC로 쿠버네티스 환경 구축하기 (Ansible + Kubespray) (0) | 2023.04.15 |
---|---|
Kubeflow 라이징 - BentoML로 Model Serving하기 (1) | 2023.04.01 |
Kubeflow 라이징 - Kiali로 Service Mesh 모니터링하기 (0) | 2023.03.10 |
Kubeflow 라이징 - Kubeflow 설치 및 대시보드 접속 (0) | 2023.03.04 |
Kubeflow 라이징 - GPU 워커노드 환경 구성 (0) | 2023.03.02 |