[데보션영 K8s 스터디] Kubernetes 스케줄링과 Ingress Controller 실습

devyu·2024년 8월 26일

🛠️ K8s

목록 보기
3/4

1. Pending 상태 문제 해결하기

Kubernetes에서 Pod가 Pending 상태에 머무는 경우는 주로 스케줄링 문제 때문입니다. 이는 대개 다음과 같은 이유로 발생합니다:

  • affinity/selector 조건을 만족하는 노드가 없음
  • 리소스 부족

스케줄링 방법

  1. Node Selector: 간단하지만 제한적인 방법
  2. Node Affinity: 더 유연하고 세밀한 제어가 가능한 고급 방법 (내가 원하는 노드에 직접 지정)

실습: Node에 Label 추가하기

먼저 현재 노드의 라벨을 확인해봅시다:

kubectl get no --show-labels | grep nginx

nginx 라벨이 없다면, 다음 명령어로 추가할 수 있습니다:

kubectl label node yubinlabtop nginx=enabled

다음과 같이 nginx하는 레이블이 없음을 확인할 수 있습니다.

2. Service 설정 살펴보기

Service 설정

주의: 위 이미지에서 namespace 부분은 제거해야 합니다.

externalTrafficPolicy: Local

externalTrafficPolicyLocal로 설정된 경우의 의미에 대해 생각해봅시다. 이는 외부 트래픽이 노드 내부의 Pod로 직접 라우팅되도록 하는 설정입니다.

3. 서비스 접근 확인

설정한 IP 주소로 접근하면 nginx 페이지가 표시됩니다. 이는 노드를 통해 Kubernetes 네임스페이스로 접근하는 것으로, 사실상 포트 포워딩과 유사하게 작동합니다.

이 방식은 reverse proxy와 비슷하게 작동하며, 이는 ingress controller의 기본 개념입니다.

4. Ingress Controller 실습

Helm 설치하기

Ingress Controller를 설치하기 위해 먼저 Helm을 설치해야 합니다. 다음 명령어를 순서대로 실행하세요:

curl -fsSL -o helm.tar.gz https://get.helm.sh/helm-v3.15.4-linux-arm64.tar.gz
tar -zxvf helm.tar.gz
sudo mv linux-arm64/helm /usr/local/bin/helm
rm -rf linux-arm64 helm.tar.gz

Ingress Nginx 차트 설치

  1. Helm 저장소 추가 및 업데이트:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
  2. Ingress Nginx 차트 검색 및 다운로드:

    helm search repo ingress-nginx -l | head -n 5
    helm fetch ingress-nginx/ingress-nginx --version 4.11.2 --untar
  3. 패키지 생성 (선택사항):

    helm package ./ingress-nginx
  4. Ingress Controller 설치:

    helm upgrade --install ingress-nginx ingress-nginx \
      --repo https://kubernetes.github.io/ingress-nginx \
      --namespace ingress-nginx --create-namespace

    또는 특정 버전 설치:

    helm upgrade -i ingress-nginx --version 4.11.2 -n ingress-nginx

마무리

이렇게 Kubernetes의 스케줄링 문제를 해결하고, Ingress Controller를 설치하는 과정을 살펴보았습니다. Ingress Controller를 사용함으로써 외부에서 클러스터 내부의 서비스로 접근하는 라우팅을 효과적으로 관리할 수 있습니다.

Ingress는 단순히 트래픽을 라우팅하는 것뿐만 아니라, 설정 파일(YAML)을 읽어 Deployment를 생성하고 Pod를 만드는 등의 복잡한 작업도 수행합니다. 이를 통해 Kubernetes 클러스터의 네트워크 구성을 더욱 유연하고 강력하게 만들 수 있습니다.

메모

pending은 스케쥴링이 안될때 보통 발생한다.

로그 까봣을때
affinity/selectror -> 노드가 available 한게 없음.

스케쥴링 하는 방법 2가지
1. node selector -> 원시적인 방법
2. node affinity -> 내가 원하는 노드에 직접 지정 (1보다 복잡함)

kubectl get no --show-labels | grep nginx

해보니까 nginx하는 레이블이 없음을 확인할 수 있다.

kubectl label node yubinlabtop nginx=enabled


위에서 namespace 지워야 함.

externalTrafficPolicy가 local인 것은 ?! -> 생각해보기~


확인한 ip 대역 찔러보면 nginx가 뜨는 것.

node를 통해서 쿠버쪽 namespace를 들어가는 것이다 (= 사실상 포트포워딩이라고 생각해도 됨)

reverse proxy 와 비슷하게 작동함. = ingress controller

ingress controller 실습하기??
https://kubernetes.github.io/ingress-nginx/deploy/

helm 설치하기
https://helm.sh/docs/intro/install/
https://github.com/helm/helm/releases

curl -fsSL -o helm.tar.gz https://get.helm.sh/helm-v3.15.4-linux-arm64.tar.gz
tar -zxvf helm.tar.gz
sudo mv linux-arm64/helm /usr/local/bin/helm
rm -rf linux-arm64 helm.tar.gz
ls -l linux-arm64/
helm repo list
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo list
helm repo update
helm search list
helm search repo ingress-nginx -l | head -n 5
helm fetch ingress-nginx/ingress-nginx --version 4.11.2 --untar

패키지를 만들어서 올릴수도 있음.
helm package ./ingress-nginx



위 내용이 모두 설치되는 것.


위 내용을 기반으로 override가 가능하다.

helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace

있으면 upgrade, 없으면 install해라.
helm을 ingress-nginx 라는 이름으로 설치하고, ingress-nginx라는 차트를 가져라.
ingress-nginx라는 namespace. 해당 namespace 없으면 만들어라.

그리고 여기에 버전을 줄 수 있다.
helm upgrade -i ingress-nginx --version 4.11.2 -n

value 로 override 하는 것으로 helm chart...

도메인 호출해서 받아주는 것? nginx
K8s에서 ingress controller 라는 것을 사용하자. controller니까 어떤 yml 읽어서 deployment 해서 pod 를 만들어주는 기능도 함!!

ingress를 통해서 pod로 접근할 수 있음!

profile
티스토리와 벨로그 사이 줄타기....

0개의 댓글