딸기말차
[MSA] 19. Namespace, ConfigMap, AWS CLI 본문

엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)
백엔드 개발 부트캠프
백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.
playdata.io
1. namespace
# k8s에서 제공하는 오브젝트 목록
kubectl api-resources

1. namespace ?
# 네임스페이스 목록 확인
kubectl get namespaces

namespace는 용도에 따라 컨테이너와 그에 관련된 리소스들을 구분지어 관리할 수 있는 일종의 논리적인 그룹으로,
k89s에서는 논리적으로 구분하기 위해 namespace라는 오브젝트를 제공한다.
즉, 네임스페이스는 pod, replicaSet, deployment, service등과 같은 쿠버네티스 리소스들이 묶여있는 하나의 가상공간 또는 그룹이다.
여러개의 네임스페이스를 사용하면 마치 하나의 클러스터에서 여러개의 가상 클러스터를 동시에 사용하는 것 처럼 만든다.
기본적으로 3개의 네임스페이스가 존재하며, 각 네임스페이스는 논리적인 리소스 공간 이기 때문에 각 namespace에는 pod, replicaSet, deployment, service와 같은 리소스가 따로 존재한다.
# service namespace 확인
kubectl get service -n kube-system

서비스 레플리카셋을 비롯한 여러 리소스들도 각 네임스페이스에 별도로 존재한다.
예를들어 kube-system 네임스페이스에는 쿠버네티스 의 파드, 서비스등을 이름으로 찾을 수 있도록 하는 DNS 서버의 서비스가 미리 생성되어있다.
2. namespace 생성, 적용
# yaml 파일을 이용해 namespace 생성
vim production-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: production

# 생성한 yaml 파일 적용
kubectl apply -f production-namespace.yaml
# namespace 확인
kubectl get ns (namespace의 약자)

# yaml 파일 추가 생성, 적용
vim hostname-deploy-svc-ns.yaml
# yaml 파일 적용
kubectl apply -f hostname-deploy-svc-ns.yaml
# namespace들 확인
kubectl get pods --all-namespaces

3. 적용한 namespace의 service 확인
# production namespace 확인
kubectl get pods -n production
# production namespace 상세정보 보기
kubectl get pods -n production -o wide
# production 이라는 서비스 접근, 확인
kubectl get service -n production

2. ConfigMap
컨테이너 안에 시스템 설정 옵션등을 설치하고 싶다면, yaml 파일에 환경 변수를 직접 적어 놓은 하드 코드방식을 사용할 수도 있다.
예를들어 deployment의 yaml파일 중 pod template에서 아래와 같은 방식으로 환경 변수를 직접 설정할 수도 있다.
환경변수를 파드 템플릿에 직접 명시하는 방식도 나쁘지는 않지만 상황에 따라서는 환경변수의 값만 다른 동일한 여러 yaml이 존재할 수 있다.
즉, 만약 운영환경과 개발환경에서 각각 deployment를 생성해야 한다면 환경 변수가 서로 다르게 설정 된 두가지 버전의 yaml 파일이 따로 존재해야 한다.
때문에 쿠버네티스는 yaml 파일과 설정값을 분리할 수있는 configMap과 secret이라는 오브젝트를 제공한다.
configMap에는 설정값을, secret에서는 노출되어서 안되는 비밀값을 설정한다.
1. Log, Container 관한 configMap 생성
# log에 관한 configMap 생성
kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG
# 컨테이너에 관한 configMap 생성
kubectl create configmap start-k8s --from-literal k8s=kubernetes --from-literal container=docker
# 생성한 configMap 확인
kubectl get configmap
# log-level-configmap의 상세정보 보기
kubectl describe configmap log-level-configmap


2. 전체 환경변수에 관한 configMap 설정
# all-env-from-configmap.yaml 생성
vim all-env-from-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: container-env-example
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
envFrom:
- configMapRef:
name: log-level-configmap
- configMapRef:
name: start-k8s
# pod 실행, 환경설정 적용
kubectl exec container-env-example env

3. 특정 환경변수에 관한 configMap 설정
# selective-env-from-configmap.yaml 생성
vim selective-env-from-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: container-selective-env-example
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
env:
- name: ENV_KEYNAME_1 # (1.1) 컨테이너에 새롭게 등록될 환경 변수 이름
valueFrom:
configMapKeyRef:
name: log-level-configmap
key: LOG_LEVEL
- name: ENV_KEYNAME_2 # (1.2) 컨테이너에 새롭게 등록될 환경 변수 이름
valueFrom:
configMapKeyRef:
name: start-k8s # (2) 참조할 컨피그맵의 이름
key: k8s # (3) 가져올 데이터 값의 키
# 최종 결과 -> ENV_KEYNAME_2=$(k8s 키에 해당하는 값)
# ENV_KEYNAME_2=kubernetes
# 생성한 yaml 파일 적용
kubectl apply -f selective-env-from-configmap.yaml
# pod 실행, 적용 된 설정 값 확인
k exec container-selective-env-example env | grep ENV

4. volume mount에 관한 configMap 설정
# volume-mount-configmap.yaml 생성
vim volume-mount-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-pod
spec:
containers:
- name: my-container
image: busybox
args: [ "tail", "-f", "/dev/null" ]
volumeMounts:
- name: configmap-volume # volumes에서 정의한 컨피그맵 볼륨 이름
mountPath: /etc/config # 컨피그맵의 데이터가 위치할 경로
volumes:
- name: configmap-volume # 컨피그맵 볼륨 이름
configMap:
name: start-k8s
volume 내부의 start-k8s를 /etc/config으로 담는 설정이다.
# 생성한 yaml 파일 적용
kubectl apply -f volume-mount-configmap.yaml
# etc 하위의 configMap 실행
k exec configmap-volume-pod ls /etc/config
3. Secret
secret은 ssh 키, 비밀번호 등 외부 유출에 민감한 정보를 저장하기 위한 오브젝트로, namespace에 종속적이다.
# secret 기능을 통해 my-password 생성
kubectl create secret generic my-password --from-literal password=1q2w3e4r
# mypassword, yourpassword라는 문자열로 pw1, pw2 파일 생성
echo mypassword > pw1 && echo yourpassword > pw2
# secret 기능을 통해 our-password 생성
kubectl create secret generic our-password --from-file pw1 --from-file pw2
# 생성한 password 확인
kubectl get secret
# password의 내용 확인
k get secret my-password -o yaml

# 암호화 된 password를 base64를 사용해 확인
echo MXEydzNlNHI= | base64 -d

4. AWS CLI 설치
CLI는 Command Line Interface로, AWS를 커맨드 라인에서 제어하기 위한 프로그램이다.
# zip 파일 다운로드
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# unzip 설치
sudo apt install unzip
# 다운받은 zip 파일 압축 해제
unzip awscliv2.zip
# aws 내 install 실행파일 실행
sudo ./aws/install

# 설치 된 aws version 확인
aws --version
# 설치 된 폴더 확인
which aws
which java
which wget
# 관련 된 모든 경로 검색
whichis wget

5. CLI를 통해 Private Repository 에 image push
1. 사용자에게 권한 부여
# iam -> 권한부여
AmazonEC2ContainerRegistryFullAccess

2. AWS 홈페이지 내에서 private Repository 생성
# Amazon Elastic Container Registry 생성 및 연결
Elastic Container Registry

# aws configure 정보 등록
aws configure
1. [엑세스 키]
2. [private 엑세스 키]
# Private Repository 접속
aws ecr get-login-password --region ap-northeast-2 |
docker login --username AWS --password-stdin 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com

3. 접속한 repository에 image push
# 기존 이미지를 활용해 새로운 태그의 이미지 생성
docker tag ostock/licensing-service:0.0.3-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/amigo
# private repository에 생성한 image push
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/amigo

4. CLI에서 repository 생성, image를 버전별로 push
# CLI 환경에서 repository 생성
aws ecr create-repository \
--repository-name ubuntu \
--image-scanning-configuration scanOnPush=true \
--region ap-northeast-2
# push 할 image 생성
docker tag ubuntu:14.04 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:14.04
# 생성한 repository에 image push
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:14.04
# push 할 다른 버전의 image 생성
docker tag ubuntu:18.04 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:18.04
# 생성한 repository에 image push
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/ubuntu:18.04

6. 기존 서비스를 AWS Repository에 push
# eurekaserver, gatewayserver, configserver, kbo-service push
docker tag ostock/eurekaserver:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/eureka-server:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/eureka-server:0.0.1-SNAPSHOT
docker tag ostock/kbo-service:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/kbo-service:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/kbo-service:0.0.1-SNAPSHOT
docker tag ostock/gatewayserver:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/gateway-server:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/gateway-server:0.0.1-SNAPSHOT
docker tag ostock/configserver:0.0.1-SNAPSHOT 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/config-server:0.0.1-SNAPSHOT
docker push 706312728855.dkr.ecr.ap-northeast-2.amazonaws.com/config-server:0.0.1-SNAPSHOT

7. 66일차 후기
쿠버네티스는 용도에 따라 컨테이너를 구별하기 위해 namespace를 사용한다. 즉, 실행을 위해 필요한 것들을 모아 하나로 그룹화하여 이름을 붙이는 작업을 의미한다.
이렇게 생성한 컨테이너 내부에 특정 설정을 적용하고 싶다면, yaml 파일에 직접 환경설정 정보를 하드코딩하여 적용할 수 있다.
이를 configMap이라 하고, 이를 활용해 로깅레벨 / 볼륨 마운트 등을 설정해 사용할 수 있게 된다.
AWS는 반드시 사이트에 접속하지 않더라도 커맨드 환경에서 AWS를 활용할 수 있게 해주는 CLI를 제공한다.
또한 DockerHub와 같은 Repository 기능도 존재하는데, 이를 활용해 내가 생성한 이미지를 도커 허브가 아니라 AWS 내부에 있는 Repository에 올려, EKS (Elastic Kubernates Service) 를 통해 활용할 수도 있다.
'Bootcamp > MSA' 카테고리의 다른 글
| [MSA] 21. Keycloak (0) | 2023.11.07 |
|---|---|
| [MSA] 20. Custom System 구축, Kafka (0) | 2023.11.06 |
| [MSA] 18. Ingress, PV / PVC (0) | 2023.11.02 |
| [MSA] 17. Jenkins 설치 (0) | 2023.11.01 |
| [MSA] 16. Api Gateway 내 MicroService 등록 (0) | 2023.10.31 |