[K8s] Kubernetes Ingress 및 Helm

2024. 11. 5. 10:49· Cloud/Kubernetes
목차
  1. 📌 인그레스 Ingress 
  2. 📌 헬름 Helm 
  3. 📌 실습 

 

본 글은 한 권으로 배우는 도커&쿠버네티스 책에 대한 정리와 실습 내용입니다.

 

📌 인그레스 Ingress 

클러스터 외부에서 내부에 존재하는 서비스에 접근하기 위해 HTTP(S) 활용한 라우팅 규칙 제공하는 오브젝트

→ 여러 서비스를 다수의 LoadBalancer 없이도 외부에 노출

 

 

 

📌 헬름 Helm 

배포를 위해 필요한 파일들을 하나의 패키지 형태로 관리

yaml 파일 만들지 않고도 쿠버네티스 환경에서 애플리케이션을 쉽고 편하게 설치 가능

 

https://helm.sh/docs/intro/install/

 

Installing Helm

Learn how to install and get running with Helm.

helm.sh

# 마스터 노드에만 설치

cd ~/work/app/helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

helm version

helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo update
helm repo list
## NAME   	URL
## bitnami	https://charts.bitnami.com/bitnami

 

 

📌 실습 

Ingress와 Helm을 통해 두개의 서비스 배포하는 실습 진행!!

 

  • 헬름 활용한 nginx ingress controller 설치
    • nginx ingress controller: 트래픽 관리할 수 있도록 도와주는 애플리케이션
# 마스터 노드에만 설치

cd ~/work/app/nginx-ingress-controller

helm search repo nginx
## nginx 포함하는 헬름차트 볼 수 있음
helm pull bitnami/nginx-ingress-controller

tar xvfz nginx-ingress-controller-11.5.1.tgz # 압축 풀기
ls
## nginx-ingress-controller  nginx-ingress-controller-11.5.1.tgz

mv nginx-ingress-controller nginx-ingress-controller-11.5.1

cd nginx-ingress-controller-11.5.1
cp values.yaml my-values.yaml # 설정 변경을 원하는 경우, my-values.yaml에서 변경


k create namespace mynginx # 각 애플리케이션 용도에 맞춰 전용 네임스페이스를 통해 관리
helm install --namespace mynginx --generate-name bitnami/nginx-ingress-controller -f my-values.yaml
helm --namespace mynginx ls
k get all --namespace mynginx
## service LoadBalancer 타입이 Pending 상태
## EXTERNAL-IP 할당을 위해 추후 metallb 설치

 

  • metalLB을 통한 베어메탈 LoadBalancer 구성
    • https://pyrasis.com/jHLsAlwaysUpToDateKubernetes/Unit06/05
    • 자체 LB를 생성하여 자동으로 nginx-ingress-controller에 IP 부여할 수 있도록
    • configmap: 설정을 키-값 형태로 저장하는데 사용하는 API 오브젝트
k get configmap kube-proxy -n kube-system -o yaml | grep strictARP # kube-proxy의 strictARP 확인
## strictARP: false -> true로 바꿔줘야함
kubectl get configmap kube-proxy -n kube-system -o yaml | sed -e "s/strictARP: false/strictARP: true/" | kubectl apply -f - -n kube-system

helm repo add metallb https://metallb.github.io/metallb
helm repo update
helm search repo metallb

helm pull metallb/metallb
tar xvfz metallb-0.14.8.tgz

mv metallb metallb-0.14.8
cd metallb-0.14.8
cp values.yaml my-values.yaml

k create namespace mymetallb

helm install --namespace mymetallb --generate-name metallb/metallb -f my-values.yaml
## Now you can configure it via its CRs. Please refer to the metallb official docs
## on how to use the CRs.
# -> CRs를 통해 설정 가능; metallb가 관리할 IP 주소 범위 설정

k get all --namespace mymetallb
# speaker와 controller가 정상적으로 작동중. running
# service의 EXTERNAL-IP가 none인 것은 정상 -> 클러스터 내부에서만 사용하기 때문

k get configmap --namespace mymetallb # metallb 추가된 것 확인
# ~/work/app/metallb/metallb-0.14.8/my-config.yaml

---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: my-metallb-config
  namespace: mymetallb
spec:
  addresses:
    - 192.168.64.100-192.168.64.200 # k8s 클러스터 IP 범위 포함 X
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: my-metallb-config
  namespace: mymetallb
spec:
  ipAddressPools:
    - my-metallb-config
k apply -f my-config.yaml
## ipaddresspool.metallb.io/my-metallb-config created
## l2advertisement.metallb.io/my-metallb-config created

k get ipaddresspool.metallb.io --namespace mymetallb

k describe ipaddresspool.metallb.io my-metallb-config --namespace mymetallb
# IP 주소 범위 설정된 것 확인

k get all --namespace mynginx
# 서비스에서 ingress-controller의 EXTERNAL-IP가 설정된 것 확인

k describe service/nginx-ingress-controller-1730253917 --namespace mynginx
## Events:
##  Type    Reason        Age    From                Message
##  ----    ------        ----   ----                -------
##  Normal  IPAllocated   6m36s  metallb-controller  Assigned IP ["192.168.64.100"]
# metallb를 통해 IP 주소 할당 받은것 확인

# 80포트 열어주기

 

  • 인그레스로 두개의 서비스 배포

# ~/work/ch09/ex13/ingress01-deploy.yml
                                                                        
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-deploy-test01
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: web-deploy01
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web-deploy01
    spec:
      containers:
        - name: nginx
          image: nginx:latest
# ~/work/ch09/ex13/ingress01-service.yml

apiVersion: v1
kind: Service
metadata:
  name: ingress-service-test01
spec:
  selector:
    app.kubernetes.io/name: web-deploy01
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
# ~/work/ch09/ex14/ingress02-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-deploy-test02
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: web-deploy02
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web-deploy02
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
# ~/work/ch09/ex14/ingress02-service.yml

apiVersion: v1
kind: Service
metadata:
  name: ingress-service-test02
spec:
  selector:
    app.kubernetes.io/name: web-deploy02
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
# ~/work/ch09/ex14/ingress02-ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-test02
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
          - path: /test01
            pathType: Prefix
            backend:
              service:
                name: ingress-service-test01
                port:
                  number: 80
          - path: /test02 # 추가
            pathType: Prefix
            backend:
              service:
                name: ingress-service-test02
                port:
                  number: 80
k apply -f ingress01-deploy.yml
k apply -f ingress01-service.yml
k apply -f ingress02-deploy.yml
k apply -f ingress02-service.yml

k get all 

k apply -f ingress02-ingress.yml

k port-forward -n mynginx service/nginx-ingress-controller-1730253917 2000:80 --address 0.0.0.0
# 호스트 머신

curl http://192.168.64.100/test01 # ingress-controller의 외부IP에 직접 접근
curl http://192.168.64.100/test02

curl http://192.168.64.8:2000/test01 # 포트포워딩
curl http://192.168.64.8:2000/test02

 

트러블 슈팅

k port-forward 2000:80로 해도 2000 → 8080

k get service -n mynginx nginx-ingress-controller-1730253917 -o yaml
spec:
  ports:
    - name: http
      nodePort: 31503
      port: 80
      protocol: TCP
      targetPort: http

⇒ 서비스의 80 포트는 실제로 컨테이너의 8080 포트로 트래픽을 전달

  • 컨테이너 포트 확인
k get deployment -n mynginx -l app.kubernetes.io/name=nginx-ingress-controller -o yaml
          ports:
          - containerPort: 80
            name: http
            protocol: TCP
  • Helm 차트의 values.yaml 수정 → my-values.yaml로
    • controller.service.ports.http.targetPort 값을 80으로 변경
  • Helm 차트 업데이트
helm list --namespace mynginx # release-name 확인
helm upgrade <release-name> bitnami/nginx-ingress-controller -n mynginx -f my-values.yaml
  • kubectl port-forward → 서비스 포트(port)는 타겟 포트(targetPort)로 트래픽을 전달

 

 

저작자표시 비영리 변경금지 (새창열림)

'Cloud > Kubernetes' 카테고리의 다른 글

[K8s] Kubernetes 활용한 웹 서비스 배포  (0) 2024.11.05
[K8s] Kubernetes Service  (1) 2024.11.05
[K8s] kubectl과 Workload  (0) 2024.10.25
[K8s] K8s 구조 및 실습 환경 구축  (0) 2024.10.01
  1. 📌 인그레스 Ingress 
  2. 📌 헬름 Helm 
  3. 📌 실습 
'Cloud/Kubernetes' 카테고리의 다른 글
  • [K8s] Kubernetes 활용한 웹 서비스 배포
  • [K8s] Kubernetes Service
  • [K8s] kubectl과 Workload
  • [K8s] K8s 구조 및 실습 환경 구축
혬수
혬수
혬수
수리수리 마수리
혬수
전체
오늘
어제

블로그 메뉴

  • 🏡 Home
  • 🏷️ Tag
  • Github
  • 분류 전체보기 (48)
    • Language (5)
      • JavaScript (5)
      • TypeScript (0)
    • Framework (16)
      • React (1)
      • React Native (15)
    • Testing (2)
      • Jest (0)
      • Postman (1)
    • DevOps (7)
    • Cloud (8)
      • Kubernetes (5)
      • AWS (3)
    • KakaoTech_Bootcamp (4)
      • Weekly Scrum (3)
      • 회고 (1)
    • Etc (5)
      • Git (1)
      • MacOS (4)

인기 글

hELLO · Designed By 정상우.v4.2.2
혬수
[K8s] Kubernetes Ingress 및 Helm
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.