Service 실습
Pod 가 죽고 다시 살아나면 IP가 변경된다.
그래서 Pod에 Service를 달아두고 Service IP로 접근하게 된다.
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
Service(Type, ClusterIP) 생성
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
Service도 3개의 타입으로 나뉘는데 아무것도 입력하지 않으면 Cluster 타입으로 생성된다.
클러스터 타입이란, 클러스터 내에서만 접근이 가능하다. 그 말은 즉슨 외부에서는 접근이 불가능하다는 것이고,
관리자가 모니터링을 할 서버에 적합한 타입이다.
Service의 Port로 접속 시 targetPort 로 연결된다.
Service IP의 포트로 접근하여 /hostname을 찍어보면 Pod-1 이 찍히게 된다.
Service(Type, NodePort) 생성
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
externalTrafficPolicy: Local
NodePort는 30000번으로 지정해두었고, 노드로 접근을 했을 때 사용할 수 있는 포트이다.
현재 Node는 2개의 서버를 생성해두었고, Node1(127.0.0.2) Node2(127.0.0.3) 이라고 가정하겠습니다.
Pod를 두 개 생성하고, NodePort로 연결한 다음 Service IP로 요청하게 되면 Service 내에 2개의 Pod에 알아서 분배되어 요청이 나눠지게 됩니다.
ex) curl 127.0.0.2:30000 요청을 계속보내면 Pod-1로도 갔다가 Pod-2로도 요청이 전송되는데
하지만 externalTrafficPolicy: Local 을 설정하게 된다면 2번 Node IP로 요청을 보내면 2번으로 계속 전송된다.
만약 Node-1 에 있는 Pod-1 이 삭제되었고, Node-1에 요청을 보낸다면 요청이 가지않는다.
이 부분을 주의해야한다.
내부망에서 테스트연결용이나 데모나 임시연결용으로 쓰인다.
임시연결용이란 출시하기전에 실제 테스트해보기 위해 Node를 오픈시켜보는? 것 정도로 생각해보면 될 것 같다.
구글링 설명
NodePort 타입의 서비스는 기본적으로 CLusterIP 타입과 동일하지만 몇가지 기능들을 더 가지고 있습니다. NodePort 타입 서비스는 노드 네트워크의 IP를 통하여 접근을 할 수 있을 뿐만 아니라 ClusterIP로도 접근이 가능합니다.
이것이 가능한 이유는 쿠버네티스가 NodePort 타입의 서비스를 생성하면 kube-proxy가 각 노드의 eth0 네트워크 interface에 30000~32767 포트 사이의 임의의 포트를 할당합니다.
그리고 할당 된 포트로 요청이 오게되면 이것을 매핑된 CLusterIP로 전달합니다.
Service(Type, Load Balancer) 생성
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: LoadBalancer
생성해도 정상적으로 작동이 안되는 이유는 외부 아이피(공인 IP)를 할당해주는 플러그인이 없기 때문이다.
하지만 난 GCP를 사용하였고 정상적으로 생성되었다 그 이유는 AWS, GCP에서는 지원 플러그인이 있기 때문이다.
구글링 설명
NodePort 기능을 더하여 로드 밸런서를 통한 접근까지 완벽하게 해결하는 기능을 가집니다.
이것은 GCP나 AWS와 같이 API를 통하여 로드 밸런서를 생성할 수 있는 클라우드 환경을 사용한다는 것을 가정합니다.

'Devops > Kubernetes' 카테고리의 다른 글
Kubernetes - Object:ConfigMap, Secret (0) | 2020.05.08 |
---|---|
Kubernetes 세미나 (0) | 2020.04.29 |
Kubernetes - Object:Volume (0) | 2020.04.27 |
Kubernetes - Object (0) | 2020.04.27 |
Kubernetes - 배경, 개념, 장점 (0) | 2020.04.23 |
댓글