Kubernetes

23.9.4(월) 쿠버네티스 7일차

사실 나도 모름 2023. 9. 4. 18:04

https://kubernetes.io/ko/docs/concepts/services-networking/ingress/

 

인그레스(Ingress)

URI, 호스트네임, 경로 등과 같은 웹 개념을 이해하는 프로토콜-인지형(protocol-aware configuration) 설정 메커니즘을 이용하여 HTTP (혹은 HTTPS) 네트워크 서비스를 사용 가능하게 한다. 인그레스 개념은

kubernetes.io

ingress : 외부에서 내부로 접근하기 위한 API 오브젝트

 

클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함.

인그레스는 부하 분산, SSL 종료, 명칭 기반의 가상 호스팅을 제공할 수 있다.

 

ingress 오브젝트를 사용하기 위해서 반드시 인그레스 컨트롤러가 있어야 한다.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

위 yaml코드를 해석하자면 /testpath로 접근하는 http 요청이 들어왔을 때 80번 포트로 서비스하라는 의미다.

 

 

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

 

Installation Guide - Ingress-Nginx Controller

Installation Guide There are multiple ways to install the Ingress-Nginx Controller: with Helm, using the project repository chart; with kubectl apply, using YAML manifests; with specific addons (e.g. for minikube or MicroK8s). On most Kubernetes clusters,

kubernetes.github.io

위 사이트에 들어가서 인그레스 컨트롤러 설치과정을 따른다.

 

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/baremetal/deploy.yaml

위와 같이 deploy.yaml파일 수정

kubectl apply -f deploy.yaml로 파일을 적용한 후 아래와 같은 코드를 입력하여 어떤 결과가 나오는지 테스트해본다.

 

ingress-pod-service.yaml

cat << EOF > ingress-pod-service.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-shopping
  labels:
    category: shopping
spec:
  containers:
  - name: container
    image: kubetm/shopping
---
apiVersion: v1
kind: Service
metadata:
  name: svc-shopping
spec:
  selector:
    category: shopping
  ports:
  - port: 8080
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-customer
  labels:
    category: customer
spec:
  containers:
  - name: container
    image: kubetm/customer
---
apiVersion: v1
kind: Service
metadata:
  name: svc-customer
spec:
  selector:
    category: customer
  ports:
  - port: 8080
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-order
  labels:
    category: order
spec:
  containers:
  - name: container
    image: kubetm/order
---
apiVersion: v1
kind: Service
metadata:
  name: svc-order
spec:
  selector:
    category: order
  ports:
  - port: 8080
EOF

위 코드로 서비스를 각각 생성하여 서비스의 이름으로 라우팅하도록 구현할 수 있다.

 

ingress-ingress.yaml

cat << EOF > ingress-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: service-lb
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: / #이 경로의 요청을 backend service로 전달
        pathType: Prefix
        backend:
          service:
            name: svc-shopping
            port:
              number: 8080
      - path: /customer
        pathType: Prefix
        backend:
          service:
            name: svc-customer
            port:
              number: 8080
      - path: /order
        pathType: Prefix
        backend:
          service:
            name: svc-order
            port:
              number: 8080
EOF

svc-shopping, svc-customer, svc-order 서비스로 각각 접근하게 되었을 때 어떤 포트로 연결해줄 것인지 명시한 yaml파일

 

위 yaml파일을 적용할 때 반드시 어떤 네임스페이스에 적용할 것인지도 명시해줘야 한다.

 

컨트롤러가 제대로 올라왔는지 확인

 

라우팅을 해놓았기 때문에 어디서 요청을 하든 같은 화면이 표시

 


스스로 해보기 실습

image: nginx:latest Service port: 80 / 으로 접속 시 Welcome to Main Page 표시 /shopping 으로 접속 시 Welcome to Shopping Center /order 로 접속 시 Welcome to order page /customer 로 접속 시 Welcome to customer page


cat << EOF > ingress-pod-service-lb.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-main
  labels:
    category: mainurl
spec:
  containers:
  - name: container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: svc-mainurl
spec:
  selector:
    category: mainurl
  ports:
  - port: 80
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-shopping
  labels:
    category: shopping
spec:
  containers:
  - name: container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: svc-shopping
spec:
  selector:
    category: shopping
  ports:
  - port: 80
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-customer
  labels:
    category: customer
spec:
  containers:
  - name: container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: svc-customer
spec:
  selector:
    category: customer
  ports:
  - port: 80
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-order
  labels:
    category: order
spec:
  containers:
  - name: container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: svc-order
spec:
  selector:
    category: order
  ports:
  - port: 80
EOF

#----------------------------------------------------------------
kubectl apply -f ingress-pod-service-lb.yaml -n ingress-nginx

여러 파드와 서비스를 정의

※ '---'는 리소스 구분자로 하나의 yaml 파일에 다양한 오브젝트 리소스를 정의할 수 있게 해준다. 

 

cat << EOF > ingress-ingress-lb.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: service-lb
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-mainurl
            port:
              number: 80
      - path: /shopping
        pathType: Prefix
        backend:
          service:
            name: svc-shopping
            port:
              number: 80
      - path: /customer
        pathType: Prefix
        backend:
          service:
            name: svc-customer
            port:
              number: 80
      - path: /order
        pathType: Prefix
        backend:
          service:
            name: svc-order
            port:
              number: 80
EOF

#----------------------------------------------------------
kubectl apply -f ingress-ingress-lb.yaml -n ingress-nginx

k exec -it pod-main -n ingress-nginx -- /bin/bash
apt update
apt install -y vim
vi /usr/share/nginx/html/index.html
# 원하는대로 수정

k exec -it pod-shopping -n ingress-nginx -- /bin/bash
apt update
apt install -y vim
vi /usr/share/nginx/html/shopping/index.html
# 원하는대로 수정

k exec -it pod-order -n ingress-nginx -- /bin/bash
apt update
apt install -y vim
vi /usr/share/nginx/html/order/index.html
# 원하는대로 수정

k exec -it pod-customer -n ingress-nginx -- /bin/bash
apt update
apt install -y vim
vi /usr/share/nginx/html/customer/index.html
# 원하는대로 수정

'Kubernetes' 카테고리의 다른 글

23.9.7(목) 쿠버네티스 9일차  (0) 2023.09.07
23.9.6(수) 쿠버네티스 8일차  (0) 2023.09.06
23.9.1(금) 쿠버네티스 6일차  (0) 2023.09.01
23.8.25(금) 쿠버네티스 1일차  (0) 2023.09.01
23.8.28(월) 쿠버네티스 2일차  (0) 2023.09.01