Open muf opened 1 week ago
CRI-O는 Kubernetes와 컨테이너 오케스트레이션에서의 필요성을 충족시키기 위해 탄생했습니다. 그 배경에는 Kubernetes의 컨테이너 런타임에 대한 표준화와 간소화 요구가 있었으며, 이를 위해 CNCF(Cloud Native Computing Foundation)에서 2016년에 개발을 시작했습니다.
마지막 부분은 cluster domain인데 기본값이 cluster.local Service 도메인 :$serivce.$namespace.svc.cluster.local Pod 도메인: $pod-name.$namespace.svc.cluster.local
그러니까 노드 1에 pod 2개, 2에 4개, 3에 4개이면 로드 밸런서는 노드 밸런서는 노드1,2,3에 2:4:4 비율로 요청을 전달하고, 각 노드에서는 kube-proxy에 의해 pod으로 균등하게 나눠서 전달되는거지? > yes
clsuterIP 타입은 도저히 이해가 안감; > 이해됨 어라 생각했던거랑 약간 다르긴하네
Static Pod의 주요 특징은 다음과 같습니다:
Kubelet에 의해 관리: Static Pod는 각 노드의 Kubelet이 /etc/kubernetes/manifests 같은 특정 디렉토리에 있는 YAML 파일을 읽고 생성합니다.
Kubernetes API 서버와 무관하게 동작: API 서버가 다운되어도 Kubelet은 Static Pod를 계속 관리할 수 있습니다. 따라서 중요한 시스템 컴포넌트가 클러스터의 문제로 인해 중단되지 않도록 보장합니다.
API 서버에 의해 조회 가능: Static Pod는 직접 관리되지 않지만, Kubelet이 이 Pod 정보를 Kubernetes API 서버에 등록하여 kubectl get pods 명령으로 조회할 수는 있습니다.
자체적으로 유지 관리됨: Static Pod는 Kubelet이 실행되고 있는 한 계속 유지됩니다. 만약 Static Pod에 문제가 발생하면, Kubelet이 다시 시작하거나 재생성하여 항상 실행 상태를 유지합니다.
이를 통해 Static Pod는 클러스터 관리와 안정성에 중요한 역할을 하며, 특히 마스터 노드의 구성 요소로 자주 사용됩니다.
이해된듯
externalTrafficPolicy 가 local이면 그렇게 동작하나, cluster 이면 클러스터 전반에 걸쳐서 RR 등을 통해 결정한다 local로 처리하면 전체적으로 골고루 분산되지 않는다
ELB, ingress gateway도 유사하겠는데? (gateway는 클러스터 별 게이트웨이)
아니지, 어제 이해한게 맞는것 같다 kube-proxy로 들어오면, 모든 pod의 정보를 알아서, 이 pod에 균등하게 분배한다. 가 맞음 다만 여전히 A, B, C 노드에서 pod 5개 요청을 보내야하는데 A 5, B 3, C 2 번씩 요청이 들어왔고 pod1 ~ 5 순서대로 배분하면 pod1 ~ 5는 각각 3, 3, 2, 1, 1 번의 요청을 받는게 맞다클러스터 차원에서의 균등 분산은 클라우드 로드 밸런서가 각 노드에 균등하게 트래픽을 분산해 주는지에 따라 달라질 수 있습니다.
[x] 그럼 분산해주거나 weight 주는건 어떻게 구현되는거지? 이해 완료
멀티 클러스터 환경에서만 가능하다 헬스 체크 자체는 각 pod 별로 probe 설정이 있으니, pod 에 대한 헬스 체크를 외적 요소가 할 필요는 없는거고, Node가 죽어도 보장해주니까 cm이 결국 네트워크 자체가 죽어서 컨트롤 플레인과 소통이 안되는 경우가 문제인데 우리는 이걸 IDC 단위로 클러스터를 잡고 있으니 IDC가 여러개로 이중화되면 멀티 클러스터 환경이 된다 멀티 클러스터 환경이라는건 로드 밸런서에 노드IP:NodePort 자체가 클러스터 별로 존재하는 것이니 외부 로드 밸런서에서 어떤 클러스터로 쏠지를 weight를 주어서 조절 할 수도 있고 여기서 health check 하면서 문제 생긴 클러스터에는 잠시 쏘지 않는다거나, 하는게 가능하다
ELB > ingress gateway로의 전달은 아마도 로컬리티 라우팅이 없지 않을까 싶은데
아무래도 포트가 제한적이라 그럴 수도 있을 것 같다
istio는 ingress 기반이라, 이 상황에서의 로드밸런ㄷ스 - 서비스 요거는 구조를 따로 학습해야겠다
ingress ?
- 초기에 등장하였으나, LoadBalancer, NodePort 만으로는 한계가 있었음
- 이전에는 특정 노드가 수신하고, kube-proxy가 다시 전달해주었음 각 서비스가 외부에 노출되고 설정이 복잡해지고 관리 부담이 커짐
- ingress controller가 있으면 모든 요청을 여기서 받고, 내부적으로 라우팅해줌 내부에서 관리할 수 있음 (중앙화된 트래픽 관리) 서비스별로 세부적인 라우팅 관리도 가능 (유연한 라우팅 규칙 & 보안 강화)
NGINX ingress Controller 설치
replica N nginx 컨테이너
외부에서 접근 가능하게 하려면 (LoadBalancer or NodePort 타입)
rule 규칙 - backend 매핑
"
backend 매핑 ex_ service.name = web-app (port 80)
LB 타입인 경우 LB > 임의의 노드의 NodePort 로 유입 (보통 NodePort(30080, 30443 등)를 사용) 80, 443으로 들어온건 모두 ingress controler pod으로 전달 ingress controller에 라우팅 규칙에 맞는 서비스로 전달
Envoy ingress Controller 설치
istio
일반적으로 ingress controller 쓰지 X
- istio ingress Gateway를 대신 사용
설치
Istioctl 설치
kubectl 사용 가능한 아무 노드에서나 실행
Istio의 Control Plane 구성 요소를 클러스터에 설치
istiod, Ingress Gateway, Egress Gateway (optional)
istio-system 네임스페이스에 ingress gateway Pod이 뜬다 (보통 Deployment)
Service도 추가됨 (LoadBalancer나 NodePort 타입)
ingress controller랑 동일하게 istio ingress gateway 까지 들어오는 것으로 이해함
여러개의 ingress gateway를 구성하기도 한다
근데 왜 ingress controller 구현체가 아니라 아예 새롭게 만든거지? (뭔가 한계가 있기 때문이겠지? 어쨌든 정해진 인터페이스 내에서 만들어야 하니까)
istio-injection 레이블을 전체에 적용
kubectl label namespace <네임스페이스명> istio-injection=enabled envoy 사이드카 추가
Gateway, VirtualService 등 리소스 apply
ingress Gateway는 외부 노출 IP로도 접근이 가능하다?
외부 LB
도메인:80 or 443 - Gateway (IP:NodePort) 분명 path 기반은 아닌것 같은데 ELB 설정에 path가 있는 걸 보면, 왜이지..?
health check 등
- "결국 전달하는건 모두 같은 게이트웨이들" (이게 맞는지 확인하는게 중요함)
Gateway
"서비스"별로 생기는지 "클러스터"마다 생기는지 모르겠 > 클러스터마다. 가 맞는 것 같음 일단
- "클러스터 마다 생기는 것으로 일단 이해"
- 그러니까 실제로 Service 1,2,3,4 로의 모든 요청이 일단 하나의 게이트웨이로 들어온다
- 문제는 그 클러스터에 해당 서비스가 없을 수도 있다 일단 클러스터에 서비스가 하나라도 있으면 클러스터 게이트웨이가 생기니, 공용으로 써야 해서 모든 요청을 모두 나눠 받기는 한다 그래서 만약 앱이 없으면 옆 클러스터로 다시 보내줘야 한다 (여기서 외부 요소를 리소스로 등록해서 연결 가능하다. 로 이해) "정확하게 어떻게 흘러가는지는 좀 더 봐야함"
- ::gateway 설정으로 가서 backend에 클러스터를 추가하면
- 해당 클러스터에 Gateway가 없으면 일단 Gateway 추가
- 해당 gateway에 연결되는 VirtualService 등록 (아마 Resource 까지 등록해야 온전하게 등록될 것)
- health check
- 아.. LB에서 게이트웨이로 보낼때 후보가 여러 클러스터니까, 특정 클러스터 응답이 이상하면 특정 클러스터 게이트웨이를 제외하고 전송
- path 별로 나뉘어져 있기 때문에, 각 path 별로 헬스 체크에 의한 제외 정책이 적용됨
- ELB가 하는게 맞음
근데 왜 게이트웨이의 주소가 있지? 그건 좀 다른 게이트웨이인듯 (ELB의 분산된 게이트웨이) ELB 내에서도 N개의 게이트웨이로 나눠서 라우팅을 수행하는 것으로 이해 (확장 가능한 구조)
클러스터들이 서로 직접 네트워크 레벨에서 연결되지 않은 경우, Istio는 East-West Gateway를 사용하여 트래픽을 다른 클러스터로 라우팅합니다.
근데 East-West Gateway 방식은 아닐것 같은데. (맞나?) 아닐듯
ServiceEntry, ServiceExport, ServiceImport ...
멀티 네트워크 연결을 통한 서비스 디스커버리 (Primary-Primary 또는 Primary-Remote 방식):
각 클러스터에 네트워크 레벨에서 연결을 설정하여, Istio가 서로 다른 클러스터에 있는 서비스도 자동으로 디스커버리하고 트래픽을 라우팅할 수 있도록 구성합니다. 이 설정에서는 Istio가 여러 클러스터에 존재하는 동일한 이름의 서비스를 디스커버리하여, 한 클러스터에 서비스가 없을 때 다른 클러스터로 트래픽을 라우팅할 수 있습니다. 이를 위해서는 모든 클러스터에 East-West Gateway를 구성하여, 클러스터 간 트래픽이 내부적으로 전달될 수 있도록 해야 합니다. East-West Gateway를 통한 트래픽 라우팅:
클러스터 간 네트워크가 분리된 환경이라면, 각 클러스터에 East-West Gateway를 배포하여 다른 클러스터의 서비스를 프록시하는 방식으로 접근할 수 있습니다. 예를 들어, 한 클러스터에 해당 서비스가 없으면 East-West Gateway를 통해 다른 클러스터로 트래픽을 전달할 수 있습니다. 이때는 VirtualService와 DestinationRule을 사용하여, 특정 서비스가 없는 경우 다른 클러스터의 East-West Gateway로 트래픽을 라우팅하도록 설정할 수 있습니다.
VirtualService를 통해
세팅 과정을 통해 알아보는 k8s A-Z
kubectl을 통해 kube API와 통신하여 여러가지 리소스를 등록해보자 ("apply")
추가 궁금증
ReplicaSet ? Deployment ? 정확하게 차이점 이해 못함
"주의할 점은, k8s는 단일 pod의 재생성을 보장하지 않는다 > 맞는지 잘 모르겠다. 뭔가 LLM을 믿어도 되는지 혼선이 조금 있는 정보로 보인다"
하나의 마스터 노드에 컨트롤 플레인 요소 apiserver, etcd, cm, sched 등을 한 노드에 모두 설치했는데, 이것들도 각각 하나의 노드에 전용으로 설치해도 되는건가?
request, limit 지정해도 약간 컨테이너 메모리는 10% 수준에서 쓰는 만큼 늘려가며 쓴다고 알고 있었는데 맞나?
Pod 스케쥴링