우선 글을 작성하기 전에 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와 열어둔 포트를 이용해서 접근하면?

정상적으로 접근이 가능한 것을 확인 가능합니다.

+ Recent posts