이번 글도 역시, 제가 생각했던 흐름대로 적어보겠습니다.
저는 외부에 노출하고, 사용자가 접속하기 위해서는 LB 를 띄우면 되는것이 아닌가?
라는 생각을 가지고 있었습니다.
왜냐, 사용자가 ddns -> ~~ -> ingress 의 과정으로 접속할 것이라고 생각했기 때문이죠
(물론 이 생각은 이후에 바뀌지만,, 이러한 고민 과정이 중요하다고 생각해서 글로 남깁니다.)
때문에 단순히 nodeport svc 를 띄워서 사용자가 private ip:port 로 접근할 수 있도록 유도하는게 굉장히 불편할 것 같다는 생각이 들었고,
그렇기에, 일단 LB 서비스부터 찾아봤습니다.
그래서 LB + Nodeport -> cluster ip (서비스 포트)
요런식으로 구성하기 위해 csp 사의 lb 서비스는 온프렘에서 쓰기 어렵기 때문에, 아래의 솔루션을 찾아냈습니다.
MetalLB ! (참고)
- metal LB 는 베어메탈(bare metal, 운영 체제가 설치되지 않은 하드웨어)로 구성된 쿠버네티스에서도 로드밸런서를 사용할 수 있게 고안된 프로젝트입니다.
- MetalLB는 BareMetalLoadBalancer 약자!
- 서비스(로드 밸런서)의 'External IP' 전파를 위해서 표준 프로토콜인 ARP(IPv4)/NDP(IPv6), BGP 를 사용합니다.
- 데몬셋으로 speaker 파드를 생성하여 'External IP'를 전파합니다.
MetalLB 컨트롤러는 작동 방식(Protocol, 프로토콜)을 정의하고 EXTERNAL-IP를 부여해 관리합니다. MetalLB 스피커(speaker)는 정해진 작동 방식(L2/ARP, L3/BGP)에 따라 경로를 만들 수 있도록 네트워크 정보를 광고하고 수집해 각 파드의 경로를 제공합니다. 이때 L2는 스피커 중에서 리더를 선출해 경로 제공을 총괄하게 합니다.
점선으로 표시된 부분이 MetalLB 스피커에서 자동으로 관리해주는 부분입니다.
- L2 모드 (ARP 프로토콜 사용 - mac 주소 인식 )
- Speaker 파드 중 1개가 리더로 선출되고, 리더는 ARP(GARP, Gratuitous APR)를 이용하여 서비스 External IP 광고합니다.
- 위 그림과 같이 iptables 분산룰을 이용하여 Traffic을 전달합니다.
- 여기서 iptables 분산 룰은 후에 찾아보기로 했습니다..너무 길어질듯해서..
2) bgp 모드 (동적 라우팅 프로토콜) - L3 - 라우팅
• 일반적으로 서버상단에는 L3 스위치가 구성되며, Speaker와 BGP Neighbor를 맺으며, 서비스 External IP를 32bit로 광고합니다.
METALLB 설치
갑자기 공부하게된 k8s 네트워크
kube-proxy 가 네트워크를 관리하는 3가지 모드
kube-proxy 는 쿠버네티스에서 서비스를 만들었을 때ClusterIP 나 NodePort 로 접근할 수 있게 실제 조작을 하는 컴포넌트입니다. 쿠버네티스 클러스터의 노드마다 실행되면서 클러스터 내부 IP 로 연결하려는 요청을 적절한 파드로 전달합니다.
kube-proxy 가 네트워크를 관리하는 방법은 userspace, iptables,IPVS 가 있습니다.
초기에는 userspace 가 기본 관리모드였고,
19년 12월 부터 iptables 가 기본 관리 모드입니다.
앞으로는 ipvs로 기본 관리모드가 바뀔것으로 예상한다고 합니다.
userspace 모드 ((출처:[김징어의 Devlog:티스토리] https://kimjingo.tistory.com/152))
- 클라이언트에서 서비스의 클러스터 IP를 통해 어떤 요청을 하면 iptables를 거쳐서 kube-proxy가 요청을 받습니다. 그리고 서비스의 클러스터 IP는 연결되어야 하는 적절한 파드로 연결해줍니다. 이 때 요청을 파드들에게 나눠줄 때는라운드 로빈(round robin) 방식을 사용합니다.
iptables 모드 ( 출처: https://arisu1000.tistory.com/27839 [아리수:티스토리] ) :
- userspace 모드와 다른 점은 kube-proxy가 iptables를 관리하는 역할만 한다는 것입니다. 직접 클라이언트에서 트래픽을 받지 않습니다. 클라이언트에서 오는 모든 요청은 iptables를 거쳐서 파드로 직접 전달됩니다.그래서 userspace 모드 보다 요청 처리 서능이 좋습니다.userspace 모드에서는 파드 하나로의 연결 요청이 실패하면 kube-proxy가 자동으로 다른 파드에 연결을 재시도합니다. 하지만 iptables 모드에서는 파드 하나로의 연결 요청이 실패하면 재시도하지 않고 그냥 요청이 실패합니다.컨테이너에 readinessProbe가 설정되었고 그에 따른 헬스 체크가 정상적으로 되어야 연결 요청이 이루어집니다.
ipvs 모드 :
- IPVS(IP Virtual Server) 모드IPVS(IP Virtual Server) 모드는 리눅스 커널에 있는 L4 로드밸런싱 기술입니다. 리눅스 커널 안 네트워크 관련 프레임워크인넷필터(Netfilter)에 포함되어 있습니다. 따라서 IPVS 커널 모듈이 노드에 설치되어야 합니다. ipvs는 커널스페이스에서 작동하고 데이터 구조를 해시테이블로 저장해서 가지고 있기 때문에 iptables보다 빠르고 좋은 성능을 냅니다. 그리고 ipvs는 더 많은 로드밸런싱 알고리즘을 가지고 있어서 이걸 이용할 수 있습니다. rr(round-robin), lc(least connection), dh(destination hashing), sh(source hashing), sed(shortest expected delay), nq(never queue)등의 다양한 로드밸런싱 알고리즘을 제공해 줍니다.
외부에서 접속 -> NodePort -> speaker 파드 -> controller 파드 -> NodePort -> 실제 서비스 -> 파드
설치해보자)
helm .. 깔고 설치
그 전에! -> 노드 권한 문제로 인해 동작하지 않는 트러블 슈팅 해결
음 config 권한 문제 해결
해결한게 아닌 것 같다.
pod 빼고 다른거 다 조회가 안된다.
아무래도 사용자를 song song 으로 한게 아닐것같단말이지..
그거랑 별개로 지금 그냥 워커노드가 권한이 거의 없음 (걍 파드 조회 빼고 다안됨)
트러블 근본적 원인 RBAC - 권한과 관련하여
쿠버네티스 클러스터를 제어하기 위해서는 마스터 노드인 호스트에 접속하여 큐브컨트롤으로 명령어를 실행해야합니다. 그러나, 반드시 쿠버네티스 클러스터 제어를 위해서 마스터 노드에서 수행할 필요는 없습니다. 그 이유는 큐브컨트롤(kubectl) 이 쿠버네티스 클러스터 접근을 위해서 클러스터 접근 구성 파일(kubeconfig) 을 참조해서 클러스터에 접근하기 때문입니다.
쿠버네티스 클러스터의 마스터 노드가 아닌 로컬 컴퓨터(외부 호스트) 에서 큐브컨트롤을 사용하여 쿠버네티스 클러스터에 명령어를 실행하기 위해서 클러스터 접근 구성 파일을 정의하고 쿠버네티스
내 워커는 kubelet client 로 실행중이였어서 권한이 한정적이다.
대체 명령어를 어케 쳤길래 또..
마스터노드의 admin.conf 가져와서 만들어준담에
config 설정 다시했다.
권한 부여 관련 글
https://yureutae-log.vercel.app/k8s-account
https://kdev.ing/archive/setup-kubernetes-cluster
https://nice-engineer.tistory.com/entry/Kubernetes-RBAC-Role-Based-Access-Control
https://blog.doctor-cha.com/on-premise-kubernetes-production-environment-10-month-operation-review
https://kubernetes.io/ko/docs/concepts/configuration/organize-cluster-access-kubeconfig/
https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
metal LB 를 설치하고, svc 를 띄워봤지만 EXTERNAL-IP 가 무한 pending 상태에 빠져버림을 확인할 수 있었습니다.
원인 파악 1 ) configmap 에 라우팅이 될만한 ip 대역을 지정안해줌
예시 ) -bgp 사용할때
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
peers:
- peer-address: 192.168.10.254
peer-asn: 64513
my-asn: 64512
address-pools:
- name: default
protocol: bgp
avoid-buggy-ips: true
addresses:
- 172.20.1.0/24
EOF
- peer-address는 BGP 라우터의 IP 주소입니다.
- peer-asn은 BGP 라우터의 AS 번호입니다.
- my-asn은 MetalLB의 AS 번호입니다.
- address-pools는 MetalLB가 할당할 IP 주소 범위입니다
그래서 Layer 2 로 도전,,
cat > configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.0.200-192.168.0.210
그럼에도 불구하고 안됨 이슈 발생
무한 펜딩.. 22
원인:
고로,, Calico 와 상극이였다는 소리였습니다.
그래서 맘아프지만 포기했어요 ! 하하.
맘아프니 PV 설정해봤어요
PV
NFS 란?
NFS Network File System. 네트워크 파일 시스템
NFS란 네트워크 상에서 다른 컴퓨터의 파일 시스템을 마운트해서 공유하는 것이다.
즉, 다른 컴퓨터의 파일 시스템을 마치 자기 것처럼 사용할 수 있는 것이다.
장점
여러 사용자들이 파일을 공유하는데 유용하게 사용됩니다. 예를 들어, 여러 명의 사용자가 한 프로젝트에 참여하고 있는 경우, (흔히 NFS 공유라고 알려진) NFS 파일 시스템의 공유 디렉토리를 사용하여 마운트된 /myproject 디렉토리 안에 프로젝트에 사용되는 파일을 저장하여 함께 사용 가능합니다.
단점
아무래도 네트워크를 사용하여 파일에 접근하기 때문에 보안에 취약할 수 밖에 없습니다.
구성해보자
https://velog.io/@mdev97/K8S-NFS-서버-구축-및-PVC-연동-Feat.-GCP
위 글 참고했습니다.
근데 워커노드 2개니까 RWX 로함 (파일시스템 쓰는 이유가 애초에 그거아닌가 싶기도 )
기존 파일 시스템(저장소)를 서버 장치(랙)에 연결하는 방법?
SSD 를 서버에 연결하는 방식은 다음과 같다.
- 직접 장착
2. 외장 SSD 인클로저 사용
- 외장 SSD 인클로저를 사용하여 SSD를 서버 랙에 연결하는 방식입니다.
- 외장 SSD 인클로저는 SSD를 장착할 수 있는 별도의 하드웨어 장치입니다.
- 서버의 PCIe 슬롯이나 USB 포트에 연결하여 SSD를 사용할 수 있습니다.
- 이 방식은 서버 내부 공간 활용도가 높고 SSD 교체가 용이합니다.
3. SSD RAID 어댑터 사용
- SSD RAID 어댑터를 사용하여 여러 개의 SSD를 하나의 스토리지 볼륨으로 구성하는 방식입니다.
- SSD RAID 어댑터는 서버의 PCIe 슬롯에 장착되며, 여러 개의 SSD를 연결할 수 있습니다.
- 이 방식은 높은 성능과 안정성을 제공하지만, 비용이 더 들 수 있습니다
관련 글 → 링크
SSD 인터페이스
SSD 가 시스템에 연결되는 방식과 다른 구성요소간 데이터가 전송되는 방식, 데이터 전송속도를 결정하기도 한다.
- SATA
- SSD의 가장 일반적인 인터페이스 유형이며, 기존의 HDD 와 호환이 가능한 인터페이스,
- 마더보드, 노트북에서 사용가능하지만 속도가 가장 느림
- PCIe
- sata 보다 빠름 , 고성능에 적합함
- NVMe
- 통신방식 규격, PCIe 인터페이스기반의 통신프로토콜
오늘은 . . 여기까지!
'☁️2024 > HomeLabK8sWorld' 카테고리의 다른 글
쏭's Lab 구성하기 제 3편 - 각 노드에 k8s 구축하기 (0) | 2024.08.15 |
---|---|
쏭's Lab 구성하기 제 2편 - 네트워크 구성 및 환경 구축 (0) | 2024.08.15 |
쏭's Lab 구성하기 제1편 - 환경 조사 및 설계 (1) | 2024.05.09 |