728x90
반응형
2023/10/13
Kubenetes
1. 초기화
- minikube
- 서비스 중지 : minikube stop
- 인스턴스 삭제 : minikube delete
- 프로필 삭제 : minikube delete --all
- 서비스 다시 시작 : minikube start
- Docker Desktop의 쿠버네티스
- 쿠버네티스 설정 메뉴에서 reset kubenets cluster를 클릭
2. Daemon Set
2.1) 개요
- 모든 노드에 파드를 생성하고자 할 때 사용
- Replica Set 은 특정 개수의 파드를 생성할 때 사용하고 Daemon Set은 모든 노드에 생성
- 모니터링 용도로 주로 사용 - 로깅하는 프로그램을 사용할 때 활용
- 클라우드 환경에서 모니터링 용도로 가장 많이 사용되는 애플리케이션은 프로메테우스 입니다.
- 시각화는 그라파나를 이용하는 경우가 많은데, 다른 시각화 도구를 사용해도 가능
2.1) 실습
- Daemon Set을 생성하기 위한 매니페스트 파일을 생성 - daemonsets.yaml 파일
apiVersion: apps/v1
kind: DaemonSet #배포할 오브젝트 종류 설정
#메타 데이터 설정 - 기본이 되는 옵션
metadata:
name: prometheus-daemonset #디플로이먼트 이름
spec:
selector:
matchLabels:
tier: monitoring #모니터링 용도로 사용할 것이라고 알려주기 위해서 레이블 생성
name: prometheus-monitor
#실제 파드를 만들 정보
template:
metadata:
labels:
tier: monitoring #모니터링 용도로 사용할 것이라고 알려주기 위해서 레이블 생성
name: prometheus-monitor
#컨테이너 정보를 설정
spec:
containers:
- name: prometheus
image: prom.node-exporter
ports:
- containerPort: 80
- 파드 생성 : kubectl apply -f daemonsets.yaml
- 파드 확인 : kubectl get pods
- 자세히 보기 : kubectl describe 오브젝트 종류/디플로이먼트 이름
- kubectl describe daemonset/prometheous-daemonset
- 삭제
- 이 경우는 데몬 셋을 이용해서 파드를 생성
- 데몬셋을 삭제하면 파드가 자동으로 삭제 됩니다.
- kubectl delete -f daemonsets.yaml
3. cron job
3.1) 쿠버네티스 작업의 종류
- Run-to-Completion : 컨테이너에 동작을 명시해서 수행하는 작업
- CronJob : 일정한 주기를 가지고 작업을 수행
- Action: 특정한 작업이 수행되었을 때 동작 - 트리거가 특정한 작업임.
- Cron: 주기를 가지고 동작 - 트리거가 주기(기간)임
3.2) Cron Job
- 일정한 주기를 가지는 데이터 수집, 애플리케이션 수행, 데이터 백업 등
3.3) CronJob을 만들 때 spec에 schedule을 설정
- schedule: 분(0-59) 시(0-23) 일(0-31) 월(1-12) 요일(0-6) #요일은 0이 일요일
- 분 단위 생성 : */1(1분 단위)
- 배열은 ,로 구분해서 설정
3.4) 작업 설정
- command 를 이용해서 설정
3.5) kind는 CronJob
3.6) 크론잡을 만들면 하나의 파드가 생성되고 작업을 하고 완료되는 것을 반복합니다.
3.7) 실습
- 크론잡 생성을 위한 매니페스트 파일을 생성 - cronjobs.yaml(yml, eyaml)
- 크론잡 배포 : kubectl create -f 파일경로
- 크론잡을 확인 : kubectl get cronjob 크론잡이름
- 파드의 동작을 확인 (크론잡은 파드를 생성하고 패기하는 작업을 반복): kubectl get pods
- 크론잡 삭제 : kubectl delete cronjob 크론잡이름
apiVersion: batch/v1
kind: CronJob #생성하고자 하는 오브젝트 종료
#메타 데이터 설정 - 기본이 되는 옵션
metadata:
name: hello #cronjob 이름
spec:
schedule: "*/1 * * * *" #1분 마다 수행 - 스케쥴 지정
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox #리눅스만 설치된 이미지
imagePullPolicy: IfNotPresent #이미지가 없을 때에만 내려받음
command:
- /bin/bash
- -c
- date; echo Hello from the Kubenetes Cluster
4. CoreDNS
4.1) DNS(Domain NAme Service)
- Domain 과 IP 주소를 변환해주는 서비스
- 브라우저에 입력할 때는 https//www.kakao.com 이라고 입력을 하지만 컴퓨터의 주소는 숫자로 되어있다.
- 따라서 이를 211.249.211.105 로 변환을 해주어야 하는데 이를 수행하는 것이 DNS
4.2) Core DNS
- 쿠버네티스가 가지고 있는 DNS
- 클러스터를 지속적으로 모니터링해서 정보를 업데이트
kuberctl 이라는 명령 체제
kubernetes - cli 를 다운로드
전체 클러스터 중,
개발자는 kuberctl을 이용해 Master를 컨트롤 하고 나머지 Worker를 관리
API Server를 사용해 etcd라는 DB에 scheduler를 이용해 작업 (사용량 등을 주기적으로 관리)
API가 Worker Node 에 pod를 생성, pod 속 container가 작업을 수행
-> 외부에서 접속하려면 해당container node의 IP와 접속 port를 전부 알아야함
CoreDNS 를 이용하면 Kubenetes에서 DNS 역할을 수행해 접속을 가능하게 해줌.
- 대표적인 UDP 서비스 중 하나
5. Config Map 과 Secret
5.1) 환경 변수
- 내부에서는 고정적으로 사용이 되지만 상황에 따라 다르게 설정되는 데이터를 별도로 저장해 두는 것
- 리눅스에서는 환경변수를 가져와서 사용할 때 $환경변수 또는 $(환경변수) 의 형태로 입력합니다.
- 원래 환경변수가 중요한 곳은 프로그래밍입니다.
- 내부에서는 고정적으로 사용이 되지만 상황에 따라 다르게 설정되는 데이터를 하드 코딩(소스 코드에 작성)하게 되면 값을 변경해야 할 때 컴파일과 빌드를 다시 해야하는 번거로움이 있음.
- 프로그래밍에서는 저런 데이터를 별도의 텍스트 형태의 파일(properties-env, xml, json, yaml 등)이나 데이터베이스에 저장해두고 사용하는 것을 권장합니다.
5.2) yaml 파일 내부에 생성
- env 키를 이용해서 name 과 value를 설정하고 사용을 할 때는 $(name) 의 형태로 사용 가능
spec:
- name:
...
env:
- name: GREETING
value: "Hello"
...
command: ["echo"]
args: [$(GREETING)] #이 자리에 "Hello" 가 입력되게 됨.
- 여러 번 사용하지 않는다면 굳이 할 이유가 없음.
5.3) 별도의 파일에 작성 - Config Map
- 명령
- kubectl create configmap < 맵 이름> <파일 경로> <인자>
- 인자에는 --from-file, --from-env-file, --from-literal
- --from-file 과 --from-env-file 은 둘 다 외부 파일을 이용해서 설정하는데 --from-file 은 내용 전체가 하나의 이름으로 묶이는 것이고, --from -env-file은 Key, Value 형태로 내용을 작성해서 여러 개의 값을 가질 수 있습니다.
- --from-literal 은 직접 key 와 value를 작성
- literal을 이용
- 변수 생성
- kubectl create configmap my-config --from-literal=JAVA_HOME=/usr/java
- kubectl create configmap my-config --from-literal=JAVA_HOME=/usr/java --from-literal=URL=https://www.oracle.com (여러개 작성시)
- 확인
- kubectl get configmap
- kubectl describe configmap/my-config
- 파일 이용
- 파일 작성 : env.txt
- 변수 생성
HOMETOWN=크라이스처리
JOB=학생
AGE: 13
- kubectl create configmap my-env --from-file=env.txt
5.4) secret
- 민감한 정보를 저장하는 용도로 사용
- 컨테이너에 저장하지 않고 별도로 보관해두었다가 실제 파드가 실행될 때 시크릿 값을 가져와서 파드에 제공
- 사용법은 configmap 과 거의 유사
- 생성
- kubectl create secret generic 시크릿이름 파일경로 옵션
- kubectl create secret generic db-user-pass --from-literal=username=itbam --from-literal=password=svng
- 확인
- kubectl get secret
- 화면에 보여지는 문자열
- kubectl get secret db-user-pass -o jsonpath='{.data}'
'{"password":"c3ZuZw==","username":"aXRiYW0="}'
원래 값을 알아낼려면 base64 디코딩을 해야 합니다.
- kubectl get secret db-user-pass -o jsonpath='{.data}'
6. 볼륨
6.1) 개요
- 볼륨은 데이터를 저장하는 저장소
- 파드는 휘발성
- 파드에 데이터를 저장한 후 디플로이먼트가 파드를 재시작하게 되면 저장된 데이터는 모두 소멸됩니다.
- 파드의 데이터가 없어지지 않도록 하는 것이 볼륨
6.2) 종류
- 파드 내에 위치 : 파드가 종료될 때 소멸
- emptyDir 이라고 합니다.
- 워크 노드에 위치 : 파드가 종료되어도 데이터는 유지가 되지만 워커 노드가 종료되면 소멸
- hostPath 라고 합니다.
- 노드 외부에 위치 : 데이터는 항상 보존
- 클라우드의 서비스를 이용하는 경우가 많습니다.
- NFS, cephFS, glusterFS, iSCSI, AWS EBS, azureDisk
6.3) emptyDir 사용
- 파드 내에 만든 데이터 저장소
- 일시적으로 보관하기 위한 데이터를 저장
- 컨테이너 내에 파일등을 만들어서 보관하고자 하는 경우 사용 가능
- spec 안에 volumes 를 이용해서 이름을 설정하고 값으로 emptyDir: { } 를 설정하면 됩니다.
- 실제 디렉토리에 마운트시켜 사용
6.4) emptyDir 실습 - 디렉토리가 생성되는지 확인
- pod 를 만들기 위한 매니페스트를 생성 - emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: emptydir
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: shared-storage
mountPath: /data/shared
volumes:
- name: shared_storage
emptyDir: {} #파드 내에 저장소를 생성
- 파드 생성
- kubectl apply -f emptydir.yaml
- 파드 생성
- kubectl exec -it emptydir -- /bin/bash
- 디렉토리 생성 여부 확인
- cd /data/shared
- 데이터 저장 방법
root@emptydir:/data/shared# echo "kubenetes" >> test.txt
root@emptydir:/data/shared# ls
test.txt
root@emptydir:/data/shared# open text.txt
bash: open: command not found
root@emptydir:/data/shared#
root@emptydir:/data/shared# cat test.txt
- 파드가 소멸되면 데이터가 없어지는 것을 확인
C:\Users\USER\kubenetes>kubectl delete pod emptydir
Error from server (NotFound): pods "emptydir" not found
C:\Users\USER\kubenetes>kubectl apply -f emptydir.yaml
pod/emptydir created
C:\Users\USER\kubenetes>kubectl exec -it emptydir -- /bin/bash
root@emptydir:/# cd /data/shared
root@emptydir:/data/shared# ls
root@emptydir:/data/shared# ls
root@emptydir:/data/shared#
6.5) hostPath 이용
- 워커 노드의 로컬 디스를 파드에 마운트해서 사용하는 볼륨
- 동일한 hostPath를 사용하는 다수의 파드끼리 데이터를 공유할 수 있는 장점이 있음
- 파드가 삭제되더라도 hostPath에 데이터가 남아있기 때문에 다른 파드나 새로 생성되는 파드가 그 데이터를 계속 사용하는 것이 가능합니다.
- volumne을 생성할 때 이름과 hostpath를 설정하고 hostpath에 실제 연결될 디렉토리를 설정해 주저야 합니다.
- 파드 생성을 위한 매니페스트 파일을 생성 - hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: hostpath
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: localstorage
mountPath: /data/local
volumes:
- name: localstorage
emptyDir: {} #파드 내에 저장소를 생성
- 파드 생성 및 확인
- kubectl apply -f hostpath.yaml
- kubectl get pods
- 파드에 접속해서 디렉토리가 생성되었는지 확인하고 파일을 작성한 후 파일 생성 여부 확인
- kubectl exec -it hostpath -- /bin/bash
- date > sample.txt
- ls -a >> sample
- ls
- cat sample.txt
- 파드를 삭제
- kubectl delete pod/hostpath
- 다시 파드를 생성
- kubectl apply -f hostpath.yaml
- 파드에 접속해서 디렉토리가 생성되었는지 확인하고 파일을 작성한 후 파일 생성 여부 확인
C:\Users\USER\kubenetes>kubectl apply -f hostpath.yaml
pod/hostpath created
C:\Users\USER\kubenetes>kubectl get pods
NAME READY STATUS RESTARTS AGE
emptydir 1/1 Running 0 22m
hello-28286111-tjnfv 0/1 CrashLoopBackOff 5 (2m7s ago) 5m7s
hello-28286112-h987p 0/1 CrashLoopBackOff 5 (70s ago) 4m7s
hello-28286113-bxrs5 0/1 CrashLoopBackOff 4 (94s ago) 3m7s
hello-28286114-qdjn4 0/1 CrashLoopBackOff 4 (46s ago) 2m7s
hello-28286115-t8lxd 0/1 CrashLoopBackOff 3 (34s ago) 67s
hello-28286116-qgbh2 0/1 RunContainerError 0 (7s ago) 7s
hostpath 1/1 Running 0 5s
prometheus-daemonset-fvwvb 0/1 ImagePullBackOff 0 166m
C:\Users\USER\kubenetes>kubectl exec -it hostpath.yaml -- /bin/bash
Error from server (NotFound): pods "hostpath.yaml" not found
C:\Users\USER\kubenetes>kubectl exec -it hostpath -- /bin/bash
root@hostpath:/# exit
exit
C:\Users\USER\kubenetes>kubectl delete hostpath
error: the server doesn't have a resource type "hostpath"
C:\Users\USER\kubenetes>kubectl delete pod/hostpath
pod "hostpath" deleted
C:\Users\USER\kubenetes>kubectl apply -f hostpath.yaml
pod/hostpath created
C:\Users\USER\kubenetes>kubectl exec -it hostpath -- /bin/bash
root@hostpath:/# hi
bash: hi: command not found
root@hostpath:/# date > sample.txt
root@hostpath:/# ls -a
. data home media run tmp
.. dev lib mnt sample.txt usr
.dockerenv docker-entrypoint.d lib32 opt sbin var
bin docker-entrypoint.sh lib64 proc srv
boot etc libx32 root sys
root@hostpath:/# ls -a >> sample
root@hostpath:/# ls
bin dev etc lib32 media proc sample srv usr
boot docker-entrypoint.d home lib64 mnt root sample.txt sys var
data docker-entrypoint.sh lib libx32 opt run sbin tmp
root@hostpath:/#
- 파드가 삭제된 후 다른 워커 노드에 생성되면 이전 데이터에 접근이 안됩니다.
6.6) 영구 볼륨과 영구 볼륨 클레임
- emptyDir 을 사용하면 파드가 삭제되면 데이터가 소멸되고 hostpath를 이용하더라도 워커 노드가 변경되면 소멸됩니다.
- 디플로이먼트로 생성되는 파드는 휘발성
실제 운영되는 시스템에서는 파드가 비정상적으로 종료되었더라도 데이터를 유지해 줄 수 있어야 합니다. - 영구 볼륨
컨테이너, 파드, 노드의 종류와 무관하게 데이터를 영구적으로 보관할 수 있는 볼륨- 영구 볼륨(Persistent Volume - PV)은 시스템 관리자가 외부 저장소에서 볼륨을 생성한 후 쿠버네티스 클러스터에 연결하는 것을 의미
- 쿠버네티스 클러스터 <-> 영구 볼륨 <-> 외부 저장소
- 개발자가 디플로이먼트로 파드를 생성할 때 볼륨을 저장하는데 이 때 볼륨 자체를 정의하는 것이 아니라 볼륨을 요청하는 볼륨 클레임을 지정
영구 볼륨을 요청하는 볼륨 클레임을 영구 볼륨 클레임(Persistent Volume Claim - PVC)이라고 합니다.
파드 <-> 영구 볼륨 <-> 외부 저장소
볼륨 마운트
volume:
- Claim Name -> 영구 볼륨 클레임 -> 영구 볼륨을 요청 -> 외부 스토리지
개발자가 파드를 생성할 때 볼륨을 요청하는 영구 볼륨 클레임을 정의하면 볼륨이 자동으로 할당
실제로 마운트되는 볼륨이 무엇인지 알 필요가 없음.
작업을 할 때는 영구 볼륨 설정, 영구 볼륨 클레임, 디플로이먼트, 서비스를 만들어야 합니다.
데이터 베이스를 이용하는 파드를 만들 때는 이러한 작업을 전부 수행해야 합니다.
이 작업이 쉽지 않아서 클라우드를 이용하는 경우이 작업을 생략하는 경우가 많고이 작업을 해야 한다면 클라우드가 제공하는 데이터베이스(AWS 의 RDS 나 Dynamo DB 등)를 이용하는 경우가 많습니다.
(이 작업 없이 진행 중, 워커가 죽게 되면 데이터가 사라지게 됨)
6.7) 영구 볼륨 사용 실습: mysql 데이터베이스에 영구 볼륨을 마운트
- 영구 볼륨을 위한 매니페스트 파일을 생성 - 편의상 hostpath 이용 (실제로는 클라우드의 외부 저장소를 사용해야 하는데 현재는 외부 저장소가 없기 때문) : pv.yaml
apiVersion: v1
kind: PersistentVolume #영구 볼륨 생성
metadata:
name: mysql-pv-volume
labels:
type: local
spec: #무엇인가를 만드는 부분
storageClassName: manual #영구 볼륨 클레임의 요청을 현재 영구 볼륨에 바인딩
capacity:
storage: 10Gi #용량 할당 - 중간에 수정하는 경우가 많음
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data" #나중에 이 부분은 외부 저장소의 URL로 변경을 해야함.(Amazon 의 경우는 EFS 서비스 활용)
- 매니페스트 파일 적용
- kubectl apply -f pv.yaml
- 영구 볼륨 클레임을 위한 매니페스트 생성 : pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim #영구 볼륨 클레임 생성
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual #영구 볼륨 클레임의 요청을 현재 영구 볼륨에 바인딩
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- 영구 볼륨 클레임 생성
- kubectl apply -f pvc.yaml
- mysql 을 배포하기 위한 pvc-deployment.yaml
- 배포
- kubectl apply -f pvc-deployment.yaml
- 외부에서 MySQL로 접속할 수 있도록 해주는 서비스를 위한 매니패스트 파일을 생성 - mysql_service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None
ports:
- port: 3306
selector:
app: mysql
- 배포
- kubectl create -f mysql_service.yaml
- 현재 디플로이먼트 상태 확인
- kubectl describe deployment mysql
- Volume과 마운트가 되었는지 확인
- 현재 파드의 상태 확인
- kubectl get pods
- 현재 서비스 상태 확인
- kubectl get service - service 대신에 svc 로 입력해도 됨
- 영구 볼륨 확인
- kubectl get persistentvolume(pv로 줄여도 됩니다.)
- RECLAIM POLICH: 영구 볼륨의 라이프 사이클 정책으로 영구 볼륨 클레임을 삭제할 때 영구 볼륨과 연결된 저장소의 파일을 어떻게 처리할 지를 선택
- Retain : 영구 볼륨 클레임을 삭제하더라도 영구 볼륨의 파일은 남겨두는 방식
- Delete : 영구 볼륨 클레임을 삭제할 때 영구 볼륨의 파일도 삭제
- Recycle : 영구 볼륨 클레임을 삭제할 때 영구 볼륨의 파일은 삭제를 하지만 영구 볼륨 자체는 삭제하지 않음
- STATUS : 볼륨의 상태
- Available : 아직 클레임에 바인딩되지 않은 상태
- Bound : 볼륨이 클레임에 의해 바인딩 된 상태
- Released :클레임이 삭제되었지만 클러스터에서 아직 리소스가 반환되지 않은 상태
- Failed : 볼륨이 자동 반환에 실패한 상태
- 볼륨을 자세히 보기 : kubectl describe pv mysql-pv-volume
- 볼륨 클레임을 확인 : kubectl get pvc
- ACCESS MODES
- RWO(Read Write Once) : 하나의 노드에서 해당 볼륨이 읽고 쓰기로 마운트
- ROX(Read Only Many) : 많은 노드에서 해당 볼륨이 읽기로 마운트
- RWX(Read Write Many_ : 많은 노드에서 해당 볼륨을 읽고 쓰기로 마운트
- RWOP(Read Write Once Pod) : 단일 파드에서 읽고 쓰기로 마운트
- mysql 접속
- kubectl run --it --rm --image=mysql:latest --restart=Never mysql-client -- mysql -h mysql -ppassword
- 접속이 되면 SQL 을 사용하여 데이터를 저장하는 것이 가능
CREATE DATABASE mySQL;
use mySQL;
CREATE TABLE Test(ID INT, Name VARCHAR(30) DEFAULT 'Anonymous', ReserveDate DATE, RoomNum INT);
SELECT *
FROM Test;
exit 명령으로 빠져나오기
- 배포된 파드 삭제
- kubectl delete deployment mysql
- kubectl get pods
- 파드를 다시 생성
- kubectl apply -f pvc-deployment.yaml
- mysql을 다시 접속
- 이전에 만든 테이블을 확인 -> 존재
7. 파드를 외부에 노출시키기
7.1) 서비스
- 파드는 클러스터 내의 노드들로 옮겨다니면서 생성
- 파드를 식별할 수 있는 IP는 매번 수정되기 때문에 내부나 외부에서 접근하기가 어려움
- 쿠버네티스의 서비스를 사용하면 파드가 클러스터 내 어디에 있든지 마치 고정된 IP로 접근할 수 있도록 해줌.
- 서비스의 종류
- 클러스터 내부 접속 용도 : ClusterIP
- 클러스터 외부 접속 용도 : ExternalName, NodePort, LoadBalancer, Ingress ExternalName 은 내부에서 외부로 접근할 때 사용
NodePort 는 외부에서 내부로 접근할 때 사용
LoadBalancer 와 Ingress 는 여러 클러스터 사이에 접근도 가능
7.2) Cluster IP
- 기본 서비스 타입
- 클러스터 내부의 파드에 접근할 수 있는 가상의 IP
- 서비스는 기본적으로 ClusterIP를 소유하고 서비스를 파드에 연결하면 서비스 IP를 통해서 파드에 접근할 수 있습니다.
- Cluster IP를 부여하는 방법은 Service 유형을 설정하지 않고 Pod를 생성하기만 하면 됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: clusterip-nginx
spec:
selector:
matchLabels:
run: clusterip-nginx
replicas: 2
template:
metadata:
labels:
run: clusterip-nginx
spec:
containers:
- name : clusterip-nginx
image: nginx
ports:
- containerPort: 80
- 배포 : kubectl apply -f ClusterIP.yaml
- 파드 확인 : kubectl get pods -l app=clusterip-nginx -o wide
- 클러스터 내부에 다른 파드를 생성해서 현재 생성된 파드에 접근
- 리눅스만 설치된 파드를 생성
- kubectl delete pod busybox
- kubectl run busybox --rm -it --image=busybox /bin/sh
- 접속 완료!
- 앞에서 확인한 Cluster IP를 이용해서 get 요청
- wget 10.1.1.140 을 수행하면 index.html 을 받아오기
- 브라우저 localhost로 10.1.1.141 에 접속하기(아직 안됨)
- 클러스터 외부에서는 서비스를 만들어서 연결해주지 않으면 접근이 불가함.
7.3) External Name
- 클러스터 내부에서 외부의 endpoint 에 접속하기 위한 서비스
- 외부의 endpoint는 데이터베이스나 애플리케이션의 API 등을 의미
- Service를 만들 때 spec 의 type 을 ExternalName 을 만들고 이름을 external-service 로 설정한 후 externalName을 myservice.test.com 으로 설정하면 external-service를 요청하면 myservice.test.com으로 리다이렉트 합니다.
- 로드 밸런서가 이 서비스를 이용합니다.
- 서비스를 만드는 방법
- 매니페스트 파일을 생성(yaml)
- kubectl expose 명령어를 사용하는 방법
7.4) NodePort
- 노드포트 타입의 서비스는 외부 사용자(애플리케이션)가 클러스터 내부에 있는 파드에 접속할 때 사용하는 서비스
- 특정 파드의 포트를 노트포트로 개방하면 노드포트 서비스가 이 포트로 들어오는 모든 요청은 해당 업무를 처리할 수 있는 파드로 전달
- 워커 노드의 실제 IP가 192.168.0.1 이고 Cluster IP가 10.0.0.1 일 때 NODEPORT 30001 과 워커 노드의 파드를 연결시키면 외부에서는 192.168.0.1:30001 번이면 워커 노드의 파드에 접속합니다.
- 매니페스트 파일을 만들어서 매핑을 하게 되는데 노드 포트 서비스를 하나 만들고 외부에서 어떤 포트로 접속할 지를 지정하고 내부의 어떤 파드를 사용할 지 셀렉터로 지정하고 포트를 설정하면 됩니다.
- nginx 이미지를 가지고 파드를 생성할 매니페스트 파일을 작성 : nginx-deployment.yaml
- 파드 생성
- kubectl apply -f nginx-deployment.yaml
- deployment 와 파드 확인
- kubectl get pods
- kubectl get deployments
- 노드포트 서비스를 위한 매니페스트를 작성: nginx-svc.yaml
- 노드포트 서비스를 실행
- kubectl apply -f ngingx-svc.yaml
- 서비스 확인
- kubectl get svc
반응형
LIST