K8S 클러스터, 서버 2개, 마스터 1개, 작업자 1개가 있고 모든 것이 잘 작동합니다.
- K8S 버전: 1.19.2
- 옥양목 : 곱슬https://docs.projectcalico.org/manifests/calico.yaml-O // CALICO_IPV4POOL_CIDR 수정
- Metallb: 권장 사항에 따라 0.9.3을 설치합니다.https://metalb.universe.tf/installation/
클러스터 배포:
kubeadm init --pod-network-cidr "10.11.0.0/16" --upload-certs
무리:
ardc01k8s-master01.nps.local Ready master 41m v1.19.2 10.10.80.1 <none> Red Hat Enterprise Linux 8.2 (Ootpa) 4.18.0-193.19.1.el8_2.x86_64 docker://19.3.13
ardc01k8s-wrk01.nps.local Ready <none> 34m v1.19.2 10.10.80.11 <none> Red Hat Enterprise Linux 8.2 (Ootpa) 4.18.0-193.19.1.el8_2.x86_64 docker://19.3.13
HA가 포함된 클러스터(여러 마스터용)를 배포할 때 Metallb가 실패하고 구성 맵을 읽을 수 없으므로 어떤 IP를 할당할 수 있는지 확인하세요.
kubeadm init --control-plane-endpoint "10.10.80.10:6443" --pod-network-cidr "10.11.0.0/16" --upload-certs
금속 컨트롤러 오류:
E1009 19:34:56.370850 1 reflector.go:125] pkg/mod/k8s.io/[email protected] 78d2af792bab/tools/cache/reflector.go:98: Failed to list *v1.Service: Get https://10.12.0.1:443/api/v1/services?limit=500&resourceVersion=0: dial tcp 10.12.0.1:443: i/o timeout
I1009 19:34:56.371672 1 trace.go:81] Trace[1783558010]: "Reflector pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:98 ListAndWatch" (started: 2020-10-09 19:34:26.371367929 +0000 UTC m=+1612.080726327) (total time: 30.000286335s):
Trace[1783558010]: [30.000286335s] [30.000286335s] END
Metallb가 구성 맵을 읽을 수 없어 서비스가 <Pending> 상태에서 멈췄습니다.
모든 서버는 RHEL을 새로 설치했으며 롤백을 위해 스냅샷을 찍었습니다. 어떤 아이디어가 있나요?
답변1
Kube API 서버 연결 시간이 초과되면 어딘가에 라우팅 문제가 있다는 의미입니다.
Metallb를 설치하기 전에 Kube API에 내부적으로 액세스할 수 있는지 확인하세요.
Kubernetes 서비스의 클러스터 IP 가져오기
kubectl get service kubernetes
클러스터 IP를 사용하여 Kube API 서버에 대한 내부 연결 확인
kubectl run -i -t --attach test --restart=Never --image=ubuntu:20.04 -- bash
apt update -y && apt install -y curl
curl https://10.12.0.1:443
포트 6443의 물리적 IP를 사용하여 각 마스터의 Kube API 서버에 액세스할 수 있는지 확인하세요.
curl https://10.10.80.10:6443
HA의 경우 Kubernetes 클러스터를 초기화하기 전에 외부 로드 밸런서를 구성해야 합니다. 로드 밸런서는 포트 443에서 수신 대기하며 포트 6443에서 각 마스터 서버에 요청을 보냅니다. 이상적으로는 두 개의 로드 밸런서가 VIP를 공유하는 것입니다.
다음과 같이 간단한 구성을 위해 haproxy를 사용할 수 있습니다.
listen kubernetes
bind *:443
mode tcp
balance roundrobin
server kube-master-1 10.10.80.10:6443
server kube-master-2 10.10.80.11:6443
server kube-master-3 10.10.80.12:6443
이제 kubeadm을 사용하여 kube 클러스터를 생성하되 로드 밸런서(VIP)의 IP를 가리키고 포트 443을 사용합니다.
kubeadm init --control-plane-endpoint "MY_VIP:443" --pod-network-cidr "10.11.0.0/16" --upload-certs
내부 및 외부에서 Kube API 서버에 액세스할 수 있는지 확인한 다음 Metallb를 설치하세요.
또한 etcd에 대한 HA를 처리해야 합니다. 다양한 옵션에 대한 문서를 확인하세요.
https://kubernetes.io/docs/setup/product-environment/tools/kubeadm/high-availability/
https://github.com/kubernetes/kubeadm/blob/master/docs/ha-considerations.md
답변2
문제를 발견했습니다. RHEL8과 nftables 및 docker가 충돌하는 것 같았습니다. 최고의 솔루션은 아니지만 레거시 iptables가 있는 RHEL7.8을 사용하여 이 문제를 해결했지만 지금은 필요합니다. 감사해요!