반응형

본 글은 인프런 강의 "대세는 쿠버네티스 [초급~중급]" 를 듣고 요약 및 실습 정리한 내용입니다.

 

Service

  • 기본적으로 자신의 cluster ip를 가짐

 

 

  • Service를 Pod에 연결하면 Service IP를 통해 Pod에 접근 가능
  • Pod는 재생성될 때 IP가 변경되기 때문에 신뢰성이 떨어짐

Service의 종류는 3가지가 있음

1) ClusterIP

  • 외부 (External)에서 접근 불가
  • Cluster 내에서 접근 가능
  • Service의 9000 포트로 요청이 들어오면 Pod의 8080 포트와 연결이 됨

 

  • 하나의 Service에 여러개의 Pod를 연결시킬 수 있고 서비스가 트래픽을 분산해서 Pod에 전달해줌
  • 활용: 인가된 사용자, 내부 대쉬보드, pod의 서비스상태 디버깅

Service yaml 파일

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: pod
    ports:
      - port: 9000 # Service port 
      - targetPort: 8080 # Service에 연결된 Pod port
		type: ClusterIP # default로 생략가능

 

Pod yaml 파일

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
labels:
  app: pod
spec:
  containers:
  - name: container
    image: tmkube/app
    ports:
    - containerPort: 8080
  • Service yaml파일의 targetPort와 pod yaml파일의 containerPort가 같아야 함

 

2) NodePort

  • 서비스에 clusterIP가 할당됨
  • 쿠버네티스에 할당된 모든 Node에 똑같은 Port가 할당됨
  • 외부에서 어떤 노드든 간에 접속이 되면 Service에 연결이 됨
  • 서비스는 자신과 연결된 Pod에 트래픽을 전달

 

주의할점

  • pod가 있는 node만 port가 할당되는게 아니라 모든 Node에 포트가 할당됨
  • 활용: 내부망 연결, 데모나 임시 연결용
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000 # 30000 ~ 32767
  type: NodePort
  • externalTrafficPolicy: Local을 통해 각 Node에 속한 pod로 트래픽이 분산됨

3) Load Balancer (외부 시스템 노출용)

  • NodePort의 성격을 그대로 가지고 있고 추가적으로 Load Balancer가 생김 (트래픽 분산)

  • Load balancer에 접근하기 위한 외부 접속 ip주소는 별도로 할당하기 위한 플러그인 설치 필요
apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
  type: LoadBalancer
반응형

'Kubernetes' 카테고리의 다른 글

Node schedule  (0) 2024.08.04
Pod - Container  (0) 2024.08.04
Pod - Label  (0) 2024.08.04
반응형

본 글은 인프런 강의 "대세는 쿠버네티스 [초급~중급]" 를 듣고 요약 및 실습 정리한 내용입니다.

 

Node Schedule

  • pod는 결국 여러 node들 중 한 node에 올라가져야 함
  1. 직접선택
  • Node에 라벨을 달고 Pod를 만들때 노드를 지정

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
    nodeSelector:
    hostname: node1
  containers:
  - name: container
    image: tmkube/init

 

2. 쿠버네티스의 스케쥴러가 판단해서 자동 지정

  • memory나 cpu 자원을 보고 판단

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
spec:
  containers:
  - name: container
    image: tmkube/init
    resources:
      requests:
        memory: 2Gi # 필요한 memory 명시 가능
      limits: # 최대 허용
        memory: 3Gi 
  • memory : 초과시 Pod 종료 시킴
  • limits
    • memory: 초과시 pod 종료
    • cpu: Over시 종료되지 않고 requests에 명시된 수치까지 낮춤
반응형

'Kubernetes' 카테고리의 다른 글

Service - ClusterIP, NodePort, LoadBalancer  (0) 2024.10.13
Pod - Container  (0) 2024.08.04
Pod - Label  (0) 2024.08.04
반응형

본 글은 인프런 강의 "대세는 쿠버네티스 [초급~중급]" 를 듣고 요약 및 실습 정리한 내용입니다.

Pod

 
  • 파드 내에는 하나의 독립적인 서비스를 구성할 수 있는 여러개의 Container가 있을 수 있음

Container

  • 서비스가 연결될 수 있도록 포트를 가지고 있음
  • 한 컨테이너가 하나 이상의 포트를 가질 수는 있지만 파드 내에서 다른 컨테이너와 중복된 포트를 가질 수 는 없음

  • 두 container는 하나의 host로 묶여있어서 container들끼리 localhost로 접근 가능

  • pod가 생성될 떄 고유한 ip 주소가 할당되는데 재생성시 변경됨
  • 쿠버네티스 클러스터에서만 접근가능, 외부에서 접근 불가
  • 파드에 문제가 생기면 재생성되는데 ip가 변경됨

Pod 생성을 위한 yaml 파일 내용

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
    - name: container1
      image: tmkube/p8000
      ports:
      - containerPort: 8000 # container의 노출된 포트
    - name: container2
      image: tmkube/p8080
      ports:
      - containerPort: 8080

 

실습

  • dashboard에서 아래 yaml파일 통해 파드 생성
    • JSON로 변경하면 오른쪽과 같이 생성됨 (container2는 제외)
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container1
    image: tmkube/p8000
    ports:
    - containerPort: 8000 # container의 노출된 포트
  - name: container2
    image: tmkube/p8080
    ports:
    - containerPort: 8080
{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "pod-1"
  },
  "spec": {
    "containers": [
      {
        "name": "container1",
        "image": "tmkube/p8000",
        "ports": [
          {
            "containerPort": 8000
          }
        ]
      }
    ]
  }
}

  • IP를 확인할 수 있고 이는 쿠버네티스 클러스터 내에서만 접근 가능
  • master node에서 아래 명령어를 통해 pod 내의 container에 접근 가능
[root@k8s-master ~]# curl 20.109.131.1:8000
containerPort : 8000
[root@k8s-master ~]# curl 20.109.131.1:8080
containerPort : 8080

한 pod 내에 동일한 포트가 노출된 2개의 container를 띄우는 경우

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
spec:
  containers:
  - name: container1
    image: tmkube/p8000
    ports:
    - containerPort: 8000 # container의 노출된 포트
  - name: container2
    image: tmkube/p8000
    ports:
    - containerPort: 8000

  • Container2 내의 로그를 보면 Error: listen EADDRINUSE: address already in use :::8000 즉, 동일한 port가 이미 사용중이라는 에러가 발생했음

 

 
반응형

'Kubernetes' 카테고리의 다른 글

Service - ClusterIP, NodePort, LoadBalancer  (0) 2024.10.13
Node schedule  (0) 2024.08.04
Pod - Label  (0) 2024.08.04
반응형

본 글은 인프런 강의 "대세는 쿠버네티스 [초급~중급]" 를 듣고 요약 및 실습 정리한 내용입니다.

 

Label

  • Pod 뿐만 아니라 모든 object에 추가할 수 있음 (pod에 가장 많이 사용됨)
  • 목적에 따라 object를 분류하고 따로 연결하기 위해서임
  • 구성은 Key와 Value이고 한 pod에 여러개의 label을 달 수 있음

  • web, db, server type인 pod들이 dev, production에 있음
  • 웹 개발자가 웹화면만 보고 싶다면 type이 web이 pod만 Service에 연결
  • 상용 환경 운영자에게는 lo:production label이 붙은 아래 pod들을 Service에 연결하여 사용

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: tmkube/init

 

실습

아래에서 labels 의 type과 lo를 변경하여 6개의 pod를 띄움

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: tmkube/init

 

web을 위한 Service를 띄움

apiVersion: v1
kind: Service
metadata:
  name: svc-for-web
spec:
  selector:
    type: web
  ports:
    - port: 8080

 

서비스가 만들어짐

  • selector에 따라 label이 type: web인 pod들만 연결시켜줌

production을 위한 service를 띄우면 3개의 pod가 연결된걸 확인할 수 있음

apiVersion: v1
kind: Service
metadata:
  name: svc-for-production
spec:
  selector:
    lo: production
  ports:
    - port: 8080

반응형

'Kubernetes' 카테고리의 다른 글

Service - ClusterIP, NodePort, LoadBalancer  (0) 2024.10.13
Node schedule  (0) 2024.08.04
Pod - Container  (0) 2024.08.04

+ Recent posts