-
[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 [팟이름]
* 참고사이트
'Docker & Kubernetes' 카테고리의 다른 글
[Docker] GlusterFS volume-plugin 구성 (feat.CentOS7) (0) 2023.02.08 [Docker] Docker Swarm 클러스터 구축 (1) 2022.12.26 [Kubernetes] Dashboard 셋업 및 외부 접속 설정 (1) 2022.11.23 [Docker] Code-server 구축 (0) 2022.11.04 [Docker] Custom image 만들기 (feat. MS-SQL) (0) 2022.11.04