우선 글을 작성하기 전에 GCE 위에서 쿠버네티스를 설치하는 실습은 이번 포스팅까지임을 말씀드립니다.
Ingress까지 공부를 진행하였으나 GCP에서 부하분산을 지원하기도하고
슬슬 GKE를 이용해서 프로젝트를 진행하고 싶어 다음 포스팅 부터는 GKE 관련 포스팅이 될 것입니다.
실습 위주로 진행된 부분이 많아 내용정리에 부족한 부분들은 별도로 추가 포스팅을 진행할 계획입니다.
Service
서비스에 대해서 다시 한번 짚고 넘어갑니다~
서비스는 파드 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법이라고 한다.
서비스가 대상으로 하는 파드의 집합은 일반적으로 셀렉터가 결정합니다. => 셀렉터를 맞춰준 이유!
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
pori: nginx
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: NodePort
nginx 서비스 코드를 예시로 뜯어보겠습니다.
프로토콜을 TCP를 사용하고, 파드의 9376번 포트를 대상으로하는 서비스를 만든다면 위와 같이 생성 가능합니다.
서비스의 이름은 my-service가 될것이고 서비스의 80번 포트로 연결될 것입니다.
Docs의 아래에 재미있는 코드가 하나 더 있습니다. 바로 Pod의 컨테이너 포트에 이름을 생성해주고 서비스에서 타겟포트를 해당 이름으로 지원하는 방법입니다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app.kubernetes.io/name: proxy
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app.kubernetes.io/name: proxy
ports:
- name: name-of-service-port
protocol: TCP
port: 80
targetPort: http-web-svc
Kind를 잘 봐주세요!!
위쪽은 Pod의 정의 입니다. spec > containers > ports > name을 보면 해당 포트에 이름을 지정해둔 것을 확인 가능합니다.
아래의 Service의 targetPort를 보면 원하는 Pod의 포트 이름으로 연결한 것을 확인 가능합니다.
Service type
- ClusterIP: 클러스터 내부에서만 접근할 수 있는 IP를 할당한다.
- NodePort: 노드의 특정 포트를 사용해서 접근하는 방법이다. 포트당 하나의 서비스만 사용가능하다고 한다.
- LoadBalancer: 노드포트의 앞에 특정 LoadBalancer를 사용해서 접근한다.
- ExternalName: DNS이름에 대한 서비스를 매핑한다.
NodePort
사용할 NodePort에 대해서 조금 더 알아보겠다.
NodePort는 특정 포트를 사용해서 접근을 허용합니다.
--service-node-port-range 플래그로 지정된 범위에서 포트를 할당한다. (3000~32767 범위의 포트를 사용한다.)
(뭔가 오버라이딩이 될것만 같은 형태..)
서비스는 할당된 포트를 .spec.ports[*].nodePort필드에 나타낸다고한다.
실습
우선 디플로이먼트로 파드를 생성해준다. 서비스가 대상으로하는 파드의 집합은 셀렉터에서 가져오니까 셀렉터를 잘 기억해두겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx # 이거는 pod에 영향을 주지 않는다.
spec:
replicas: 2
selector:
matchLabels:
pori: nginx # MatchLable의 값이 아래의 metadata의 labels와 동일한 값이여야 동작
template:
metadata:
labels:
pori: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
네 지난 실습코드와 동일합니다! 여기서 selector의 matchLabes를 기억하면 pori:nginx입니다.
그럼 이제 service를 만들면
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
pori: nginx
ports:
- protocol: TCP
nodePort: 31299
port: 80
targetPort: 80
type: NodePort
31299번 포트를 지정해서 사용할것이기 때문에 다음과 같이 작성했습니다.
spec > selector를 보면 우리가 위에서 지정한 라벨을 똑같이 적용함을 알 수 있습니다.
이렇게 서비스로 연결된 파드는 worker1, worker2가되고 GCE의 외부IP와 열어둔 포트를 이용해서 접근하면?
정상적으로 접근이 가능한 것을 확인 가능합니다.
'Infra & Container > k8s' 카테고리의 다른 글
k8s > GCE를 이용해서 설치하기(5) - Deployment 생성해보기 (0) | 2024.05.11 |
---|---|
k8s > Deployment (2) | 2024.05.11 |
k8s > kubernetes를 배우는 이유, Master & worker node (0) | 2024.04.29 |
k8s > GCE를 이용해서 설치하기(4) - Pod생성해보기 (0) | 2024.04.24 |
k8s > GCE를 이용해서 설치하기(3) - CNI (1) | 2024.04.19 |