[K8S] Service에 대한 이해

HYEOB KIM·2022년 7월 19일
1

kubernetes

목록 보기
14/14

Service 동작 원리

Service: 동일한 목적으로 동작되고 있는 Pod들을 하나로 묶어주고 로드밸런싱(L4). Cluster IP를 할당.

  • Pod Network: CNI에서 관리하는 포드 간 통신에 사용되는 클러스터 전체 네트워크
    + CNI: 컨테이너 사이에 통신할 수 있도록 해주는 인터페이스. Pod에 대한 IP를 할당해주는 역할

  • Service Network: Service discovery를 위해 kube-proxy가 관리하는 Cluster-wide 범위의 Virtual IP

  • Kubernetes Network Proxy: 각각의 Node에서 실행되고, Kubernetes Service API에 정의된 서비스를 각 노드에서 반영

  • kube-proxy의 역할: iptables rule을 설정하고 외부 네트워크와 Pod를 연결
    + service가 로드밸런싱하는 것처럼 보이는 것은 사실 워커 노드마다 iptables rule이 만들어지고 이것을 통해서 라우팅되고 있는 것입니다.

Type

  • ClusterIP(default): Pod 그룹(동일한 서비스를 지원하는 Pod 모음)의 단일 진입점(Virtual IP: LB) 생성(NodePort 설정 전까진 외부에서 접근 불가능)
  • NodePort: ClusterIP가 생성된 후 모든 Worker Node에 외부에서 접속 가능한 포트를 예약해서 포트포워딩.
  • LoadBalancer: 클라우드 인프라스트럭처(AWS, Azure, GCP)에 적용. LoadBalancer를 자동으로 프로비저닝하는 기능 지원

실습

1. deployment 생성

Replicas: 3deployment를 생성합니다.

% vim nginx-deployment.yaml

# 아래와 같이 편집
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        
% kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

% kubectl get pod -o wide
NAME                               READY   STATUS    RESTARTS       AGE     IP            NODE          NOMINATED NODE   READINESS GATES
eshop-cart-app                     1/1     Running   4 (114d ago)   117d    10.244.1.18   k8s-worker1   <none>           <none>
front-end-8dc556958-fvlpx          1/1     Running   3 (114d ago)   137d    10.244.2.41   k8s-worker2   <none>           <none>
front-end-8dc556958-vcr4s          1/1     Running   4 (114d ago)   137d    10.244.2.48   k8s-worker2   <none>           <none>
nginx-79488c9578-qwnfk             1/1     Running   2 (114d ago)   115d    10.244.1.19   k8s-worker1   <none>           <none>
nginx-79488c9578-xpsvp             1/1     Running   2 (114d ago)   115d    10.244.2.45   k8s-worker2   <none>           <none>
nginx-deployment-877f48f6d-qfdfq   1/1     Running   0              5m35s   10.244.2.50   k8s-worker2   <none>           <none>
nginx-deployment-877f48f6d-ws2sn   1/1     Running   0              5m35s   10.244.1.21   k8s-worker1   <none>           <none>
nginx-deployment-877f48f6d-xg7fx   1/1     Running   0              5m35s   10.244.1.20   k8s-worker1   <none>           <none>

2. service 생성

10.96.100.100 주소를 가진 service를 생성합니다.
(ClusterIP를 적지 않으면 무작위로 할당됩니다)

% vim my-service.yaml

# 아래와 같이 편집
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  clusterIP: 10.96.100.100
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

3. 테스트

% kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   175d
my-service   ClusterIP   10.96.100.100   <none>        80/TCP    5s

% ssh k8s-worker1

% curl 10.96.100.100
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Cluster IP

  • selectorlabel이 동일한 Pod들을 그룹으로 묶어 단일 진입점 (Virtual_IP)을 생성합니다.
  • 클러스터 내부에서만 사용 가능합니다.
  • service type 생략 시 default로 설정됩니다.
  • 10.96.0.0/12 범위에서 할당됩니다.

실습

LAB: 동일한 서비스를 제공하는 Pod 그룹에 ClusterIP 생성하기

1. deployment 생성

  • name: web
  • image: nginx
  • port: 80
  • replicas: 2
% kubectl create deployment web --image=nginx --port=80 --replicas=2

% kubectl get deployments.apps web

% kubectl get pod -o wide

2. service

  • name: web
  • type: ClusterIP
  • port: 80
% kubectl expose deployment web --type=ClusterIP --port=80 --target-port=80

% kubectl get svc web

CKA 문제 유형

  • 작업 클러스터: k8s

devops 네임스페이스에서 운영되고 있는 eshop-order deployment의 service를 만드세요.

  • service name: eshop-order-svc
  • type: ClusterIP
  • port: 80

1. 생성되어있는 deployment 확인

devops 네임스페이스에 현재 생성되어있는 deployment를 확인하고 selector를 확인합니다.

% kubectl get deployments.apps -n devops -o wide

2. Service 생성

% kubectl expose deployment eshop-order -n devops --type=ClusterIP --port=80 --target-port=80 --name=eshop-order-svc

% kubectl get svc

CKA 문제 유형 2

  • 작업 클러스터: k8s

미리 배포한 'front-end'에 기존의 nginx 컨테이너의 포트 80/tcpexpose하는 http라는 이름을 추가합니다.
컨테이너 포트 http를 expose하는 'front-end-svc'라는 새 service를 만듭니다.
또한 준비된 node의 'NodePort'를 통해 개별 Pods를 expose되도록 Service를 구성합니다.

1. 기존의 deployment에 http라는 이름의 Port 생성 후 Service 생성

# front-end deployment 동작 확인
% kubectl get deployments.apps front-end -o yaml > front-end.yaml

% vim front-end.yaml

# 아래 내용으로 편집
profile
Devops Engineer

0개의 댓글