References
- SAG Kubernetes Cluster 구축 가이드
- Kubernetes Cluster를 구성해보자 (riyenas.dev) ( *GOOD* )
- 구성
- On-Premise 환경 ( Xcp-ng (XEN) ) 환경에서 ( CentOS 7 ) 구성
- Master Node 1대, Worker Node 2대, Private Repository 1대로 구성
- Hostname 설정
$ hostnamectl set-hostname k8s-master (마스터 노드 VM 에서)$ hostnamectl set-hostname k8s-worker1 (워커 노드 VM 에서)$ hostnamectl set-hostname k8s-worker2 (워커 노드 VM 에서)
- /etc/hosts 파일 수정
$ cat << EOF >> /etc/hosts"마스터 노드 IP" k8s-master"워커 노드1 IP" k8s-worker1"워커 노드2 IP" k8s-worker2EOF
- 메모리 Swap 끄기
- Kubernetes 는 메모리 Swap을 사용하지 않기 때문에 종료
$ swapoff -a$ sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- Selinux Mode 변경 ( Permmisive )
$ setenforce 0$ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- Iptables 설정 & IP v6 disable 설정
$ modprobe br_netfilter$ cat << EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOF$ cat << EOF > /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF$ vi /etc/sysctl.confnet.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv6.conf.lo.disable_ipv6 = 1net.ipv6.conf.eth0.disable_ipv6 = 1net.ipv6.bindv6only = 0$ sysctl --system
- Firewall 설정 (데모 환경이므로 disable 또는 사용 포트 open)
$ systemctl disable --now firewalld## or firewall enable 시 사용 할 port 허용### Control-plane node(s) (Master Node)# for Kubernetes API serverfirewall-cmd --permanent --add-port=6443/tcp# for etcd server client APIfirewall-cmd --permanent --add-port=2379-2380/tcp# for Kubelet APIfirewall-cmd --permanent --add-port=10250/tcp# for kube-schedulerfirewall-cmd --permanent --add-port=10251/tcp# for kube-controller-managerfirewall-cmd --permanent --add-port=10252/tcp# for dnsfirewall-cmd --permanent --add-port=53/tcp# firewalld reloadfirewall-cmd –-reload### Worker node(s)# for Kubelet APIfirewall-cmd --permanent --add-port=10251/tcp# for NodePort Servicesfirewall-cmd --permanent --add-port=30000-32767/tcp# for dnsfirewall-cmd --permanent --add-port=53/tcp (this is for dns)# firewalld reloadfirewall-cmd –-reload
- Docker 설치
$ yum install -y yum-utils device-mapper-persistent-data lvm2$ yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo$ yum update -y && yum install -y docker-ce docker-ce-cli containerd.io
- k3 설치 (Kubelet, Kubeadm, Kubectl)
- 내려받을 저장소 설정 (gpgcheck = 0 & repo_gpgcheck = 0 주의)
$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearchenabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpgexclude=kubelet kubeadm kubectlEOF
- k3 설치 & kubelet 실행
$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes$ systemctl enable --now kubelet
- kubeadm init
- 마스터 노드에서 작업
- 쿠버네티스가 컨테이너에 부여하는 네트워크를 설정해 클러스터 초기화
- Calico CNI 를 사용할 pod-network 설정, k8s node 들과 네트웍이 겹치므로 172.16.0.0/12 Private 네트워크로 설정
$ kubeadm init --pod-network-cidr=172.16.0.0/12 --apiserver-advertise-address="마스터 노드 IP"
- 마스터 노드에서 쿠버네티스를 정상적으로 구동할 수 있도록 설정파일 복사, 권한 부여
$ mkdir -p $HOME/.kube$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
- kubeadm init > 성공 시 나온 명령어를 Worker node에 입력
- 워커노드에서 작업
(예시)
$ kubeadm join 192.168.1.176:6443 --token b41qqy.p1gxozcbcu1k1uf1 \ --discovery-token-ca-cert-hash sha256:911ca9c475a72a93150b14557abad91217e9e05e97443a47180d5e90b0ef0649
- Kubernetes CNI(Calico) 설치
$ curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -o calico.yaml$ sed -i -e "s?192.168.0.0/16?172.16.0.0/12?g" ./calico.yaml$ kubectl apply -f calico.yaml$ kubectl get pods --all-namespaces --watch
- Kubernetes Dashboard 설치 (2021 10 14 기준)
$ kubectl apply -f https://kubetm.github.io/documents/appendix/kubetm-dashboard-v1.10.1.yaml
- Proxy 서버 기동
$ nohup kubectl proxy --port=8001 --address="본인 ip" --accept-hosts='^*$' >/dev/null 2>&1 &
- http://"본인 ip":8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ 로 접속
++ Docker Compose 설치
$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose$ chmod +x /usr/local/bin/docker-compose$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
++ Portainer 설치 및 구동 ( docker volume(가상 파일 시스템) 을 사용하여 설치 및 구동 )
$ docker volume create portainer_data$ docker run -d -p 9000:9000 \--restart=always \--name=portainer \-v /var/run/docker.sock:/var/run/docker.sock \-v portainer_data:/data portainer/portainer
- https://{ip}:9000 으로 접속