-
Kubernetes - ServiceDocker & Kubernetes 2019. 10. 9. 18:00
Service란
쿠버네티스 외부 또는 내부에서 Pod에 접근할 때 사용하는 기능이다.
service를 사용하는 이유는 Pod는 서버와 같이 영구적인 것이 아니라 일회적인 것이기 때문이다.
서버는 문제가 생기면 서버를 재 시작하고 서비스를 재 시작 하지만
Pod는 문제가 생기면 문제가 생긴 Pod를 삭제한 뒤 새로운 Pod를 생성한다.
그렇기 때문에 Pod의 IP는 고정적이지 않고 가변적이다.
사용자가 Pod에 접근을 할 때 가변적인 IP를 가진 Pod에 접근하기 위해 Pod의 IP가 바뀔 때 마다 IP를 수정하는 것은 비효율적이며 매우 귀찮고 번거로운 일이 될 것이다.
그렇기 때문에 Service를 사용하면 사용자는 End Point로 Service를 지정하면
Service는 해당 Label Selector와 일치하는 Label을 가진 Pod로 접근을 가능하게 한다.
서비스는 원하는 IP로 생성이 가능하며, 고유한 DNS 이름을 가질 수 있다.
Service는 Label Selector를 통해 관리하려는 Pod를 정의할 수 있다.
Service에는 4가지 기능이 있다.
1. Load Balancer
2. Cluster IP
3. Node IP
4. External Name
1. Load Balancer
Load Balancer는 부하분산 장치이다.
쿠버네티스 외부에서 접근이 가능한 외부 부하 분산 기능과 내부 사용자만 접근 가능한 내부 부하 분산 기능이 있다.
※ 부하분산 또는 로드 밸런싱(load balancing)은 컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋이상의 중앙처리장치
혹은 저장장치와 같은 컴퓨터 자원들에게 작업을 나누는 것을 의미한다.
(https://ko.wikipedia.org/wiki/%EB%B6%80%ED%95%98%EB%B6%84%EC%82%B0)
아래는 외부에서 Pod에 접근 가능한 Service 의 yaml이다.
vi Loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: Loadbalancer
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: Loadbalancer
ver: v1
kubectl create -f Loadbalancer.yaml위의 명령어 실행 후 kubectl get service -A 를 통해 전체 서비스를 보거나 kubectl get service -n namespace명 을 통해 아래와 같이 확인이 가능하다.
위 생성된 service는 app:Loadbalancer, ver:v1 의 Lavel을 가진 Pod에게 부하분산을 한다.
외부에서 해당 Pod에 접속하기 위한 service ip는 EXTERNAL-IP (52.141.17.35) 를 입력하면 된다.
외부에서 Pod에 접근하기 위한 Service는 위와 같았다.
하지만 외부, 인터넷망이 아닌 내부, 사설망 내에서만 접근이 가능하도록 해야 하는 경우가 존재한다.
그 경우에는 아래와 같이 Service yaml을 작성하여 생성하면 된다.
vi internal-Loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: internal-loadbalancer
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: internal-loadbalancer
ver: v1kubectl create -f internal-Loadbalancer.yaml
위의 yaml 파일로 service를 생성하면 아래와 같이 생성이 된다.
위의 내부 로드밸런서는 Azure 상에서 적용 코드이고 다른 클라우드 공급자는 다른 코드를 사용한다,
AWS :
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
이 외의 다른 클라우드 공급자에 따른 내부 로드밸런서 주석은
https://kubernetes.io/docs/concepts/services-networking/service/
위의 경로에 접속하여 내부로드 밸런서를 확인하면 된다.
위의 생성된 service의 EXTERNAL-IP를 보면 이전의 Service와는 다르게 내부 IP인
10.20.x.x대역의 IP를 가진것을 볼 수 있다.
위와 같이 생성을 하면 외부에서 인터넷 망을 통한 접근은 불가하고, 내부에서 같은 대역대인 10.20.x.x 대역에서
10.20.10.107 IP를 통한 접근이 가능하다.
※ yaml 파일 작성시 name, selector 항목의 값을 대문자로 시작하면 오류가 발생하므로 소문자로 시작해야한다.
2. Cluster IP
디폴트 설정으로 클러스터 내에서 해당 서비스에 접속하기 위한 타입이다.
클러스터 내부의 Pod에서는 접근이 가능하지만 같은 대역대라고 하더라도 클러스터 외부에서는 접근이 불가능하다.
생성하면 아래와 같이 생성된다.
클러스터 IP는 존재하지만 EXTERNAL-IP가 존재하지 않기 때문에 클러스터 외부에서 접근이 불가능하다.
3. Node Port
클라이언트 IP 뿐만 아니라 클러스터를 구성하는 각 노드의 Port로 접속도 가능하다.
클라이언트 IP는 내부에서만 접근이 가능하고 외부에서 접근이 불가능 하나 Node Port를 사용하면
외부 사용자들이 Node IP : Node Port를 사용하여 접근이 가능하다.
아래와 같은 yaml 파일로 nodeport를 생성할 것이다.
vi nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport
spec:
type: NodePort
ports:
- name:http
port:80
protocol: TCP
targetPort: 8080
nodePort: 8081
selector:
app: nodeport
ver: v1kubectl create -f nodeport.yaml
위의 yaml 파일로 생성하면 아래와 같이 생성된 것을 볼 수 있다.
위와 같이 생성을 하면 아래의 그림과 같이 기존의 클러스터 IP처럼 클러스터 IP의 80 포트를 통해
노드들의 8080포트로 접근할 수 있었다.
위의 방법 말고 nodeport service를 이용하면 아래와 같이 각 각의 노드의 30001번 IP로도 접근이 가능하다.
※ 접근하려는 Pod가 Node1에 존재할때 Node2(1.0.0.2:30001)으로 접속하여도 Node1의 Pod로 접속이 가능하다.
4. External Name
External Name은 클러스터 내부에서 클러스터 외부의 특정 주소로 접근할 때 사용하는 방법입니다.
kind: Service
apiVersion: v1
metadata:
name: externalname
spec:
type: ExternalName
externalName: www.google.com위의 코드를 사용하여 작성을 하면 externalname Service로 접근하면 www.google.com으로 포워딩을 해줍니다.
'Docker & Kubernetes' 카테고리의 다른 글
kubernetes - 명령어 정리 및 사용법 (0) 2019.10.03 kubernetes - namespace란 ? (0) 2019.10.03 kubernetes - apiVersion 종류 (0) 2019.10.03 Kubernetes - Pod란? (0) 2019.10.03 CentOS 7 - 쿠버네티스 설치 (0) 2019.06.09