k8s 환경구축

icdev·2025년 5월 20일

infra

목록 보기
2/5

전제

모든 명령은 root 권한으로 실행
apt update 된 상태
가능하면 확인하라는 파드가 다 생성된 후에 진행하면 좀 더 좋음

호스트 이름 설정

master/worker

vi /etc/hostname
init 6

containerd 설치

master/worker

apt -y install containerd

가상 네트워크 설정

master/worker

cat > /etc/sysctl.d/99-k8s-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF

sysctl --system

modprobe overlay; modprobe br_netfilter
echo -e overlay\\nbr_netfilter > /etc/modules-load.d/k8s.conf

update-alternatives --config iptables
	iptables-legacy 선택

swap 끄기

master/worker

# aws EC2일 경우 기본적으로 꺼져있는것으로 확인되나 free -m으로 확인 시 swap이 있으면 설정
swapoff -a
vi /etc/fstab
	/swap.img      none    swap    sw      0       0	이걸 다음처럼 변경, 주석 처리
	#/swap.img      none    swap    sw      0       0

방화벽 오픈

master/worker

aws 대시보드 등을 통해
쿠버네티스 구성 요소가 사용하는 포트에 대한 방화벽 오픈

  • 컨트롤 플레인
    • TCP - Inbound - 6443: Kubernetes API Server (used by All)
    • TCP - Inbound - 2379~2380: Etcd server client API (used by kube-apiserver, etcd)
    • TCP - Inbound - 10250: Kubelet API (used by Self, Control plane)
    • TCP - Inbound - 10251: kube-scheduler (used by Self)
    • TCP - Inbound - 10252: kube-controller-manager (used by Self)
  • 워커 노드
    • TCP - Inbound - 10250: Kubelet API (used by Self, Control plane)
    • TCP - Inbound - 30000~32767: NodePort Services (used by All)
  • 모든 노드들 서로
    • TCP - Inbound - 179:BGP 피어링용 (BIRD 프로세스 간 통신)
    • UDP - Inbound - 4789:VXLAN encapsulation (기본 터널링 방식)
    • ICMP - Inbound - all:노드 간 reachability 확인 (ping 등)

개인적으로 보안을 크게 신경 안써도 되는 상황이라 편하게 같은 보안 그룹내에선 전부 열어주기로 함.

ex)

grub 설정(부팅 설정)

master/worker

vi /etc/default/grub
	11번째 줄을 다음처럼 변경
	GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"

update-grub

kubeadm, kubelet, kubectl 설치

master/worker

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

apt update
apt -y install kubeadm kubelet kubectl

vi /etc/default/kubelet
	KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs"

	
vi /usr/lib/systemd/system/containerd.service
	[Service]
	KillMode=mixed

systemctl daemon-reload

systemctl restart containerd.service

systemctl restart kubelet

클러스터 환경 초기화

master

# 아래 pod-network-cidr은 네트워크 내 다른 ip 안겹치게 조심(aws 같은 환경에서는 거의 무조건 192.168.0.0을 쓰는게 정신건강에 좋음/calico에서 권장하는바)
kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket=unix:///run/containerd/containerd.sock

#다음 명령어 마스터에서 실행 금지
#다음 명령어 마스터에서 실행 금지
#다음 명령어 마스터에서 실행 금지
##join 명령어 잘 복사 해둘 것##
kubeadm join 10.10.10.10:6443 --token cxkwps.ulzdqxmyu6yn6mgf \
--discovery-token-ca-cert-hash sha256:7e67fd12525711e899248c605735333959536f6bbdd7cb05816ca2c25d07944e
#다음 명령어 마스터에서 실행 금지
#다음 명령어 마스터에서 실행 금지
#다음 명령어 마스터에서 실행 금지

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get nodes

K8S 네트워크 애드온 설치

master

wget https://raw.githubusercontent.com/projectcalico/calico/master/manifests/calico.yaml

kubectl apply -f calico.yaml

kubectl get pods -A

워커 설치

worker

#이 명령어는 마스터에서 복사했던 명령어, 그대로 복사하면 안됨
#이 명령어는 마스터에서 복사했던 명령어, 그대로 복사하면 안됨
#이 명령어는 마스터에서 복사했던 명령어, 그대로 복사하면 안됨
kubeadm join 10.10.10.10:6443 --token cxkwps.ulzdqxmyu6yn6mgf \
--discovery-token-ca-cert-hash sha256:7e67fd12525711e899248c605735333959536f6bbdd7cb05816ca2c25d07944e
#이 명령어는 마스터에서 복사했던 명령어, 그대로 복사하면 안됨
#이 명령어는 마스터에서 복사했던 명령어, 그대로 복사하면 안됨
#이 명령어는 마스터에서 복사했던 명령어, 그대로 복사하면 안됨

마스터에서 노드 연결 확인

master

kubectl get nodes

대시보드 설정

master

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
vi recommended.yaml
	45번 라인을 추가
     39 spec:
     40   ports:
     41     - port: 443
     42       targetPort: 8443
     43   selector:
     44     k8s-app: kubernetes-dashboard
     45   type: NodePort

		
kubectl apply -f recommended.yaml
	
kubectl get services -n kubernetes-dashboard
	443:포트번호

	포트번호를 확인

계정 및 토큰 생성

master

cat <<EOF | kubectl create -f -
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: admin-user
   namespace: kube-system
EOF

cat <<EOF | kubectl create -f -
 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: kube-system
EOF

kubectl -n kube-system create token admin-user --duration=24h

metrics server 설치(HPA를 위함)

master

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/components.yaml
	

vi components.yaml
      args:
        - '--cert-dir=/tmp'
        - '--secure-port=443'
        - '--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname'
        - '--kubelet-use-node-status-port'
        - '--metric-resolution=15s'
        - '--kubelet-insecure-tls'	<---- 139번 라인 다음 줄에 이걸 추가

kubectl apply -f components.yaml

Longhorn 설치

모든 노드

apt install open-iscsi -y
systemctl restart iscsid
systemctl enable iscsid

master

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/deploy/longhorn.yaml
kubectl get pods -n longhorn-system #명령어로 확인

스토리지 클래스 생성(master)

kubectl apply -f - <<END
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: driver.longhorn.io
parameters:
  dataLocality: disabled
  fromBackup: ""
  fsType: ext4
  numberOfReplicas: "1"
  staleReplicaTimeout: "30"
END

kubectl get storageclasses.storage.k8s.io #로 확인

Longhorn 대시보드 설정

kubectl edit svc -n longhorn-system longhorn-frontend
혹은 대시보드에서

type: ClusterIP			# 기존에 ClusterIP로 되어 있는 걸 다음 처럼 변경
type: LoadBalancer		# type 변경 NodePort든 metallb 사용한 LoadBalancer든

0개의 댓글