T-vagrant 쿠버 버전 업그레이드

개요

T-LoxiLB vs MetalLB를 하면서, 내 조약한 Vagrant가 너무 못나보였다.
세팅을 새로 어떻게 할지 고민하는 것은 이제 그만!
클러스터 관련 세팅을 조금 더 자유롭게 하기 위해서는 이런 세팅에 조금 더 친숙해져야만 한다.
그래서 조금 더 유연하게 세팅하고 관리 효율성을 증가시키고자 새로 세팅을 진행한다.

초기에 생각한 방향은 다음과 같다.

이 스크립트를 통해 기존 vm이 삭제된 김에 새로 설정을 좀 해야겠다.
내 기존 클러스터가 꺼지면 다시 프로비저닝해야한다.
만약 한다면 쿠버 버전 업데이트를 할 거다.
그리고 이참에 ipvs와 nftables를 사용해보겠다.
nfs서버는 내 나스로 해두겠다.
vagrantfile이 loxilb가 잘 정리돼있어서 이걸로 이참에 바꿔 사용하겠다.
그리고 cni를 각각 테스트해봐야겠다.
어차피 cni갈아끼우기는 어려운 작업은 아니나 클러스터에 영향을 주다보니 최대한 안 하고 있었는데 잘 됐다.
간만에 클러스터 좀 만지고 재밌겠네.
다음으로 해볼 것.
게이트웨이 api 사용후 비교
원래는 여기에 록시가 이썽서 사용해보려고 햇던건데..

현황

일단 내 기본 vagrant 세팅은 이런 식이다.
Pasted image 20250114134726.png
거의 모든 세팅이 vagrantfile에 들어있다.
nfs 서버를 같이 세팅해서 매번 새로 nfs 서버가 켜지는 방식이다.
Pasted image 20250114134833.png
가장 아쉬운 건 이것이다.
워커를 내 맘대로 여러 개 두고 싶은데 vagrantfile을 커스텀할 만큼 ruby 문법에 익숙치 않아서 그냥 전부 일일히 적어줬다;
근데 LoxiLB의 예제 vagrantfile을 보니 훨씬 세팅을 간단하게 관리하면서 가시적인 문법을 사용할 수 있었다.
그래서 그것에 맞게 바꾸고자 한다.

세팅 파일 분리

Pasted image 20250114135143.png
이런 식으로 세팅 파일을 분리해서, 전체적으로 변경을 시키고 싶은 변수들을 외부로 둘 수 있다.
이렇게 관리하는 건 파일의 분리를 야기하기 때문에 그렇게 좋은 방식이 아닐 수도 있다.
그러나 자주 변경될 여지가 있는 값들, 그리고 공통적으로 적용되는 값들을 관리하는데 도움을 줄 것이다.
Pasted image 20250114135318.png
이 파일은 이렇게 YAML.load_file을 통해 불러오면 되며, 이후부터는 json 객체처럼 다루면 된다.
내 생각에는 여기에 기본 하드웨어 관련 설정들을 넣으면 된다.
클러스터 관련 설정에 대해서도 항상 고정적인 것이 있다면 여기에 넣어주면 좋을 것이다.

컨트롤 플레인 HA 염두

컨트롤 플레인을 여러 개 두는 시나리오를 생각해볼 만하다.
아직은 하지 않았지만 장차 실습해볼 방향이라 처음부터 이를 고려하는 세팅을 할 것이다.
Pasted image 20250114135510.png
이렇게 ruby 식 반복을 돌면서 master를 설정할 수 있도록 한다.
그러나, 아직은 바로 하지는 않을 거고, HA 구성을 할 수 있는 준비만 해두는 것이다.

vagrant 작업

Pasted image 20250114141146.png
뜻하지 않게 루비 문법에 대해서도 조금 더 알아가는 시간을 가지고 있다..

vagrant로 호스트 스크립트 실행


vagrant up을 할 때 특정 트리거를 발동시킬 수 있더라.
그런데 여러 개가 한꺼번에 될 때, 매번 이 스크립트가 실행돼서 내 선택지는 아니라 생각했다.

박스 이미지 수정

박스 이미지도 갈아끼우자.
가장 많이 쓰이는 것은 bento에서 만들어주는 박스이다.[1]

버전에서 문제가 있다는데..어때 해보니까 버전을 명시 안 해야 설치가 된다..?
버전을 명시 안 하니 최신 버전이 아닌 202404.26.0이 설치됐다.

vagrant 최종


스크립트는 이런 식으로 썼다.
루비에서도 변수를 만들어서 사용할 수 있구나..
많은 것들을 또 알아간다.

쿠버네티스 설정

kubeadm 설정

apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  imagePullSerial: true
  name: node
  taints: null
timeouts:
  controlPlaneComponentHealthCheck: 4m0s
  discovery: 5m0s
  etcdAPICall: 2m0s
  kubeletHealthCheck: 4m0s
  kubernetesAPICall: 1m0s
  tlsBootstrap: 5m0s
  upgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.32.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
proxy: {}
scheduler: {}

kubeadm config print init-defaults로 config 파일을 꺼내서 커스텀이 가능하다.
여기에서 kubelet과 kube-proxy 설정도 해줄 수 있다.
추가적으로 입력해주면 되는 건데, 내 kube-proxy가 ipvs로 동작하게 하고 싶다면 미리 해주는 게 좋은가?
init 과정의 설정은 join할 때도 전부 적용된다.
근데 kube proxy는 데몬셋으로 배포되니, 데몬셋 설정을 바꾸는 방식으로도 가능하지 않을까?
흠. 나는 일단 해당 설정들은 넣지 않도록 하겠다.
이후에 다른 실습을 할 때 이걸 활용하면 딱 좋을 것 같다.

kubelet ip 세팅 편하게 하기


나는 이 코드를 보고 감동 받고 말아버렸읍니다..
왜 이렇게 할 생각은 못 했을까.. 어떻게든 하면 방법이 있었을 텐데 굳이 더 고민 안 한 지난 날의 나를 다시금 꾸짖자..

간단히 풀어서 보자면, 원하는 네트워크 인터페이스에 대해서 ip 주소를 추출해내는 방법이다.
jq에서 if문을 쓸 수 있는 것을 처음 알았다..
ip에서 json을 꺼내려면 다른 인자보다 --json을 먼저 넣어야 한다.

컨테이너 런타임 고민

컨테이너 런타임은 뭐가 좋을까 알아보려고 하는데.. 이런 걸 찾았다.[2]
근데 이런 게 논문이야..?
내가 그냥 혼자 공부하는 것들도 논문거리가 되는 건가..?
아무튼 disk io에서 차이가 있다는 것이 요지다.
사실 컨테이너야 그냥 가상화만 하는 건데, 그 기반에서 다른 성능이 차이가 나기도 쉽지는 않을 것이라 생각한다.


컨테이너 런타임을 설정하다가 발생한 문제 중 하나.
containerd가 계속 샌드박스 이미지로 pause 3.8을 쓴다는 문구가 거슬려서 3.10으로 설정하려고 했다.[3]
그런데 이 설정이 제대로 먹지 않아서 소켓이 생성 안 된 이슈.

kubectl config 경로

export KUBECONFIG="${KUBECONFIG}:~/project/clutser-kubernetes/.kube/config"

작업은 다 끝났다.
kubectl에서 사용할 kubeconfig 경로를 여러 개 지정할 수 있다.[4]
내 config 파일을 직접 홈 디렉토리에 옮기는 것도 방법이나, 나는 이렇게 설정하는 게 더 좋다고 생각한다.
매번 수동으로 옮기는 것부터가 하나의 불필요한 작업이다.
또한 이 세팅법을 알아둔다면 다음부터는 그냥 이 변수의 값만 확인해서 클러스터 통신을 어떤 파일로 하고 있는지 알고 있으니까 좋다고 생각한다.

자, 일차적인 리모델링 성공이다.


생각 못한 이슈가 하나 있는데, 무효화된 config 설정이 경로에 있으니 자동완성을 하려고 할 때 해당 경로에 대한 get 요청을 날리려다 시간이 오바된다..

nfs 대안 - smb

NFSCSI를 생각이었는데, 잠시 고민하고 포기했다.
일단 내 목표는 내 나스를 외부 스토리지로 삼는 것이다.
그런데 여기에서 nfs를 쓰면 전송 간 암호화가 이뤄지지 않기에 패킷 탈취의 위험성이 존재한다.
그럼 나스에서 편하게 제공하는 프로토콜을 이용하는 것이 좋은데, 그렇다면 webdav나 smb가 있겠다.
그러면서 csi 드라이버를 제공해주는 것은 smb에 하나가 있다.[5]
smb의 경우엔 전송 중 암호화를 지원하기에 시도할 가치가 있다고 판단했다.[6]

helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts
helm install csi-driver-smb csi-driver-smb/csi-driver-smb --namespace kube-system --version v1.16.0

헬름 values 파일을 봤는데, 딱히 설정할 건 없어 보여서 그냥 바로 진행했다.

apiVersion: v1
data:
  password: MTIzNHF3ZXI=
  username: a3ViZS11c2Vy
kind: Secret
metadata:
  name: smb_creds
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: smb
provisioner: smb.csi.k8s.io
parameters:
  source: //smb-server.default.svc.cluster.local/share
  # if csi.storage.k8s.io/provisioner-secret is provided, will create a sub directory
  # with PV name under source
  csi.storage.k8s.io/provisioner-secret-name: smbcreds
  csi.storage.k8s.io/provisioner-secret-namespace: default
  csi.storage.k8s.io/node-stage-secret-name: smbcreds
  csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete  # available values: Delete, Retain
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=1001
  - gid=1001

다음에는 스토리지 클래스를 만들어주면 된다.

그럼 이제부터 에러를 해결하는 과정이다!

일단 나스쪽에서 5000번 PID를 가진 kube-user를 만든다.

sudo mount -v -t cifs //172.30.1.60/smb tmp -o vers=3.0,username=kube-user,password=1234qwer,dir_mode=0777,file_mode=0777,cache=strict,actimeo=30


내 로컬에서는 cifs-utils를 설치해준 이후 마운팅이 너무너무 잘되는 부분입니다요..

파일 암호화를 강제하도록 세팅했는데, 그래서 이렇게 나온다는 게 말이 되나..?
아 ㅋㅋ 디렉토리를 tmp로 해서 실수...

아무튼 매우 잘 된다.

vm에서도 접근이 원활한데, 컨테이너에서는 안 되고 있다.
smb를 통한 접근이 나스 측 로그에 남지를 않아서, 확인이 어렵다;;

이유는 찾긴 했다.
그냥 시크릿에 인코딩할 때 줄바꿈이 들어감..
역시 시크릿을 직접 만들 때는 그냥 명령형으로 만드는 게 짜세다..

한가지 생각해본 사항이 있다.
집밖에 있을 때와 집 안에 있을 때 주소를 어떻게 할 것인가.
집에 있을 때와 밖에 있을 때를 확인하고, 어드미션을 적용하는 방향으로 구현하면 좋을 것 같다.
근데, 더 생각이 든 사항 중 하나는 집 밖에서 스토리지 사용은 자제하는 게 좋을 것 같다.
포트를 하나 더 포트포워딩시켜줘야 하는데, 공격 표면을 넓히는 것이 썩 마음에 내키지는 않는다.
또 이렇게 생각이 든 이유 중 하나는, 방금 smb 설정이 생각 이상으로 너무 쉬웠다는 것이다.
마운팅을 할 때 유저와 비번을 요구할 수 있는데 이 정보에 대한 암호화가 걱정되기도 하고, 그게 괜찮다고 하더라도 문제는 남아있다.
시크릿에 저장되는 유저 정보가 가장 마음에 걸린다.
저장 간 암호화를 구현하지도 않은 상태라 함부로 정보를 담아두는 것은 꺼림칙하다.

관련 문서

이름 noteType created
2024-04-10(수) - 2024-06-13
쿠버네티스 설치 실습 - 2024-07-27
kubeadm knowledge 2024-08-05
Vagrant knowledge 2024-06-13
드레인 knowledge 2024-09-07
컨트롤러 knowledge 2024-09-12
CRD knowledge 2024-09-14
CSI knowledge 2024-10-07
API Aggregation Layer knowledge 2024-12-29
메트릭 서버 knowledge 2024-12-29
Service knowledge 2024-12-29
서비스 - 가상 IP 매커니즘 knowledge 2025-01-02
Calico knowledge 2025-01-08
NetworkPolicy knowledge 2025-01-09
ConfigMap knowledge 2025-01-12
kubeconfig knowledge 2025-01-13
API 접근 제어 우회 knowledge 2025-01-13
Authentication knowledge 2025-01-13
설치 knowledge 2025-01-14
Authorization knowledge 2025-01-19
cloud controller manager knowledge 2025-02-04
VPC CNI knowledge 2025-02-11
kube-proxy knowledge 2025-02-12
AWS EBS CSI Driver knowledge 2025-02-18
AWS EFS CSI Driver knowledge 2025-02-20
Containerd knowledge 2025-02-24
Karpenter knowledge 2025-03-04
Prometheus-Adapter knowledge 2025-03-04
kube-apiserver knowledge 2025-03-12
CEL knowledge 2025-03-17
쿠버네티스 API 구조 knowledge 2025-03-19
kube-scheduler knowledge 2025-03-19
Prometheus Operator knowledge 2025-03-30
KIND knowledge 2025-04-06
쿠버 스케줄러 시뮬레이터 소개 knowledge 2025-04-08
Vault Secret Operator knowledge 2025-04-14
Etcd knowledge 2025-04-14
Kiali knowledge 2025-04-28
Cilium knowledge 2025-06-15
2주차 - 네트워크 project 2025-02-25
2W - EKS VPC CNI 분석 published 2025-02-11
3W - kubestr과 EBS CSI 드라이버 published 2025-02-21
6W - PKI 구조, CSR 리소스를 통한 api 서버 조회 published 2025-03-15
6W - api 구조와 보안 1 - 인증 published 2025-03-15
6W - EKS api 서버 접근 보안 published 2025-03-16
에어갭 kubespray 단일 노드 설치 with Vagrant topic 2025-06-09
E-쿠버네티스 클러스터 구축 topic/explain 2024-07-29
E-NFS 볼륨, 스토리지 클래스 설정 topic/explain 2024-10-17
E-api 서버 감사 topic/explain 2025-01-21
S-flannel dns 질의 실패 topic/shooting 2024-09-11
S-vagrant 재부팅 이후 kubectl 통신 이슈 - swap 메모리 설정 topic/shooting 2025-01-16
T-vagrant 쿠버 버전 업그레이드 topic/temp 2025-01-14

참고


  1. https://github.com/chef/bento ↩︎

  2. https://www.ki-it.com/xml/41154/41154.pdf ↩︎

  3. https://kubernetes.io/docs/setup/production-environment/container-runtimes/#override-pause-image-containerd ↩︎

  4. https://kubernetes.io/ko/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#kubeconfig-환경-변수-설정 ↩︎

  5. https://github.com/kubernetes-csi/csi-driver-smb ↩︎

  6. https://docs.aws.amazon.com/ko_kr/fsx/latest/WindowsGuide/encryption-in-transit.html ↩︎