Run The Bridge
k8s 3일차 본문
0. 네임스페이스(Namespace) : 리소스를 논리적으로 구분하는 장벽
Master가 동작중에 멈추면 안되기 때문에 k8s에서는 3대로 동작한다.(k8s에는 이중화 개념이 없다)
Master를 다중화하기 위해 k8s를 다중화한다.
worker node의 권장 수 = 1000개가 넘는다.
- 용도에 따라 컨테이너와 관련된 리소스들을 구분 지어 관리할 수 있는 논리적인 오브젝트
- 네임스페이스가 다르면 포드, 레플리카셋, 서비스 등의 오브젝트 이름이 같아도 된다
- 모니터링, 개발, 테스트, 운영, 여러 조직이 하나의 클러스터를 나누어 사용할 경우에 구분 등
default 네임스페이스
- 네임스페이스를 명시하지 않으면 기본적으로 사용되는 네임스페이스
kube-system 네임스페이스
- 쿠버네티스 클러스터 구성에 필수적인 컴포넌트와 설정값이 존재
리눅스 자체의 네임스페이스와는 의미가 다르므로 헷갈리지 말아야한다.
kubectl get pod -n kube-system # -n 옵션으로 namespace 정의가능
kubectl get namespaces # namespace 확인
namespace 생성하기
kubectl create namespace production # 운영용
kubectl create namespace developer # 개발용
내가 지정한 namespace에 deployment를 생성해보자
# vi hostname-deploy-svc-ns.yaml, yaml 과 service가 '---'으로 하나로 선언했다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-deployment-ns
namespace: production
spec:
replicas: 1
selector:
matchLabels:
app: webserver
template:
metadata:
name: my-webserver
labels:
app: webserver
spec:
containers:
- name: my-webserver
image: alicek106/rr-test:echo-hostname
ports:
- containerPort: 80
--- # 구분자
apiVersion: v1
kind: Service
metadata:
name: hostname-svc-clusterip-ns
namespace: production
spec:
ports:
- name: web-port
port: 8080
targetPort: 80
selector:
app: webserver
type: ClusterIP
실행시켜준다.
kubectl delete -f mysql-pod-service.yaml
호출하기 위해선 namespace를 명시해줘야 한다.
kgp -n production # namespace를 가지는 pod 확인
kgs -n production # namespace를 가지는 service 확인
만약 -A 명령으로 너무 많이 출력되었을 때 해결법
kgs -A | grep production # grep 명령으로 namespace를 명시해준다.
서비스의 DNS 이름에 대한 FQDN(Fully Qualified Domain Name)은 일반적으로 다음과 같은 형식
<서비스 이름>.<네임스페이스 이름>.svc.cluster.local
kubectl run -i --tty --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash # namespace는 default로 기본 namespace가 잡혀있다
kubectl run -i --tty --rm debug --image=alicek106/ubuntu:curl --restart=Never -n production -- bash # namespace를 production으로 재정의
namespace 삭제
- namespace에 종속된 모든 object가 함께 삭제된다.
kubectl get all -n production # namespace 모든 검색
kubectl delete ns production # production이 namespace이다.
namespace에 종속된 object 확인
kubectl api-resources --namespaced=true
namespace에 종속되지 않은 object 확인
kubectl api-resources --namespaced=false
1. Configmap 사용하기
- 도커 스웜 모드의 config, secret와 유사
- deployment YAML 파일을 수정하지 않고 application 설정값을 별도로 분리해 관리할 수 있다.
(실습)
kubectl create configmap log-level-configmap --from-literal LOG_LEVEL=DEBUG
kubectl create configmap start-k8s --from-literal k8s=kubernetes --from-literal container=docker
kubectl get configmap || k get cm
k get cm log-level-configmap -o yaml # configmap을 yaml형태로 정보 보는법
컨피그맵의 값을 컨테이너의 환경 변수로 사용
- envFrom: 컨피그맵에 존재하는 모든 키-값 쌍을 가져온다
- valueFrom: 컨피그맵에 존재하는 키-값 쌍 중에서 원하는 데이터만 가져온다
컨피그맵의 값을 포드 내부의 파일로 마운트해 사용
(실습) envFrom
# vi all-env-from-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: container-env-example
spec:
containers:
- name: my-container
image: busybox # 명령어들을 하나로 모아둔 box
args: ['tail', '-f', '/dev/null'] # command를 대신한다.
envFrom:
- configMapRef:
name: log-level-configmap # 키-값 쌍이 1개가 존재하는 configmap
- configMapRef:
name: start-k8s # 키-값 쌍이 2개가 존재하는 configmap
kubectl apply -f all-env-from-configmap.yaml
k exec container-env-example -- printenv
(실습) valueFrom
# vi selective-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']
env:
- name: ENV_KEYNAME_1
valueFrom:
configMapKeyRef:
name: log-level-configmap
key: LOG_LEVEL
- name: ENV_KEYNAME_2
valueFrom:
configMapKeyRef:
name: start-k82
key: k8s
envFrom:
- configMapRef:
name: log-level-configmap
- configMapRef:
name: start-k8s
k apply -f selective-env-from-configmap.yaml
# container-selective-env-example은 위에 정의된 metadata 아래의 name을 적어주어야 한다.
kubectl exec container-env-example -- env | grep ENV
키 값이 바뀐것을 볼 수 있다.
컨피그맵의 내용을 파일로 포드 내부에 마운트하기(Projection 투사)
- 컨피그맵의 키-값 쌍의 모든 값을 컨테이너 내부에 '파일'-파일내용'으로 생성
- 컨피그맵의 키-값 쌍의 일부 값을 컨테이너 내부에 '파일'-파일내용'으로 생성
컨피그맵의 키-값 쌍의 모든 값을 컨테이너 내부에 '파일'-파일내용'으로 생성
# vi 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 # 같은 yaml 안에서 정의한 volume에 있는 내용을 갖다쓴다.
mountPath: /etc/config
volumes:
- name: configmap-volume # configmap volume 이름
configMap:
name: start-k8s # key-value 쌍을 가져올 configmap 이름
kubectl apply -f volume-mount-configmap.yaml # 실행
kubectl exec -it configmap-volume-pod -- sh # 접속
컨피그맵의 키-값 쌍의 일부를 컨테이너 내부에 '파일'-파일내용'으로 생성
# vi selective-volume-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
mountPath: /etc/config
volumes:
- name: configmap-volume
configMap:
name: start-k8s
items:
- key: k8s
path: k8s_fullname
kubectl apply -f selective-volume-configmap.yaml # 실행
(실습)파일로부터 컨피그맵 생성하기 - index.html, nginx.conf
echo Hello, world! >> index.html
kubectl create configmap index-file --from-file index.html
kubectl describe cm index-file
cp /root/practice/start-docker-kubernetes/chapter2/nginx/nginx.conf .
kubectl create configmap nginx-file --from-file nginx.conf
kubectl describe cm nginx-file
(실습)파일로부터 configmap 생성하기 2 - 여러 환경 변수가 정의된 파일을 한 번에 전달(안했음)
cp /root/practice/start-docker-kubernetes/chapter7/multiple-keyvalue.env .
kubectl create configmap from-envfile --from-env-file multiple-keyvalue.env
kubectl describe cm from-envfile
(실습)YAML 파일로 configmap 정의하기
kubectl create cm nginx-conf --from-file nginx.conf --dry-run=client -o yaml > nginx.conf.yaml # --dry-run는 실제로 실행하지않고, 실행하는 것 처럼 보인다.
nginx.conf.yaml 파일을 수정 후
kubectl apply -f nginx-conf.yaml # 실행시켜준다.
Configmap 삭제방법
kubectl delete configmaps [이름]
2. Secret
kubectl create secret generic my-password --from-literal password=password # secret 생성하기
kubectl get secret # 확인
echo cGFzc3dvcmQ= | base64 -d # 다음 명령을 통해 decording 가능하다.....
command line 이외에 다른 방법으로 생성해보자.
echo mypassword > pw1 && echo yourpassword > pw2
k create secret generic our-password --from-file pw1 --from-file pw2 # secret 생성
이제 Pod를 올려서 확인해본다.
# vi env-from-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-example
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
envFrom:
- secretRef:
name: my-password
k apply -f env-from-secret.yaml # 실행
kubectl exec secret-env-example -- env # metadata에 정의한 이름으로 env를 가져올 수 있다.
이번엔 our-password를 가져와본다.
# vi selective-env-from-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: selective-env-from-secret
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
env:
- name: YOUR_PASSWORD
valueFrom:
secretKeyRef:
name: our-password
key: pw2
(실습) Secret 사용하기
# vi volume-mount-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-mount-secret.yaml
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
volumes:
- name: secret-volume
secret:
secretName: our-password
value를 선택해서 가져오기
# vi selective-mount-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: selective-mount-secret.yaml
spec:
containers:
- name: my-container
image: busybox
args: ['tail', '-f', '/dev/null']
volumeMounts:
- name: secret-volume
mountPath: /etc/config
volumes:
- name: secret-volume
secret:
secretName: our-password
items:
- key: pw1
path: password1
이미지 레지스트리 접근을 위한 docker-registry 타입으로 시크릿 사용하기
- 도커 허브에 공개되어 있는 이미지라면 별도의 레지스트리 인증은 필요 없다
- 하지만 사설 레지스트리나 구글, AWS 등의 퍼블릭 클라우드의 레지스트리를 사용한다면 로그인과 같은 인증 절차가 필요
- 생성한 시크릿은 디플로이먼트 또는 포드 등에서 이미지를 받아올 때 사용(imagePullSecrets 설정)
인증서
- TLS 키를 저장할 수 있는 TLS 타입의 시크릿 사용하기
- 파드 내부의 애플리케이션이 TLS인증서를 사용할 때 사용
- 애플리케이션에서 사용하는 인증서는 일반적으로 외부에서 제공되는 경우가 많다
- 예를 들어, 한국전자인증, 한국인터넷진흥원 등에서 받은 인증서를 쿠버네티스에 시크릿으로 저장한 뒤 필요한 애플리케이션에서 사용할 수 있게 한다
'Cloud > k8s' 카테고리의 다른 글
k8s 4일차 (0) | 2021.08.11 |
---|---|
wordpess-mysql 환경변수를 configmap으로 올리기, nginx 관련 실습 (0) | 2021.08.10 |
mysql, wordpress, tomcat, python/flask를 pod, replicaset, deployment로 올리고 서비스 생성하기 (0) | 2021.08.10 |
k8s 2일차 (0) | 2021.08.06 |
k8s 1일차 (0) | 2021.08.05 |