참고
Pod들을 통해 실행되고 있는 어플리케이션을 네트워크에 노출(expose) 시키는 가상의 컴포넌트
서비스는 Pod가 외부와 통신 가능하도록 클러스터 내부에서 고정적인 IP를 갖도록 하는 역할
서비스는 Deployment나 Stateful set과 같은 어플리케이션을 구동하도록 구성된 여러 Pod들에게 단일 네트워크 진입점 부여 역할
서비스 정의하고 생성할 때는 sepc.ports 속성 아래에 연결하고자 하는 항목별로 2개씩의 포트 지정
도커는 브리지 타입의 네트워크 구조
네트워크 인터페이스 (쿠버네티스 또는 CNI)를 통하여 Pod에 할당되어 있는 고유 IP로 통신
오버레이 네트워크 기능을 구현하기 위해 CNI를 설치하고 라우터를 경유하여 통신
Pod0 -> veth0 -> CNI -> eth0 -> 라우터 (VPC) -> eth1 -> CNI -> veth1 -> Pod1
Pod들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상 클러스터 전용 IP,
클러스터 내부에서만 접근 가능
apiVersion: v1
kind: Service
metadata:
name: my-internal-service
spec:
selector: # 서비스가 적용될 Pod 정보
app: my-app
type: ClusterIP # 생략 가능
ports:
- name: http
port: 80 # 서비스를 노출하는 포트
targetPort: 80 # Pod (어플리케이션)을 노출하는 포트
protocol: TCP
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: v1
kind: Endpoints
metadata:
name: myapp-service # 연결할 서비스와 동일한 name을 메타데이터로 입력
subsets: # 해당 서비스로 가리킬 endpoint를 명시
- addresses:
- ip: 192.0.2.42
ports:
- port: 9376
외부에서 노드 IP의 특정 포트( <노드 IP>:<노드 포트> )로 들어오는 요청을 감지하여 해당 포트와 연결된 Pod로 트래픽 전달
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
type: NodePort
ports:
- name: http
port: 80 # Service에 노출되는 Port
targetPort: 80 # Pod(애플리케이션)을 노출하는 Port
nodePort: 30036 # 외부 사용자가 애플리케이션에 접근하기 위한 Port
protocol: TCP
별도 외부 LoadBalancer를 제공하는 클라우드 (AWS, GCP, Azure 등) 환경을 고려하여 해당 로드밸런서를 클러스터의 서비스로 프로비저닝할 대 사용
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80 # 서비스를 노출하는 포트
targetPort: 80 # 애플리케이션(파드)를 노출하는 포트
clusterIP: 10.0.171.239 # 클러스터 IP
selector:
app: myapp
type: frontend
status:
loadBalancer: # 프로비저닝된 로드 밸런서 정보
ingress:
- ip: 192.0.2.127
서비스에 selector 대신 name 직접 명시할 때 사용
apiVersion: v1
kind: Service
metadata:
name: myapp-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
kubectl expose pod redis --port=6379 --name redis-service
https://kubernetes.io/ko/docs/tutorials/stateless-application/expose-external-ip-address/
서비스 오브젝트를 외부에서 클러스터 내로 진입할 때 항상 포트 번호를 지정해야 함
쿠버네티스 클러스터 외부에서 내부로 들어오는 트래픽에 대해 어떻게 처리할지 정의하는 규칙
YAML 파일을 통해 ingress (inbound) 규칙 정의
Ingress object를 생성하더라도 실질적인 동작 X
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
- host: mydomain.com
http:
paths:
- path: /bar/*
backend:
serviceName: bar
servicePort: 8080
Ingress에 의해 정해진 규칙에 따라 실제 외부 요청을 실질적으로 처리하는 특수 서버 컨테이너
https://guide.ncloud-docs.com/docs/k8s-k8sexamples-ingress
직접 쿠버네티스의 control plane과 node 구성 X, AWS 환경에서 쿠버네티스 클러스터 구성 가능한 완전 관리형 서비스
여러 AWS 가용 영역에 걸쳐 쿠버네티스 control plane 실행 및 크기 조정으로 높은 가용성 보장
하중에 따라 제어 영역 인스턴스 크기 자동 조정 및 비정상 제어 영역 인스턴스 감지/교체 및 자동화된 버전 업데이트 및 패치 제공
여러 AWS 서비스와 통합되어 다음 어플리케이션(및 그 외)에 대한 확장성 & 보안 제공
eksctl : Amazon EKS 클러스터 구성을 위한 CLI 명령
설치 과정 참조
eksctl 명령으로 EKS를 이용한 클러스터 구성
eksctl create cluster \
--name k8s-demo \
--region ap-northeast-2 \
--with-oidc \
--ssh-access \
--ssh-public-key [awskey 이름] \
--nodes 3 \
--node-type t3.medium \
--node-volume-size=20 \
--managed