본문 바로가기
INFRA/DevOps

[K8S] Ingress

by BTC_민물공원 2023. 8. 19.

베하~! BTC_녹차공원 팀의 민물공원 입니다.

이번주는 Ingress에 대해 알아보겠습니다!

 

Ingress


일반적으로 네트워크에서는 Ingress와 Egress로 트래픽을 구분해요.

Ingress는 외부에서 내부 서버로 들어오는 네트워크 트래픽을,

Egress는 내부 서버에서 외부로 나가는 트래픽을 의미한답니다.

 

쿠버네티스에서도 Ingress라고 하는 리소스가 존재하는데요. 쿠버네티스의 Ingress는 외부에서 쿠버네티스 클러스터 내부로 들어오는 네트워크 트래픽을 어떻게 처리할지 정의한답니다.

쿠버네티스에서 실행중인 Deployment와 Service에 접근하기 위한 외부 요청을 처리하는 리소스들이 있는데요. NodePort, ExternalIP, Ingress 등이 있습니다.

NodePort와 ExternalIP의 경우, Layer 4 (TCP,UDP) 에서의 요청들을 처리하지만 Ingress는 Layer 7 (Application) 에서의 요청들을 처리할 수 있어요. 이렇기 때문에 Ingress는 로드 밸런싱, TLS/SSL 인증서 처리, HTTP 라우팅 등을 자세하게 정의할 수 있답니다.

 

Ingress Controller


쿠버네티스에서 Ingress를 사용하기 위해서는 두 가지가 필요해요. Yaml 파일로 정의되는 ingress, Ingress 규칙이 적용될 Ingress Controller예요.

Yaml 파일로 Ingress를 생성해도 아무 일이 일어나지 않는답니다. Ingress 규칙을 단순하게 선언했을 뿐 외부 요청을 받아들이는 실제 서버가 아니기 때문이예요. 이때, Ingress Controller라는 서버 컨테이너에 적용되어야만 외부로부터 네트워크 요청을 수신했을 때, Ingress 규칙에 기반해 이 요청을 어떻게 처리할지를 결정합니다.

 

 

Ingress 실습


이번 실습도 Killercoda 에서 따라해보아요.

https://killercoda.com/

 

Killercoda Interactive Environments

Learn DevOps Linux Kubernetes CKS CKA CKAD Git Cassandra etc | Katacoda compatible

killercoda.com

 

ing-internal 이라는 네임스페이스에 ping 이라는 ingress 설정을 해볼거예요.

5678 포트의 /hello 경로로 라우팅해볼 예정입니다.

 

먼저 환경구성을 해보아요.

ing-internal 네임스페이스를 생성합니다.

kubectl create ns ing-internal

 

Deployment와 SVC 를 생성합니다.

  • Deployment

k apply -f- <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: hello
  name: hello
  namespace: ing-internal
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: hello
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 5678
          name: http
          protocol: TCP
        resources: {}
status: {}
EOF
  • SVC

k apply -f- <<EOF
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: hello
  name: hello
  namespace: ing-internal
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
    name: hello
  selector:
    app: hello
  type: NodePort
status:
  loadBalancer: {}
EOF

 

ingress의 yaml 파일을 생성할거예요.

vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  namespace: ing-internal
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /hello
        pathType: Prefix
        backend:
          service:
            name: hello
            port:
              number: 5678
kubectl create -f ingress.yaml

 

이제 정상적으로 트래픽이 전송되는지 확인해보아요!

kubectl get pods -n ing-internal -o wide

kubectl get nodes -o wide

kubectl get svc hello -n ing-internal

 

curl -kL <INTERNAL_IP>/hello

Ingress 성공 !!

 

이렇게 오늘은 쿠버네티스의 Ingress 에 대해 알아보았는데요.

다음번에는 더 흥미로운 주제로 찾아뵙겠습니다.

 

이상 BTC_녹차공원 팀이였습니다!

베빠~!

 

'INFRA > DevOps' 카테고리의 다른 글

[DevOps]EC2 Ubuntu에 Jenkins 설치  (0) 2023.08.30
[K8S] NodeSelector  (0) 2023.08.29
[DevOps] CI/CD 개념 및 도구 설명  (0) 2023.08.18
[K8S] Service  (0) 2023.08.01
[K8S] NetworkPolicy  (0) 2023.08.01

댓글