쿠버네티스 설치하기 (ubuntu 22.04)

메모장·2024년 10월 5일

kubernetes

목록 보기
1/6

ubuntu 22.04에서 쿠버네티스를 설치하는 절차입니다.


1. ufw 서비스 중지

  • ufw : ubuntu 리눅스의 방화벽 서비스
# ufw 서비스 중지
sudo systemctl stop ufw  
# ufw 서비스 자동 실행 중지
sudo systemctl disable ufw

2. swap 기능 비활성화

아래와 같은 이유로 인해 swap 비활성화 해야 함.
  • 노드 리소스 예측 : 노드의 CPU, 메모리 등의 자원을 효율적으로 사용하도록 설계되었으나 swap 활성화 시 메모리 사용량을 예측하기 어려움
  • Qos보장 : 메모리 제한에 도달한 Pod가 swap을 사용하게 되면, swap 공간이 부족할 경우 Pod의 프로세스가 종료 될 수 있음
  • 성능 저하 : 디스크 I/O가 증가하여 성능 저하 가능
# swap 끄기
sudo swapoff -a
# swap 자동 마운트 끄기
sudo vi /etc/fstab
# /swap ...   주석처리

3. /etc/hosts 노드 정보 추가

vi /etc/hosts

[중략]

# 마스터 및 워커 노드 정보 추가
192.168.91.100 k8s-master
192.168.91.201 k8s-worker1
192.168.91.202 k8s-worker2
  • ansible-playbook 을 만들어서 일괄 작업하기
ansible-playbook.yml  내용 추가하기

4. docker 설치

# 필수 패키지 설치
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# docker 공식 GPG 키 추가
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# docker 저장소 추가
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# docker 설치
sudo apt update -y
sudo apt upgrade -y
sudo apt install docker-ce -y

5. 쿠버네티스 설치

# 필수 패키지 설치
sudo apt install -y apt-transport-https ca-certificates curl gpg
# Kubernetes GPG 키 추가
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
# Kubernetes 저장소 추가
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 패키지 리스트 업데이트
sudo apt update -y
# kubelet , kubeadm , kubectl 설치하기
sudo apt install kubelet kubeadm kubectl -y
# 시스템 부팅시 자동으로 시작하도록 설정
sudo systemctl enable --now kubelet
# 현재 버전으로 고정시키기 (자동 업데이트 X)
sudo apt-mark hold kubelet kubeadm kubectl

6. 추가 설정

# IP 포워딩 활성
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
  
# 변경 사항 적용
sudo sysctl -p
# br_netfilter 모듈 로드 (Kubernetes 및 기타 컨테이너 런타임이 브리지된 네트워크 트래픽을 올바르게 처리할 수 있도록 함)
sudo modprobe br_netfilter
# container.d 초기 설정 파일 생성
sudo bash -c "containerd config default > /etc/containerd/config.toml"
# systemd를 Cgroup 드라이버로 사용하는 설정
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# crictl 설정 파일
cat <<EOF | sudo tee -a /etc/crictl.yml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
EOF
crictl에 대한 쿠버네티스 공식 문서
# container.d 재시작
sudo systemctl restart containerd 
# 시스템 부팅시 자동으로 시작하도록 설정
sudo systemctl enable containerd 

7. control-plane 노드 초기화 (마스터노드)

# --pod-network-cidr는 생성될 pod들의 네트워크 주소(서브넷마스크 255.255.0.0)
# --apiserver-advertise-address는 마스터노드의 IP 주소

sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.91.100 --cri-socket=unix:///var/run/containerd/containerd.sock

[생략]
Your Kubernetes control-plane has initialized successfully!
>
To start using your cluster, you need to run the following as a regular user:
>
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
>
Alternatively, if you are the root user, you can run:
>
  export KUBECONFIG=/etc/kubernetes/admin.conf
>
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
>
Then you can join any number of worker nodes by running the following on each as root:
>
kubeadm join 192.168.91.100:6443 --token 123456.1234567890123456 \
	--discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
# kubernetes 인증 정보 복사
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 설치 확인
kubectl get pods --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-7db6d8ff4d-l5sc5         0/1     Pending   0          70s
kube-system   coredns-7db6d8ff4d-sqswp         0/1     Pending   0          70s
kube-system   etcd-master                      1/1     Running   0          94s
kube-system   kube-apiserver-master            1/1     Running   0          90s
kube-system   kube-controller-manager-master   1/1     Running   0          96s
kube-system   kube-proxy-6rtsw                 1/1     Running   0          70s
kube-system   kube-scheduler-master            1/1     Running   0          85s

8. calico 설치 (마스터노드)

  • calico : network cni 플러그인 중 하나
# CRD번들 크기가 크기 때문에 kubectl apply , replace 대신 create 사용해야 에러가 발생하지 않음
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
# custom-resources.yaml 파일 다운로드
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
# cidr 정보 변경 (--pod-network-cidr 인 10.10.0.0/16로 변경)
vi custom-resources.yaml
# 변경한 내용으로 생성
kubectl create -f custom-resources.yaml
calico 설치가이드
# 설치 확인하기 (coredNS의 상태가 Pending에서 Running으로 변경됨)
kubectl get pod -A
NAMESPACE          NAME                                      READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-68467b4b9d-lr6lg         1/1     Running   0          3m32s
calico-apiserver   calico-apiserver-68467b4b9d-ltlgn         1/1     Running   0          3m32s
calico-system      calico-kube-controllers-5c85f7b95-8kgtb   1/1     Running   0          4m37s
calico-system      calico-node-9lxpl                         1/1     Running   0          4m38s
calico-system      calico-typha-b9b589dc7-9b64q              1/1     Running   0          4m38s
calico-system      csi-node-driver-ztrgm                     2/2     Running   0          4m37s
kube-system        coredns-7db6d8ff4d-8n6xt                  1/1     Running   0          25m
kube-system        coredns-7db6d8ff4d-rdlwq                  1/1     Running   0          25m
kube-system        etcd-k8s-master                           1/1     Running   0          25m
kube-system        kube-apiserver-k8s-master                 1/1     Running   0          25m
kube-system        kube-controller-manager-k8s-master        1/1     Running   0          25m
kube-system        kube-proxy-pdcsj                          1/1     Running   0          25m
kube-system        kube-scheduler-k8s-master                 1/1     Running   0          25m
tigera-operator    tigera-operator-77f994b5bb-72lnv          1/1     Running   0          5m40s

9. 워커 노드 추가

# 기존 token 확인 
kubeadm token list
# 토큰 생성 (유효기간 : 24H)
kubeadm token create 
# 토큰 유효기간 설정하여 생성
kubeadm token create --ttl 48h
#  --discovery-token-ca-cert-hash 값 추출하기
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 워커 노드 추가하기
sudo kubeadm join 192.168.91.100:6443 --token 123456.1234567890123456 --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
# master 노드의 인증 정보 파일(~/.kube/config) 복사
mkdir -p $HOME/.kube
scp sppolo@192.168.91.100:/home/sppolo/.kube/config /home/sppolo/.kube
sudo chown $(id -u):$(id -g) $HOME/.kube/config

10. dashboard 설치

# dashboard  manifests 다운로드
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
# dashboard manifests 수정 (Service타입을 ClusterIP -> NodePort로 변경)
vi recommended.yaml

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 32000           # 외부 접근 포트 설정
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort                # 외부 접근 가능하도록 NodePort로 변경
# 마스터 노드에 파드 설치하도록 설정 변경 (taint 제거)
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule-
# dashboard 설치
kubectl create -f recommended.yaml
# 원복 (마스터노드에 파드 설치X)
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule
# dashboard admin 계정 생성
kubectl create serviceaccount admin -n kubernetes-dashboard
# admin 계정에 클러스터 관리자 권한 부여
kubectl create clusterrolebinding admin-binding --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin
# dashboard admin토큰 생성
kubectl -n kubernetes-dashboard create token admin
# dashboard 접속하기
https://192.168.91.100:32000 
profile
어수선한 메모장

0개의 댓글