Tools/Kubernetes

[CKA 도전 시리즈] 10. Service ClusterIP

MOMOBOB 2023. 2. 7. 00:26
반응형

 

Service

  • 동적으로 변하는 파드들에 고정적으로 접근하기 위한 API
  • 동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공

 

Service Type

- ClusterIP

  • 가장 기본적인 서비스.(default)
  • Pod그룹의 단일진입점을 생성함

- NodePort

  • ClusterIP 가 생성된 후 모든 Worker Node 에 외부에서 접속 가능 한 포트가 예약

 


1. ClusterIP

  • Pod그룹의 단일진입점을 생성함
  • 클러스터 내부에서만 사용가능
  • Service type 생략 시 default 로 설정됨
  • 10.96.0.0/12 범위에서 할당됨
kubectl expose deployment <SERVICE_NAME> type=<SERVICE_TYPE> port=<PORT>

# 예
kubectl expose deployment webserver type=ClusterIP port=80
  • yaml 예
apiVersion: v1
kind: Service
metadata:
  name: clusterip-service
spec:
  type: ClusterIP
  clusterIP: 10.100.100.100
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

 

예제1

dev라는 namespace에서 운영되고 있는 web-app라는 deployment의 Service를 생성하시오.

  • Name: web-app-svc
  • Type: ClusterIP
  • Port: 80

풀이

1. namespace 생성

kubectl create namespace dev

2. deployment 생성

kubectl create deployment web-app -n dev --image=nginx --port=80 --replicas=2

3. Service 생성

kubectl expose deployment web-app --namespace dev --type=ClusterIP --port=80 --target-port=80 --name=web-app-svc

 

예제 2

위 예제에서 80/tcp를 expose하는 http라는 타켓포트를 추가하시오.

풀이

1. Deployment yaml 생성

kubectl create deployment web-app -n dev --image=nginx --port=80 --replicas=2 --dry-run=client -o yaml > exam2.yaml

2. yaml에 Service 추가 (document 참고)

spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web-app
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
          name: http        # 컨테이너에 port이름 지정
            
---         
apiVersion: v1
kind: Service
metadata:
  name: web-app-src
  namespace: dev
spec:
  selector:
    run: web-app
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: http        # 이름으로 포워딩

3. 적용

kubectl apply -f exam2.yaml

 

 

반응형

 


 

2. NodePort

  • 모든 노드를 대상으로 외부 접속 가능한 포트를 예약
  • Default NodePort 범위 : 30000-32767 (Random)
  • ClusterIP를 생성 후 NodePort를 예약
  • ClusterIP 타입의 서비스에서 포트설정 기능이 추가된 것.
  • yaml 예
apiVersion: v1
kind: Service
metadata:
  name: nodeport-service
spec:
  type: NodePort
  clusterIP: 10.100.100.200
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30200			# 포트지정

 

예제 3

위 예제2에서 label이 web-app으로 동작중인 파드가 30200로 접속되도록 NodePort로 서비스를 수정하시오.

풀이

spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web-app
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
          name: http       
            
---         
apiVersion: v1
kind: Service
metadata:
  name: web-app-src
spec:
  selector:
    run: web-app
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: http       
    nodePort: 30200
  selector:
    app: web-app
  type: NodePort

 

 

 

끝.

 

 


Thank you!

 

 

반응형