반응형
Intro
- 오늘은 쿠버네티스의 Pod로 접근하기위해 네트워크에 노출시키는 Service에 대해 설명하고자 합니다.
- 서비스를 네트워크에 어떤 방식으로 노출 시킬 것인가에 따라서 타입이 달라집니다.
Service 의 type 종류
- ClusterIP : 클러스터 내부에서만 접근할 수 있는 IP를 할당
- NodePort : 노드의 특정 포트를 사용하여 접근하는 방식, 포트당 하나의 서비스만 사용 가능
- LoadBalancer : 노드포트 앞단에 특정 LoadBalancer를 사용하여 접근하는 방식
- ExternalName : DNS이름에 대한 서비스를 매핑함
ClusterIP타입
말그대로 ClusterIP는 서비스를 클러스터 IP로 할당 합니다. 클러스터 내부에서만 접근할 수 있으며, 외부에서는 접근할 수 없으로 port forwarding 또는 proxy를 통해 접근을 해야 합니다. 또한 서비스 타입을 별도 type을 설정하지 않으면 ClusterIP가 default로 설정됩니다.
ClusterIP타입 yaml예시
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: k8s-test
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: k8s-test
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
서비스를 apply 하고 확인해보면 아래와 같이 Cluster IP가 할당되어 있습니다.
ClusterIP 타입 서비스 외부 접근 방법
Proxy사용
- kubernetes proxy 연결
kubectl proxy --port=8080
- kubernetes api server 를 통해 proxy URL수동 구성
http://localhost:8080/api/v1/namespaces/<my_namespace_name>/services/http:<my_service_name>:<my_http_port_name>/proxy/
http://localhost:8080/api/v1/namespaces/k8s-test/services/http:my-service:http/proxy/
port forwarding 사용
- kubernetes의 포트포워딩 기능을 통해 접근
kubectl port-forwarding service/<my_service_name> <local_port>:<remote_port>
kubectl port-forwarding service/my-service 8080:80
NodePort타입
- 노드포트는 모든 워커 노드들의 특정 포트(port)를 이용하여 접근을 하도록 설정하는 타입입니다.
- 노트포트를 사용하면 포트당 하나의 서비스를 사용하며, 30000-32767범위내 포트를 사용 합니다..
- 노트포트의 단점은 노드가 사라졌을때 자동으로 다른노드를 통해 접근이 불가능합니다.
- 따라서 자동으로 다른노드에 접근을 하려면 별도의 Loadbalancer가 필요 합니다.
NodePort타입 yaml예시
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
namespace: k8s-test
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80
- service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service2
namespace: k8s-test
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30007
서비스를 apply 하고 확인해보면 아래와 같이 Cluster IP와, nodePort가 30007로 할당되어 있습니다.
NodePort 타입 서비스 외부 접근 방법
ClusterIP와 동일 방법으로 접근할 수 있습니다.
Proxy사용
- kubernetes proxy 연결
kubectl proxy --port=8080
- kubernetes api server 를 통해 proxy URL수동 구성
http://localhost:8080/api/v1/namespaces/<my_namespace_name>/services/http:<my_service_name>:<my_http_port_name>/proxy/
http://localhost:8080/api/v1/namespaces/k8s-test/services/http:my-service2:http/proxy/
port forwarding
- kubernetes의 포트포워딩 기능을 통해 접근
kubectl port-forwarding service/<service_name> <local_port>:<remote_port>
kubectl port-forwarding service/my-service2 8080:80
LoadBalancer 타입
- Nodeport 타입의 확장판이라고 할 수 있으며 서비스를 외부에 노출 할 수 있습니다.
- NodePort타입 앞단에 Loadbalancer가 붙어서 살아있는 노드를 체크하여 트래픽을 전달 할 수 있는 장점이 있습니다.
- 클라우드 공급업체(AWS, GCP 등)에서 지원하는 기능입니다.
LoadBalancer타입 yaml 예시
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
namespace: k8s-test
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80
- service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service3
namespace: k8s-test
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30006
위 예시와 같이 nodeport 를 지정할 수 있습니다. 저는 AWS EKS 클러스터로 생성하였기 때문에 AWS에 ELB가 생성되는 것을 확인할 수 있습니다.
LoadBalancer 타입 서비스 외부 접근 방법
ELB가 외부에서 접근 할 수 있는 public subnet에 자동으로 생성이 되므로 서비스를 확인할때 나오는 External-IP의 주소를 사용하여 외부에서 접근이 가능합니다.
- AWS External-IP 예시 : 0000asdf0asd0f0asdf00.ap-northeast-2.elb.amazonaws.com
External 타입
- 외부에서 접근하기 위한 종류 아니며, 외부의 특정 FQDN에 대한 CNAME 매핑을 제공 함
External 타입 yaml 예시
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
다음 시간에는 AWS의 여러가지 Elastic LoadBalancer Type을 설정 해보고, ingress도 설정해보도록 하겠습니다.
감사합니다.
반응형
'IT > Kubernetes' 카테고리의 다른 글
[CKA독학]kubernetes Cluster Maintenance 정리(drain/cordon/uncordon/ectd 백업&복구) (0) | 2021.06.04 |
---|---|
[CKA독학]kubernetes Static pod/multi scheduler 정리 (0) | 2021.06.03 |
[CKA독학]kubernetes Resource Requests/Limits요약 정리 (0) | 2021.06.03 |
[CKA독학]kubernetes 스케줄링 정리(taint&tolerations/NodeSelector/NodeAffinity) (0) | 2021.06.02 |
[CKA독학]kubernetes pod/replicaset/deployment/service 명령어 및 manifest정리 (0) | 2021.06.01 |