파드가 다른 서비스에 접근하기 위한 방법을 알아보자
1. DNS
Service
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
Request Pod
apiVersion: v1
kind: Pod
metadata:
name: request-pod
spec:
containers:
- name: container
image: kubetm/init
실습 과정
- Service 생성
- Pod 생성 --> 위 서비스와 연결됨
- Request Pod 생성
- request-pod에 들어가서 다른 파드에 request를 날릴 예정
- 마스터 노드에서 다음 명령어로 request-pod에 들어가기
kubectl exec request-pod -it /bin/bash
- 들어간 파드 쉘에서 DNS로 서비스 이름, FQDN으로 아이피 조회 --> nslookup
nslookup clusterip1 nslookup clusterip1.default.svc.cluster.local
- 파드 쉘에서 서비스의 도메인 호출로 파드 호스트네임 알아내기
curl clusterip1/hostname curl clusterip1.default.svc.cluster.local/hostname
서비스에 들어간 트래픽은 파드로 가니까 파드의 호스트네임이 호출되는거
2. Headless
Service
apiVersion: v1
kind: Service
metadata:
name: headless1
spec:
selector:
svc: headless
ports:
- port: 80
targetPort: 8080
clusterIP: None
- clusterIP: None이네!
Pod
apiVersion: v1
kind: Pod
metadata:
name: pod4
labels:
svc: headless
spec:
hostname: pod-a
subdomain: headless1
containers:
- name: container
image: kubetm/app
- hostname: pod-a으로 했는데 왜 이런짓 했지
- subdomain: headless1 --> 위 서비스의 이름
Pod2
apiVersion: v1
kind: Pod
metadata:
name: pod5
labels:
svc: headless
spec:
hostname: pod-b
subdomain: headless1
containers:
- name: container
image: kubetm/app
실습 과정
- Service 생성
- Pod 생성
- Pod2 생성
- request-pod 쉘에서 nslookup 질의
nslookup headless1 nslookup pod-a.headless1 nslookup pod-b.headless1
Headless 서비스는 아이피가 없어서 연결되어 있는 파드의 아이피를 줌
3. Endpoint - 자동생성 확인
Service
apiVersion: v1
kind: Service
metadata:
name: endpoint1
spec:
selector:
svc: endpoint
ports:
- port: 8080
Pod
apiVersion: v1
kind: Pod
metadata:
name: pod7
labels:
svc: endpoint
spec:
containers:
- name: container
image: kubetm/app
실습 과정
- Service 생성
- Pod 생성
- 마스터 노드에 다음 명령어로 Endpoint가 알아서 만들어졌는지 확인
kubectl describe endpoints endpoint1
Endpoint 이름은 서비스 이름과 같고, 아이피는 연결된 파드의 아이피가 나옴
4. Endpoint - 직접 만들기
Service
apiVersion: v1
kind: Service
metadata:
name: endpoint2
spec:
ports:
- port: 8080
Pod
apiVersion: v1
kind: Pod
metadata:
name: pod9
spec:
containers:
- name: container
image: kubetm/app
- 서비스, 파드 둘 다 라벨이 없음
Endpoint
apiVersion: v1
kind: Endpoints
metadata:
name: endpoint2
subsets:
- addresses:
- ip: 20.111.156.73
ports:
- port: 8080
- 아이피 주소에는 pod9 아이피 주소 넣기
실습 과정
- Service 생성
- Pod 생성
- Endpoint 생성 --> 대시보드 서비스에 Endpoint가 들어가짐
- request-podd 쉘에서 에서 다음 명령어로 Endpoint 연결 확인
curl endpoint2:8080/hostname
4. Endpoint - 직접 만들고 외부 연결
Service
apiVersion: v1
kind: Service
metadata:
name: endpoint3
spec:
ports:
- port: 80
Endpoint
apiVersion: v1
kind: Endpoints
metadata:
name: endpoint3
subsets:
- addresses:
- ip: 185.199.110.153
ports:
- port: 80
ip는 github ip 주소 다음 명령어로 알아내서 입력
nslookup https://www.github.com
자료파일 다운로드 확인
curl -O 185.199.110.153:80/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md
실습 과정
- 서비스 생성
- Endpoint 생성
- request-pod 쉘에서 Endpoint 호출해서 자료 다운로드 받기
curl -O endpoint3/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md
5. ExternalName
Service
apiVersion: v1
kind: Service
metadata:
name: externalname1
spec:
type: ExternalName
externalName: github.github.io
- externalName에 외부 도메인을 넣으면 됨
실습 과정
- request-pod 쉘에서 externalName 서비스 호출
curl -O externalname1/kubetm/kubetm.github.io/blob/master/sample/practice/intermediate/service-sample.md
이제, 파드에서 외부 도메인을 바꾸고 싶으면 서비스의 externalName 도메인 값만 바꿔주면 됨
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 27. Volume - 실습 (0) | 2021.02.21 |
---|---|
[k8s] 26. Volume - Dynamic Provisioning, StorageClass, Status, ReclaimPolicy (0) | 2021.02.21 |
[k8s] 24. Service - Headless, Endpoint, ExternalName (0) | 2021.02.18 |
[k8s] 23. Pod - Node Scheduling - 실습 (0) | 2021.02.17 |
[k8s] 22. Pod - Node Scheduling (0) | 2021.02.17 |