* 사용자 관점에서 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
- 외부 사이트에서 데이터를 가져오려는 경우 사용
- 쿠버네티스 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
출처 : [Kubernetes] Headless, Endpoint, ExternalName(Service) (tistory.com)
'IT > CLOUD(AWS,Azure,GCP,Docker)' 카테고리의 다른 글
[VMware] OVF 배포 실패 (0) | 2022.10.09 |
---|---|
VMware Fusion 이미지를 ESXi VM으로 컨버팅하기 (0) | 2022.10.09 |
[Kubernetes] 쿠버네티스 kube-flannel CrashLoopBackOff 해결 방법 (Error registering network: failed to acquire lease: node "node1" pod cidr not assigned) (0) | 2022.07.07 |
vSphere Client - VM 복제 (0) | 2022.07.05 |
[kubernetes] 쿠버네티스 클러스터 구성(CentOS 7) (0) | 2022.07.05 |