* 사용자 관점에서 Pod/Service에 연결하는 방법
파드의 입장에서 연결 및 외부 서비스에 안정적인 연결방법
* 이러한 연결 방법에는 DNS Server를 기본적으로 이용하여 사용
DNS Server란
- 쿠버네티스 클러스터 안에 존재하는 서비스의 이름과 IP가 저장되어 있는 존재
- Pod가 Service에 대한 도메인을 질의하면 해당 Service IP를 알려줌
- Pod가 유저를 찾으려고 할 때, 쿠버네티스 내부 뿐만 아니라, 상위 DNS 인 내부망 DNS, 외부 네트워크 DNS까지 조회가능
* DNS Server는 FQDN(Fully Qualified Domain Name)으로 구성되어 있음
파드의 입장에서 외부 및 다른 서비스/Pod와 연결 가능한 방법
1. Headless
- Pod간의 연결을 위해 사용하는 방법
- Cluster IP가 None인 Service
- DNS Server에 Pod의 이름과 Service의 이름이 붙여져서 도메인 이름으로 등록됨
- 다른 Pod에 접근하기 위해 IP 주소를 알 필요없이, 도메인 이름으로 접근 가능
2. EndPoint
- 사용자의 입장에서 Label을 이용해 Pod와 Service간의 연결을 진행
- 쿠버네티스측에서는 이러한 연결을 위해 EndPoint를 만들어서 연결고리를 관리함
- 이러한 EndPoint는 Service와 동일한 이름을 가지고 있고 Pod의 IP정보를 담고 있음
- EndPoint를 직접 만드는 것으로 Label, Selector를 만들지 않고도 연결이 가능
- Pod 뿐만 아니라 외부의 IP 주소를 입력하여 외부와도 연결이 가능
3. ExternalName
- 외부 사이트에서 데이터를 가져오려는 경우 사용
- EndPoint로도 외부와 연결은 가능하지만, IP가 변동될 가능성이 있어 hostname으로 연결하는 방법
- 쿠버네티스 DNS Server로 부터 상위 DNS Server를 계속 거쳐 외부 네트워크로 접근하는 방법
* Pod는 Service만 가르키면 되고 Service에서 필요할 때마다 해당 도메인 주소 변경이 가능
-> 외부 대상 IP가 변경될 때마다 Pod를 수정하고 재배포할 필요가 없어짐
1. 쿠버네티스 DNS 실습
서비스 생성
apiVersion: v1
kind: Service
metadata:
name: clusterip1
spec:
selector:
svc: clusterip
ports:
- port: 80
targetPort: 8080
서비스와 연동된 Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
svc: clusterip
spec:
containers:
- name: container
image: kubetm/app
서비스 및 Pod 생성 확인
생성한 서비스와 연동되지 않은Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: request-pod
spec:
containers:
- name: container
image: kubetm/init
master 노드에서 콘솔을 이용해 해당 Pod(Request-pod)로 진입
kubectl exec "pod name" -it /bin/bash
DNS로 IP 조회
// 해당 서비스명으로 IP 조회
nslookup clusterip1
// FQDM에 맞춰 입력해도 같은 결과가 출력
nslookup clusterip1.default.svc.cluster.local
도메인으로 해당 서비스에 접근 가능
curl clusterip1/hostname
curl clusterip1.default.svc.cluster.local/hostname
2. Headless 실습
서비스 생성
클러스터 IP에 None이라는 속성을 지정
apiVersion: v1
kind: Service
metadata:
name: headless1
spec:
selector:
svc: headless
ports:
- port: 80
targetPort: 8080
clusterIP: None
서비스와 연동될 Pod 2개 생성
hostname, subdmain을 지정
hostname 을 지정하지 않으면 Pod이름이 host명이 됨
subdomain은 일반적으로 서비스명을 지정
apiVersion: v1
kind: Pod
metadata:
name: pod4
labels:
svc: headless
spec:
hostname: pod-a
subdomain: headless1
containers:
- name: container
image: kubetm/app
apiVersion: v1
kind: Pod
metadata:
name: pod5
labels:
svc: headless
spec:
hostname: pod-b
subdomain: headless1
containers:
- name: container
image: kubetm/app
생성된 파드와 서비스 확인
클러스터 IP가 만들어지지 않은 서비스가 확인됨
생성한 서비스와 연동되지 않은 Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: request-pod
spec:
containers:
- name: container
image: kubetm/init
생성된 Pod 확인
master 노드에서 콘솔을 이용해 해당 Pod(Request-pod)로 진입
kubectl exec "pod name" -it /bin/bash
nslookup으로 서비스와 파드의 DNS 확인
curl로 Pod의 호스트명에 접근
3. label, Selector를 이용한 EndPoint 자동 생성
서비스 생성
apiVersion: v1
kind: Service
metadata:
name: endpoint1
spec:
selector:
svc: endpoint
ports:
- port: 8080
해당 서비스와 label - Selector로 연동되는 Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: pod7
labels:
svc: endpoint
spec:
containers:
- name: container
image: kubetm/app
생성된 서비스 및 파드 확인
서비스의 엔드포인트 확인
kubectl describe endpoints "Object Name"
해당 Pod의 주소와 포트 번호가 출력됨
-> 결국 서비스를 생성하면 쿠버네티스에서 Label, Selector를 이용하여 자동적으로 EndPoint를 생성
4. 사용자 지정 EndPoint 생성
서비스 생성
3번 실습과 다르게 Selecor를 지정하지 않음
apiVersion: v1
kind: Service
metadata:
name: endpoint2
spec:
ports:
- port: 8080
파드 생성
3번 실습과 다르게 Label지정 X
apiVersion: v1
kind: Pod
metadata:
name: pod9
spec:
containers:
- name: container
image: kubetm/app
생성된 서비스 및 파드 확인
연결된 파드가 존재하지 않음
서비스의 EndPoint확인
아무런 연결도 존재하지 않음
엔드포인트 생성
서비스 명과 파드의 IP로 지정하여 생성해야함
apiVersion: v1
kind: Endpoints
metadata:
name: "Service Name"
subsets:
- addresses:
- ip: "Pod IP Address"
ports:
- port: 8080
생성한 EndPoint확인
서비스를 확인하면 연결된 파드가 확인됨
* 단, 이전 Label, Selector를 이용하여 만든 것과는 다르게 Pod 목록에 표시 되지는 않음
5. EndPoint에 외부주소 기입
서비스 생성
apiVersion: v1
kind: Service
metadata:
name: endpoint3
spec:
ports:
- port: 80
생성된 서비스 확인
github의 IP 주소 확인
해당 주소들 중 한개를 골라서 사용
github접근 확인
github 레포지토리에 접근하여 파일 다운로드
curl -O "github IP address":80/"dir Path"/"file name"
EndPoint 생성
apiVersion: v1
kind: Endpoints
metadata:
name: endpoint3
subsets:
- addresses:
- ip: 185.199.110.153
ports:
- port: 80
위의 파일 다운로드를 endpoint를 이용하여 접근
-> github의 주소를 몰라도 접근 가능
curl -O "endpoint name"/"dir Path"/"file name"
6. External Name 실습
external name을 type으로 가지는 서비스 생성
apiVersion: v1
kind: Service
metadata:
name: externalname1
spec:
type: ExternalName
externalName: github.github.io
external name을 이용하여 접근
curl -O "external name"/"dir Path"/"file name"
* 만약 IP주소가 변경된다면 해당 external name을 수정하면 됨
-> Pod 재배포 X
'CICD' 카테고리의 다른 글
[Kubernetes] X509 Certs, kubectl, ServiceAccount(Authentication) (0) | 2022.01.30 |
---|---|
[Kubernetes] Dynamic Provioning, RelcaimPoicy(Volume) (0) | 2022.01.22 |
[Kubernetes] Node Scheduling(Pod) (0) | 2022.01.20 |
[Kubernetes] QoS classes(Pod) (0) | 2022.01.16 |
[Kubernetes] ReadinessProbe, LivenessProbe(Pod) (0) | 2022.01.16 |
댓글