반응형
2025-04-25 통신사 이슈로 통신사 변경까지 고려중이라..... 일시적 중단.........
집에서 사용하지 않는 노트북, 미니 PC, 저전력 PC들을 이용하여 구축한 내용으로
클라우드 서버, 물리 서버, Nas, VM 등과 호환되지 않을 수 있습니다.
"이 사람은 이러한 환경에서 이렇게 했구나" 라고 봐주시면 감사하겠습니다.
OS
- Ubuntu 24.04 Server
- K8S : v1.32
공통(마스터, 워커)
더보기
시스템 업데이트 및 종속성 설치
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl gnupg containerd
필요한 커널 모듈 로드
overlay : 컨테이너 이미지의 다양한 레이어를 효율적으로 관리하기 위함
br_netfilter : 컨테이너 네트워크 인터페이스(= CNI) 플러그인과의 호환성
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sysctl 매개변수를 설정
IPv4, IPv6 및 IP 포워딩 허용
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
Containerd 설정
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
Kubernetes components 설치
설치된 버전으로 고정 및 업그레이드를 방지: sudo apt-mark hold
Hold 목록 확인 : sudo apt-mark showhold
Hold 해제 : sudo apt-mark unhold ~
curl -fsSL <https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key> | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] <https://pkgs.k8s.io/core:/stable:/v1.32/deb/> /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
설치 확인
# Not Found 오류가 아니라면 설치된 상태
kubectl get nodes
kubectl get pods -A
kubectl get pods -A -o wide
kubectl get pods -A -o wide --sort-by=.spec.nodeName
마스터 노드(Control Plane)에서 실행
마스터 노드(Control Plane) : 워커 노드 및 클러스터 내 파드들을 관리하고 제어
더보기
10.244.0.0/16 또는 10.240.0.0/16 대역으로 초기화할 경우
사전 작업
6443
2379:2380
10250
10259
10257
위 포트 개방
클러스터 초기화
🚨🚨🚨🚨🚨
사용중인 네트워크와 충돌 가능성이 있기에 고정된 ip 대역이 아니므로 적절하게 조치
이유는 하단 네트워크 플러그인 영역 참조
🚨🚨🚨🚨🚨
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 또는
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
루트 계정으로 로그인 후 kubeconfig를 설정
클러스터 초기화 후 출력된 메세지 내용으로 변경될 가능성이 존재함
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/path/to/cluster-config
네트워크 플러그인(Calico) 설치
🚨🚨🚨🚨🚨
반드시 Worker Node들이 join 되기 전에 설치, 실행
🚨🚨🚨🚨🚨
사용중인 네트워크와 충돌 가능성이 있기에 고정된 ip 대역이 아니므로 적절하게 조치
예를 들어 홈 네트워크의 경우 대부분 192.168.0.0/16 대역이므로 calico와 충돌 가능성이 존재한다.
그렇기에 10.244.0.0/16 또는 10.240.0.0/16 대역으로 이용, 이후 calico.yaml의 CALICO_IPV4POOL_CIDR 부분을 설정한 대역에 맞추어 변경한다.
Flannel CNI를 사용하는 것도 하나의 방법이다.
curl -O <https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/calico.yaml>
🚨🚨🚨🚨🚨
네트워크 환경에 맞게 설정
🚨🚨🚨🚨🚨
10.244.0.0/16 또는 10.240.0.0/16 대역으로 초기화할 경우
vi calico.yaml
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
kubectl apply -f calico.yaml
기본값 192.168.0.0/16 대역으로 초기화할 경우
kubectl apply -f <https://docs.projectcalico.org/manifests/calico.yaml>
sudo systemctl restart kubelet
✅ 확인 필요
kubectl get pods -o wide -n kube-system
# 위 명령어에서 출력된 Calico 파드 네임
kubectl describe pod {calicoPodName} -n kube-system
🔴 calico/node is not ready: BIRD is not ready: BGP not established with ~
> Wifi + 이더넷 또는 여러개의 네트워크를 동시에 사용중일 경우 Calico의 정확한 대상 네트워크 인터페이스를 찾지 못하여 오류가 발생할 가능성이 존재.
> Wifi 종료 또는 특정 인터페이스를 바라보도록 수정
- name: IP
value: "autodetect"
// 아래를 추가
- name: IP_AUTODETECTION_METHOD
value: "interface=<인터페이스명>"
# 인터페이스 명은 ifconfig를 통해 확인 가능
# ifconfig는 net-tools 패키지를 설치해야하므로 ip a 명령어로도 확인 가능
# 삭제 후 재시작되기까지 대기
kubectl delete pods -n kube-system -l k8s-app=calico-node
🔴 calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused
> BGP 피어링을 위해 179 포트 열기
워커 노드(Data Plane)에서 실행
워커 노드(Data Plane) : 애플리케이션을 실행하는 파드들을 호스팅
더보기
사전 작업
10250
10256
30000:32767
# 위 포트 개방
워커 노드 join
마스터 노드에서 kubeadm init 입력 후 출력된 kubeadm join 명령을 사용한다.
kubeadm join {masterNodeIp}:6443 --token {token} --discovery-token-ca-cert-hash {sha256Value}
✅ 만약 24시간이 지나 토큰이 만료되었다면 마스터 노드에서 새 토큰 생성
kubeadm token create --print-join-command
kubeadm join ~
Addons
Auto Completion (선택, 명령어 자동완성 - 명령어 입력 귀찮음을 덜어줌)
더보기
type _init_completion
# _get_comp_words_by_ref: command not found 출력시
source /etc/bash_completion
source <(kubectl completion bash)
source /etc/bash_completion
# 그럼에도 동일하다면
sudo apt install bash-completion
# .bashrc 파일에 추가
source <(kubectl completion bash)
Metrics (선택, 클러스터의 리소스 사용량(CPU, MEMORY)을 "매우 단순"하게 "텍스트로" 확인 가능)
더보기
curl -O https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
# 추가
- --kubelet-insecure-tls
kubectl apply -f components.yaml
🔴 kubel top nodes 실행 시 오류가 발생하거나 pod의 상태가 오류 또는 Control Plane에 설치되지 않았을 경우
kubectl delete -f components.yaml
spec: nodeName: <master node name> containers: - args: - --cert-dir=/tmp - --secure-port=10250 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --kubelet-use-node-status-port - --metric-resolution=15s - --kubelet-insecure-tls command: - /metrics-server - --kubelet-preferred-address-types=InternalIP - --kubelet-insecure-tls
Storage Class(local) (권장 - 기본적으로 휘발성인 파드의 데이터(Ephemeral Volumes)를 보존 가능)
더보기
🔗 https://kubernetes.io/ko/docs/concepts/storage/storage-classes/#local
- apply.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
kubectl apply -f apply.yaml
MetalLB (권장, On-Premise(= Bare Metal) 환경에서 Kubernetes LoadBalancer 기능을 제공 - 있으면 좋음)
더보기
kubectl edit configmap -n kube-system kube-proxy
~
# kube-proxy의 기본은 iptables 모드이지만, metallb와 호환을 위해 ipvs 모드로 변경
mode: "ipvs"
~
# false -> true
ipvs:
strictARP: true
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
- config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
namespace: metallb-system
name: home-ip-pool
spec:
addresses:
- 192.168.0.?-192.168.0.?
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
namespace: metallb-system
name: home-l2-advertisement
spec:
ipAddressPools:
- home-ip-pool
kubectl apply -n metallb-system -f config.yaml
🔴 Error from server (InternalError): error when creating "config.yaml": Internal error occurred: failed calling webhook "ipaddresspoolvalidationwebhook.metallb.io": failed to call webhook: Post "https://metallb-webhook-service.metallb-system.svc:443/validate-metallb-io-v1beta1-ipaddresspool?timeout=10s": context deadline exceeded
Error from server (InternalError): error when creating "config.yaml": Internal error occurred: failed calling webhook "l2advertisementvalidationwebhook.metallb.io": failed to call webhook: Post "https://metallb-webhook-service.metallb-system.svc:443/validate-metallb-io-v1beta1-l2advertisement?timeout=10s": context deadline exceeded
> 위 오류 발생 시 아래 명령어 실행 후 재 적용
kubectl delete validatingwebhookconfigurations metallb-webhook-configuration
> 아래 문구가 출력되면 성공ipaddresspool.metallb.io/home-ip-pool created l2advertisement.metallb.io/home-l2-advertisement created
kubectl get svc -n metallb-system
Kubernetes Dashboard (선택, 리소스 모니터링 및 관리를 위한 공식 대시보드- 귀찮음을 덜어줌, 편리함)
더보기
🔗 https://github.com/kubernetes/dashboard
https://kubernetes.io/ko/docs/tasks/access-application-cluster/web-ui-dashboard/
# Add kubernetes-dashboard repository
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
# # Update repository After Add task
helm repo update
# Deploy a Helm Release named "kubernetes-dashboard" using the kubernetes-dashboard chart
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard
Ingress (필수, 외부에서 쿠버네티스 클러스터 내부로 들어오는 네트워크 트래픽을 Cluster 내부의 Service로 라우트 시켜줌)
위에서 설치한 Kubernetes Dashboard와 연결시키는 것을 예시로 작성하므로 맹목적 복붙은 지양
더보기
- dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubernetes-dashboard-ingress
namespace: kubernetes-dashboard
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
ingressClassName: nginx
tls:
- hosts:
- {dnsname}
secretName: {secretName}
rules:
- host: {dnsname}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 443
kubectl apply -f dashboard-ingress.yaml
🔴 적용 시점에 ingress-nginx 관련 오류 발생 시 아래 명령어 입력 후 재 실행
kubectl delete validatingwebhookconfiguration ingress-nginx-admission kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
사용자 추가
더보기
🔴 admin 권한이 부여됨
- service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f service-account.yaml
- cluster-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f cluster-role-binding.yaml
TLS : Cert-Manager (선택, HTTPS 적용 및 인증서 관리의 편의성)
NFS Provisioner (선택, k8s는 내장 NFS 프로비저너를 제공하지 않으므로 직접 설치)
반응형
'Server > K8S' 카테고리의 다른 글
K8S 인증서 갱신 오류 해소 (1) | 2025.03.17 |
---|