Cilium을 사용하는 경우, Orbstack과 함께 하면 LoadBalancer(LB)가 자동으로 생성되는 편리함이 있습니다. 별도의 설정이 필요 없다는 점이 좋긴 하지만, 여러 개의 LB를 생성해서 테스트할 때는 불편할 수 있습니다. 그래서 이번 기회에 Kind로 클러스터를 생성하고 테스트하는 방법을 정리하려고 합니다. Cilium은 공식적으로 Kind에 설치하는 방법을 제공하고 있지만, 기능이 워낙 다양하다 보니 기본 설정 외에는 구체적인 가이드를 찾기 어렵습니다.
공식문서를 참고해서 클러스터를 생성해보고 싶다면 아래의 링크를 참고하면 됩니다.
https://docs.cilium.io/en/stable/installation/kind/
테스트 환경 구성 목표
기본적으로 IPAM을 통해 대역을 설정하면 LoadBalancer는 정상적으로 생성되긴 하지만, 이 설정으로는 클러스터 내부에서만 동작합니다. 이번 글의 목표는 다양한 환경에서 외부에서도 접근 가능한 LoadBalancer를 테스트할 수 있는 구성을 만드는 것입니다.
클러스터 생성하기
이제 클러스터를 생성해 보겠습니다. Cilium을 CNI로 사용할 것이며, kube-proxy 없이 구성할 예정입니다. 아래와 같이 설정 파일을 작성합니다
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
networking:
disableDefaultCNI: true
kubeProxyMode: "none"
Cilium 설치 및 설정
Cilium 설치
다음의 명령어를 통해 cilium을 설치하도록 합니다.
export KUBE_API_SERVER_IP=$( kubectl get nodes -l node-role.kubernetes.io/control-plane -o yaml | yq '.items[0].status.addresses[] | select(.type=="InternalIP").address' );
export KUBE_API_SERVER_PORT=6443;
# cni 설치
cilium install --version 1.16.2 \
--set kubeProxyReplacement=true \
--set hubble.enabled=true \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true \
--set l2announcements.enabled=true \
--set k8sServiceHost=${KUBE_API_SERVER_IP} \
--set k8sServicePort=${KUBE_API_SERVER_PORT} \
--set externalIPs.enabled=true
각 설정에 대한 세부적인 설명입니다.
Hubble 사용을 위한 옵션
- --set hubble.enabled=true:
Cilium의 네트워크 모니터링 및 추적 시스템인 Hubble을 활성화합니다. Hubble은 네트워크 상에서 발생하는 이벤트를 실시간으로 볼 수 있는 도구입니다. - --set hubble.relay.enabled=true:
Hubble Relay를 활성화하여 Hubble 데이터를 중앙집중화해서 여러 노드에서 수집한 정보를 통합하여 볼 수 있게 합니다. - --set hubble.ui.enabled=true:
Hubble의 사용자 인터페이스(UI)를 활성화합니다. 이 UI는 웹 기반의 대시보드로, 네트워크 트래픽 및 이벤트를 시각적으로 확인할 수 있습니다.
(✰) LoadBalancer 사용을 위한 설정
L2 Announcements 관련 설정
BGP를 사용할 수 없는 환경이기 때문에 L2Announcements 기능을 활성화 할 예정입니다.
- --set l2announcements.enabled=true:
L2 네트워크 레벨에서 ARP(주소 해결 프로토콜) 및 NDP(이웃 탐지 프로토콜) 발표 기능을 활성화합니다. 이 설정은 Cilium이 특정 네트워크 설정에서 외부 네트워크 장치와의 통신을 처리할 수 있도록 합니다. - --set kubeProxyReplacement=true:
Kubernetes의 기본 kube-proxy 대신 Cilium이 L3/L4 레이어에서 직접 네트워크 트래픽을 처리하도록 합니다. - --set k8sServiceHost=${KUBE_API_SERVER_IP}:
Kubernetes API 서버의 호스트 IP를 지정합니다. Cilium이 Kubernetes API에 접근하여 상태를 모니터링하고 설정을 조정할 수 있도록 필요한 설정입니다. - --set k8sServicePort=${KUBE_API_SERVER_PORT}:
Kubernetes API 서버가 수신하는 포트를 지정합니다. 기본적으로 6443 포트를 사용합니다.
IPAM 관련 설정
- --set externalIPs.enabled=true:
Kubernetes 외부에서 접근 가능한 IP 주소(external IPs)를 활성화합니다. 이 설정은 외부 클라이언트가 클러스터 내부 서비스에 접근할 수 있도록 설정할 때 사용됩니다. LoadBalancer나 서비스에 외부 IP를 할당해 접근할 수 있도록 할 때 필요합니다.
L2AnnoucementPolicy 설정하기
추가 설정으로 노드나 서비스등도 설정가능하지만 그냥 전체 다 되도록 설정하겠습니다.
apiVersion: "cilium.io/v2alpha1"
kind: CiliumL2AnnouncementPolicy
metadata:
name: default
spec:
externalIPs: true
loadBalancerIPs: true
IPAM 등록하기
특별한 설정을 하지 않으면 기본적으로 Kind는 자체 네트워크 대역을 사용합니다. Kind가 사용하는 네트워크 대역을 확인하려면 다음 명령어를 실행합니다.
docker network inspect kind | jq '.[].IPAM.Config'
이 네트워크 대역 중 일부를 할당하여 IPAM 설정을 적용합니다.
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
name: ipam
spec:
blocks:
- cidr: 172.17.0.64/26 # 172.17.0.65 ~ 172.17.0.128
- start: 172.17.0.200 # cidr 대신 이렇게 설정도 가능합니다.
stop: 172.17.0.201
대역에 대한 설정은 cidr로 설정할수도 잇지만 시작과 끝의 아이피 정보를 주는 것으로도 설정이 가능합니다.
cidr로 설정한것의 아이피가 64개 start/end로 설정한 아이피가 2개라서 사용가능한 IP는 66개로 보이는것을 확인할 수 있습니다.
실제 테스트해보기
테스트용 파드 생성하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
role: nginx
spec:
replicas: 3
selector:
matchLabels:
role: nginx
template:
metadata:
labels:
role: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-service
annotations:
"io.cilium/lb-ipam-ips": "172.17.0.70"
spec:
selector:
role: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
lb가 정상적으로 붙어서 생성된것을 확인해볼 수 있습니다.
외부 컨테이너 생성하기
별도의 설정을 하지 않았다면 보통은 kind 네트워크를 사용합니다. 같은 네트워크 대역에 컨테이너를 만들 예정이기 때문에 해당 네트워크 브릿지를 사용해서 컨테이너를 하나 생성하도록 합니다. netshoot 이미지는 다양한 네트워크 도구들이 설치되어있는 이미지 입니다.
docker run -d --rm --name mypc --network kind nicolaka/netshoot sleep infinity
외부 노드(컨테이너)에서 테스트 파드 호출해보기
# 파드에 들어갑니다.
docker exec -it mypc bash
# lb 아이피를 호출한다.
curl http://172.17.0.70
Cilium 노드에서 확인해보기
Cilium 노드 (cilium daemonsets)에서 IP 연결 상태를 확인할 수 있습니다. cilium-dbg 명령어를 사용하면 LoadBalancer와 연결된 각 IP들의 리스트를 볼 수 있습니다.
다음 명령어를 사용하여 서비스를 조회할 수 있습니다
cilium-dbg service list
172.17.0.70에 정상적으로 파드들이 연결된것을 확인할 수 있습니다.
'K8S > cilium' 카테고리의 다른 글
Maglev 알고리즘 사용해보기 (0) | 2024.10.18 |
---|---|
Cilium ClusterMesh 구성해보기 (0) | 2024.10.13 |
Maglev: Google의 로드밸런싱 알고리즘 (0) | 2024.10.03 |
cilium의 메트릭 정보 켜보기 (0) | 2024.10.03 |
간단하게 egress gateway 사용해보기 (0) | 2024.09.29 |