[카테고리:] DevOps

  • Kubernetes 마스터 및 워커 노드 설정 가이드 – ubuntu 22.04

    Kubernetes 마스터 및 워커 노드 설정 가이드 – ubuntu 22.04

    🫆 [공통] Master Node, Worker Node

    📌 ufw 서비스 중지

    ufw : ubuntu 방화벽 서비스.

    # ufw 서비스 중지.
    sudo systemctl stop ufw
    
    # ufw 서비스 자동 실행 중지.
    sudo systemctl disable ufw

    📌 swap 기능 비활성화

    • swap 기능을 비활성화 하는 이유.
    1. 노드 리소스 예측 : 노드의 CPU, 메모리 등의 자원을 효율적으로 사용하도록 설계. SWAP 메모리 사용 시 메모리 사용량 예측하기 어려움.
    2. Qos 보장 : 메모리 제한에 도달한 Pod가 Swap을 사용하게 되면, Swap 공간이 부족할 경우 프로세스가 종료될 수 있음.
    3. 성능저하 : 디스크 I/O가 증가하여 성능 저하 가능.

    # Swap 끄기.
    sudo swapoff -a
    
    # swap 자동 마운트 끄기.
    sudo vi /etc/fstab
    # /swap ...   주석처리

    📌 hosts 에 노드 정보 추가

    vi /etc/hosts
    
    # 마스터 및 워커 노드 노드 정보 추가.
    # 0.0.0.0에 해당한 IP 넣기.
    
    0.0.0.0 k8s-master-node
    0.0.0.0 k8s-worker-node-01
    0.0.0.0 k8s-worker-node-02

    🐳 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

    🛟 K8s 설치

    # 시스템 기본 설정.
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y curl apt-transport-https gnupg ca-certificates
    
    # 컨테이너 런타임 설치.
    sudo apt install -y containerd
    # 설정파일 생성.
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    # systemdcgroup 활성화.
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
    
    # 재시작
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    
    # k8s 설치.
    sudo mkdir -p /etc/apt/keyrings
    
    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 > /dev/null
    
    # 설치.
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl

    🧱 K8s 추가설정

    # 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
    
    # container.d 재시작
    sudo systemctl restart containerd 
    
    # 시스템 부팅시 자동으로 시작하도록 설정
    sudo systemctl enable containerd

    🫆 Master Node 초기화

    TIP: IP 자동 설정 명령어

    sudo kubeadm init \
      --pod-network-cidr=10.244.0.0/16 \
      --apiserver-advertise-address=$(hostname -I | awk '{print $1}') \
      --cri-socket=unix:///var/run/containerd/containerd.sock
    # --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
    # --apiserver-advertise-address는 마스터노드의 IP 주소
    
    sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --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.0.0: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

    📦 Calico 설치 — Master Node

    • 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
    
    
    # 설치 확인하기 (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

    📦 Worker Node 추가

    # 기존 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
    

    🧱 선택사항 ➡️ 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
  • K8s openreplay 명령어

    K8s openreplay 명령어

    # postgresql
    
    kubectl exec -it postgresql-0 -n db -- psql -U postgres
    
    # K8s 포트포워딩
    kubectl port-forward svc/postgresql 5432:5432 -n db

  • 일반 사용자 계정에서 Kubectl 설정하기

    일반 사용자 계정에서 Kubectl 설정하기

    🧱 일반 사용자 계정에서도 Kubectl 명령어 사용하기

    root 계정으로 접속 후, 다음을 실행.

    sudo mkdir -p /home/ubuntu/.kube
    sudo cp -i /etc/kubernetes/admin.conf /home/ubuntu/.kube/config
    sudo chown ubuntu:ubuntu /home/ubuntu/.kube/config

  • Kubernetes 설치 및 설정 가이드 – Ubuntu 22.04

    Kubernetes 설치 및 설정 가이드 – Ubuntu 22.04

    📌 ufw 서비스 중지

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

    📌 swap 기능 비활성화

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

    🐳 Docker 설치

    # docker install
    
    
    apt update
    
    apt install docker.io

    🛟 K8s 설치

    # 시스템 기본 설정.
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y curl apt-transport-https gnupg ca-certificates
    
    # 컨테이너 런타임 설치.
    sudo apt install -y containerd
    # 설정파일 생성.
    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    # systemdcgroup 활성화.
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
    
    # 재시작
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    
    # k8s 설치.
    sudo mkdir -p /etc/apt/keyrings
    
    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 > /dev/null
    
    # 설치.
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    

    K8s 추가 설정

    # 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
    
    # container.d 재시작
    sudo systemctl restart containerd 
    
    # 시스템 부팅시 자동으로 시작하도록 설정
    sudo systemctl enable containerd

    Reference

    Crictl에 대한 K8s 공식 문서


    🧱 Node 초기화

    # --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
    # --apiserver-advertise-address는 마스터노드의 IP 주소
    
    sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --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.0.0:6443 --token 123456.1234567890123456 \
     --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7
    
    # kubernetes 인증 정보 복사 (User에서 실행)
    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

    🧱 Calico 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