Service 실습
- 하드에 서비스를 달면 하드가 죽어서 재생성돼도 서비스의 IP로 접근 가능
- 여기서 진행
1. ClusterIP
Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
app: pod
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: container
image: kubetm/app
ports:
- containerPort: 8080
ClusterIP 생성
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
- 맨 밑에 type: ClusterIP 넣어도 되는데 안 넣어도 자동으로 ClusterIP 지정
- 이 서비스의 9000번 포트로 접근하면 타겟으로 8080 포트로 연결을 함
ClusterIP로 접속
- 클러스터아이피가 10.96.179.229네요
- 마스터에서 curl로 아이피를 호출하는 건 쿠버네티스 내에서 접속하는 것
curl 10.96.179.229:9000/hostname
은 pod-1의 호스트네임을 찍음- pod-1에 호스트네임이라는 path가 들어가면 pod-1의 호스트네임을 찍도록 파드를 생성해서 나옴
- 외부에서 아이피로 접근하면 접속이 안 됨
강의에서 hostname을 찍도록 파드에서 생성했다고 하는데 이게 머선소리냐면 원래 hostname 필드가 선택필드여서 설정을 안 하면 metadata의 name 필드가 나옴. 그런데 hostname을 metadata의 name필드와 다르게 설정하면 hostname 설정 값이 나옴. 위 예시 파드는 hostname 필드를 설정 안 해서 metadata pod-1이 hostname path로 찍으니 나왔던 것
Pod 삭제 후 다시 생성
- 기존 파드 삭제 후 똑같은 yaml으로 파드 생성
- 서비스의 셀렉터가 알아서 연결을 만들어줘서 pod-1과 연결됨
- pod-1의 아이피가 변경돼도 서비스의 아이피로 그대로 연결가능
2. NodePort
NodePort 생성
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
- ClusterIP로 만든 서비스 svc-1은 삭제
- 내부 엔드포인트
- svc-2:9000 TCP --> 클러스터 아이피로 접근할 때 사용하는 포트
- svc-2:30000 TCP --> 노드로 접근할 때 사용하는 포트
노드로 접속
- node1 아이피(31), node2 아이피(32)로 각각 30000포트로 접속하여 pod-1의 호스트네임을 출력하게 하니 되네!
Pod하나 더 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
app: pod
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node2
containers:
- name: container
image: kubetm/app
ports:
- containerPort: 8080
- 이름은 pod-2, node2에 생성
- pod-1, pod-2 둘 다 NodePort 서비스에 연결됨
노드로 접속
- 트래픽이 분산돼서 가네
externalTrafficPolicy 확인
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
externalTrafficPolicy: Local
- 기존의 서비스를 지우고 새로 서비스 생성
- externalTrafficPolicy: Local가 추가됨
노드로 접속
- 노드1에 있는 파드, 노드2에 있는 파드의 호스트네임만 출력됨
pod-1을 삭제하고 노드1로 접속하기
- 접근이 안 됨
3. Load Balancer
Load Balancer 생성
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: LoadBalancer
생성이 안 됨
- 마스터노드에서
kubectl get service svc-3
로 상태 확인 - Load Balancer의 EXTERNAL-IP는 AWS, AZURE 등의 플러그인이 있어야 할당이 됨
- 쿠버네티스는 EXTERNAL-IP를 할당해주지 않음
출처
인프런 대세는 쿠버네티스 강의
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 7. Volume - 실습 (0) | 2021.02.07 |
---|---|
[k8s] 6. Volume - emptyDir, hostPath, PV/PVC (0) | 2021.02.04 |
[k8s] 4. Service - ClusterIP, NodePort, LoadBalancer (0) | 2021.02.01 |
[k8s] 3. Pod - 실습 (0) | 2021.01.31 |
[k8s] 2. 쿠버네티스 설치 (1) | 2021.01.31 |