Kubernetes Calico Bird is not ready
[Issue]
calico BIRD is not ready: BGP not establised with xxxx
calico/node is not ready: BIRD is not ready: BGP not establised with XXX
[solution]
calico bird is not ready 오류는 Calico가 BGP (Border Gateway Protocol) 피어링을 통해 노드 간의 라우팅 정보를 교환할 때 발생하는 문제입니다. bird는 Calico의 BGP 라우팅 데몬으로, 클러스터 내 네트워크 트래픽이 올바르게 전달되도록 설정된 라우팅 정보를 관리하는 역할을 합니다. 이 오류가 발생하면 네트워크 라우팅이 정상적으로 작동하지 않으므로, Calico의 네트워크 기능이 제대로 동작하지 않게 됩니다.
이 문제를 해결하기 위한 몇 가지 주요 조치 사항은 다음과 같습니다.
1. Calico Node 및 BGP 상태 확인
먼저 calicoctl을 사용하여 Calico Node와 BGP 피어 상태를 확인해야 합니다. 이를 통해 어떤 노드에서 bird가 준비되지 않았는지 또는 피어링이 실패하고 있는지 확인할 수 있습니다.
calicoctl node status
이 명령은 노드 상태와 함께 BGP 피어 상태를 표시합니다. Established 상태여야 정상이며, 그렇지 않은 경우 피어링 문제를 나타낼 수 있습니다.
2. 노드 간 연결 확인
Calico는 노드 간 통신을 위해 BGP 연결이 필요하므로, 노드 간 연결에 문제가 없는지 확인해야 합니다.
- 노드 간 방화벽 설정 확인:
- Calico가 노드 간의 BGP 피어링을 설정하려면 각 노드의 BGP 포트가 열려 있어야 합니다. 기본적으로 179번 포트를 사용합니다.
- 각 노드에서 다른 노드로의 포트 179 연결을 허용하는 방화벽 규칙이 설정되어 있는지 확인합니다.
- BGP 피어링 설정 확인:
- Calico는 내부적으로 BGP 피어링을 통해 라우팅 정보를 교환합니다. Calico에서 노드 간의 IP 연결이 올바르게 설정되지 않으면 피어링이 실패할 수 있습니다.
- 노드 간에 올바른 IP 주소로 피어링이 설정되어 있는지, 그리고 IP 충돌이 없는지 확인합니다.
- BGP 관련 로그 확인: 각 노드에서 calico-node의 로그를 확인하여, bird 프로세스가 라우팅 정보를 올바르게 설정하고 있는지 확인합니다.
kubectl logs -n kube-system <calico-node-pod-name> -c calico-node
bird 관련 라우팅 오류나 피어링 실패 메시지를 찾습니다. 일반적인 오류로는 연결 시간 초과, 라우터 설정 실패 등이 있습니다.
3. bird 및 bird6 상태 확인
Calico는 IPv4와 IPv6 라우팅을 위해 bird와 bird6 데몬을 각각 실행합니다. bird가 정상적으로 실행되고 있는지 확인하고, 필요한 경우 재시작해야 합니다.
- bird 프로세스 상태 확인: 각 노드에서 bird가 실행 중인지 확인합니다.
ps aux | grep bird
- bird 설정 파일 확인: bird 설정 파일이 손상되었거나 구성이 잘못된 경우 bird가 정상적으로 실행되지 않을 수 있습니다. 설정 파일 경로는 일반적으로 /etc/calico/confd 또는 /etc/calico/bird.cfg입니다.
- 설정 파일 내 BGP 피어링 관련 구성이 올바른지 확인하고, 필요한 경우 수정합니다.
저의 경우에는 이슈가 있는 Worker 노드에 nginx-proxy-worker가 동작되지 않고 있었습니다.
Kubernetes에서 Nginx는 보통 Ingress Controller로 배포되어, 클러스터 내부의 서비스들을 효율적으로 외부에 노출시키고 관리할 수 있는 중요한 역할을 수행합니다.
Kubernetes에서 Ingress Controller는 클러스터 외부에서 내부 서비스로의 트래픽을 관리하는 역할을 하며, NGINX Ingress Controller는 가장 널리 사용되는 Ingress Controller 중 하나입니다. NGINX Ingress Controller는 NGINX 웹 서버를 기반으로 구축되어 다양한 기능을 제공하여 외부 트래픽을 관리하고 라우팅하는 데 최적화된 솔루션입니다.
NGINX Ingress Controller의 주요 역할과 기능은 다음과 같습니다:
- 트래픽 라우팅 (Traffic Routing): Ingress 리소스를 이용해 정의된 규칙에 따라 트래픽을 적절한 서비스로 전달합니다. HTTP, HTTPS 트래픽을 다양한 서비스로 분배하며, 경로 기반이나 호스트 기반으로 세부적인 라우팅을 지원합니다.
- SSL/TLS 관리 (SSL/TLS Termination): SSL 인증서를 사용해 HTTPS 트래픽을 처리하고, 암호화된 요청을 종료하여 클러스터 내부의 통신을 암호화하지 않은 상태로 전달할 수 있습니다. 이를 통해 암호화 트래픽 처리와 내부 성능 최적화를 동시에 실현할 수 있습니다.
- 로드 밸런싱 (Load Balancing): 클러스터 내 여러 파드로 트래픽을 분산 처리하여 서비스의 가용성과 안정성을 높입니다. NGINX의 로드 밸런싱 전략을 활용해 라운드 로빈, IP 해시 등 다양한 방식으로 트래픽을 조정할 수 있습니다.
- 정책 기반 접근 제어 (Access Control): IP 차단, 요청 크기 제한, 사용자 인증과 같은 정책을 설정하여 보안성을 강화할 수 있습니다. 이를 통해 무단 접근을 방지하고, 서비스의 안정성을 높일 수 있습니다.
- 리퀘스트 제한 및 속도 조절 (Rate Limiting and Throttling): 과도한 요청을 제한하여 DoS(Denial of Service) 공격 등을 방어하는 데 유용하며, 트래픽이 특정 한도를 넘지 않도록 관리할 수 있습니다.
- 모니터링 및 로깅 (Monitoring & Logging): NGINX의 기본 기능을 활용하여 트래픽 로그, 에러 로그 등을 수집할 수 있으며, Prometheus나 Grafana 같은 모니터링 도구와 연동하여 클러스터의 성능 및 트래픽 상태를 지속적으로 모니터링할 수 있습니다.
NGINX Ingress Controller는 유연하고 강력한 기능을 제공하여, Kubernetes 클러스터 내외부 간의 트래픽 관리를 위한 표준 솔루션으로 널리 사용됩니다.
이슈를 해결하기 위해 Nginx Proxy를 생성합니다.
/etc/kubernetes/manifests에 nginx-proxy.yml을 생성합니다.
/etc/kubernetes/manifests/nginx-proxy.yml
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-proxy
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
k8s-app: kube-nginx
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-node-critical
containers:
- name: nginx-proxy
image: docker.io/library/nginx:1.19
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 25m
memory: 32M
livenessProbe:
httpGet:
path: /healthz
port: 8081
readinessProbe:
httpGet:
path: /healthz
port: 8081
volumeMounts:
- mountPath: /etc/nginx
name: etc-nginx
readOnly: true
volumes:
- name: etc-nginx
hostPath:
path: /etc/nginx
Nginx설정은 다음과 같습니다.
/etc/nginx/nginx.conf
---
error_log stderr notice;
worker_processes 2;
worker_rlimit_nofile 130048;
worker_shutdown_timeout 10s;
events {
multi_accept on;
use epoll;
worker_connections 16384;
}
stream {
upstream kube_apiserver {
least_conn;
server xxx.xxx.xxx.xxx:6443; <-- MASTER IP
}
server {
listen 127.0.0.1:6443; <--- Local에서 들어오는 Req를 Master로 bypass
proxy_pass kube_apiserver;
proxy_timeout 10m;
proxy_connect_timeout 1s;
}
}
http {
aio threads;
aio_write on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 5m;
keepalive_requests 100;
reset_timedout_connection on;
server_tokens off;
autoindex off;
server {
listen 8081;
location /healthz {
access_log off;
return 200;
}
location /stub_status {
stub_status on;
access_log off;
}
}
}
읽어주셔서 감사합니다.
'Kubernetes' 카테고리의 다른 글
Kubernetes Calico node 시작 시 kube-apiserver의 svc로 통신 실패 (0) | 2024.10.26 |
---|---|
Rabbit MQ Kubernetes Helm 배포 (1) | 2024.10.15 |
Kubernetes Dashboard 배포 Istio domain 설정 (0) | 2024.10.14 |
Kubernetes Session Affinity (0) | 2024.10.13 |
Kubernetes Ingress Controller (2) | 2024.10.13 |