ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] 클러스터 환경 구축
    Docker & Kubernetes 2022. 11. 4. 09:06

    * 구성 내용

    - 마스터 노드 1개, 워커 노드 2개로 구성

    * 사전 작업

    - 서버 머신 3대 준비
    - 호스트 네임 설정 ( kube_m, kube_n1, kube_n2 )

    : 주의 --> hostname에 언더바(_) 는 설정 할 수 없다.

    hostnamectl set-hostname [호스트명]

    - IP 설정

    vi /etc/sysconfig/network-script/ifcfg-eth0
    systemctl restart network.service

    - 방화벽 포트 오픈
    : https://www.lesstif.com/system-admin/rhel-centos-firewall-22053128.html
    : https://server-talk.tistory.com/334

    - MASTER NODE

    Protocol Driection Port Range Purpose Used By
    TCP Inbound 6443          Kubernetes API Server All
    TCP Inbound 2378,2380 etcd Server Client API kube-apiserver, etcd
    TCP Inbound 10250        Kubelet API Self, Control Plane
    TCP Inbound 10251        Kube-scheduler Self
    TCP Inbound 10252        Kube-controller-manager Self
    TCP Inbound 8001 dashboard  

    - WORKER NODE

    Protocol Driection Port Range Purpose Used By
    TCP Inbound 10250              Kubelet API Self, Control Plane
    TCP Inbound 30000-32767 NodePort Service All
    TCP Inboud 179 Calico All
    # 오픈된 포트 정보 확인
    firewall-cmd --list-all
    
    # master node
    firewall-cmd --permanent --zone=public --add-port=6443/tcp
    firewall-cmd --permanent --zone=public --add-port=2378/tcp
    firewall-cmd --permanent --zone=public --add-port=2380/tcp
    firewall-cmd --permanent --zone=public --add-port=10250/tcp
    firewall-cmd --permanent --zone=public --add-port=10251/tcp
    firewall-cmd --permanent --zone=public --add-port=10252/tcp
    firewall-cmd --permanent --zone=public --add-port=8001/tcp
    
    # worker node
    firewall-cmd --permanent --zone=public --add-port=10250/tcp
    firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
    firewall-cmd --permanent --zone=public --add-port=179/tcp
    
    # apply rules
    firewall-cmd --reload
    
    # 방화벽 완전 해제 (비추천)
    systemctl stop firewalld
    systemctl disable firewalld

    - 각 노드의 호스트파일에 아이피 정보 입력

    #각 노드의 아이피 입력
    cat << EOF >> /etc/hosts
    [마스터노드 IP] [마스터노드 호스트명]
    [워커 1번 노드 IP] [워커 1번 노드 호스트명]
    [워커 2번 노드 IP] [워커 2번 노드 호스트명]
    EOF
    
    # 예시
    cat << EOF >> /etc/hosts
    172.30.1.80 kube-m
    172.30.1.81 kube-n1
    172.30.1.82 kube-n2
    EOF
    
    # 에코 네임서버 추가
    echo nameserver 8.8.8.8 >> /etc/resolv.conf

    - selinux 설정
    : 쿠버네티스가 호스트 파일 시스템에 접근하기 위한 설정

    #현재 세팅 확인 (current mode : enforcing)
    sestatus
    
    #세팅 변경 (current mode : permissive)
    setenforce 0
    
    #영구 적용 (위 커맨드로는 재부팅시 원복됨)
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

    - SWAP 비활성화

    swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

    - IP TABLES 커널 옵션 활성화
    : 트래픽이 잘못 라우팅 되는 문제를 방지

    #k8s config 파일 생성
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables  = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
    #k8s 컨피그 내용 적용
    sysctl --system

    - Docker 설치

    : 공식사이트 가이드 https://docs.docker.com/engine/install/centos/

    # docker 설치
    yum -y install -y yum-utils
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install -y docker-ce docker-ce-cli containerd.io
    
    # docker 시작
    $ systemctl enable --now docker
    $ systemctl start docker
    
    # 런타임 설정
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF
    
    $ sysctl --system
    
    $ sudo modprobe overlay
    $ sudo modprobe br_netfilter
    
    # docker deamon.json 편집
    $ cat <<EOF>> /etc/docker/daemon.json
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ]
    }
    EOF
    
    # 서비스 재시작
    $ systemctl daemon-reload
    $ systemctl restart docker

     

    - Kubernetes 설치

    : 레포지토리 설정

    https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

    # 레포지토리 설정
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    exclude=kubelet kubeadm kubectl
    EOF
    
    # 레포지토리 업데이트
    $ yum -y update

    : 쿠버네티스 설치

    $ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    
    # kubelet 실행
    $ systemctl enable --now kubelet
    $ systemctl start kubelet

    - config.toml 수정

    mkdir -p /etc/containerd
    containerd config default | tee /etc/containerd/config.toml
    systemctl restart containerd
    
    vi /etc/containerd/config.toml
    # .containerd.runtimes.runc.options 카테고리에
    # SystemdCgroup = true 로 수정
    
    systemctl restart containerd

     

     

    * MASTER NODE 셋팅

    - 서비스 기동

    # 쿠버네티스 초기화
    # pod 생성시 cidr를 지정할 수 있다. (service는 기본 10.96.0.0/12)
    # 초기화와 함께 슬레이브 노드가 마스터 노드에 조인을 위한 토큰이 발행된다.
    $ kubeadm init --apiserver-advertise-address=172.30.1.80

    - 만약 kubeadm init 에서 실패 하였다면 아래 링크를 참고

    https://musclebear.tistory.com/165

     

    [kubernetes] 클러스터 설치 중 kubeadm init 에러 해결

    k8s 설치 중 kubeadm init이 되지않는 경우가 발생하였습니다. 아래와 같이 kubeadm init명령 후 에러가 발생하였습니다. 문제 : Status from runtime service failed 런타임 서비스 Fail이 발생 (왠지 도커의 문제가

    musclebear.tistory.com

    - 환경 변수 설정

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

    - kubectl 커맨드 자동 완성 기능 설정

    : 작동이 되는지 확인 못함

    yum install bash-completion -y
    source <(kubectl completion bash)
    echo "source <(kubectl completion bash)" >> ~/.bashrc

    * SLAVE NODE 설정

    - slave node 조인

    $ kubeadm join [master node ip]:6443 --token [token] --discovery-token-ca-cert-hash sha256:[token hash]
    
    # 조인이 잘 되었는지 master node 에서 확인
    $ kubectl get nodes

     

    * MASTER NODE 에 네트워크 플러그인 설치 (weaveworks)

    https://yooloo.tistory.com/229

    $ kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

    - 플러그인 상태 확인

    : 관련 pod의 status가 모두 running이 될때까지 기다린다.

    $ kubectl get pods --all-namespaces
    
    # 문제 있는 POD 확인
    $ kubectl -n kube-system describe po [팟이름]

     

    * 참고사이트

    https://myste-lee.tistory.com/27

Designed by Tistory.