티스토리 뷰

환경

Kubernetes 구성

gajy 2022. 4. 5. 20:58
728x90

 

1. 환경

  • Ubuntu 210.04.1 2대
  • Docker 19.03.13

 

2. 설치 전 확인 및 준비 사항

(https://kubernetes.io/ko/docs/setup/production-environment/tools/_print/)

  • 컴퓨터 당 2GB 이상의 RAM
  • CPU 2개 이상
  • 클러스터의 모든 시스템간 네트워크 연결
  • 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_uuid -> 쿠버네티스는 이러한 값들을 기반으로 클러스터의 노드를 고유하게 식별한다.
  • 스왑 메모리 배활성화 (swapoff -a) -> 활성화 되어있다면 kubelet이 정상 동작하지 않는다.
  • 포트 미사용 확인 필요 
프로토콜 포트 범위 용도 사용 주체
TCP 6443 쿠버네티스 API 서버 전부
TCP 2379-2380 etcd 서버 클라이언트 API kube-apiserver, etcd
TCP 10250 Kubelet API Self, 컨트롤 플레인
TCP 10259 kube-scheduler Self
TCP 10257 kube-controller-manager Self
UDP 8285/8472 Flannel CNI Networking Flannel
프로토콜 포트 범위 용도 사용 주체
TCP 10250 Kubelet API Self, 컨트롤 플레인
TCP 30000-32767 NodePort 서비스 전부
UDP 8285/8472 Flannel CNI Networking Flannel
프로토콜 포트 범위 용도 사용 주체
TCP 26443 로드 밸런스 Load Banlancer
### 0. 설치 전 확인
$ nproc #코어 확인
$ free -h #메모리 확인
$ ifconfig -a #Mac 확인
$ sudo cat /sys/class/dmi/id/product_uuid #product_uuid 확인

### 1. swap 메모리 비활성화
$ swapoff -a
$ free -m #swap 메모리가 0인지 확인

### 2. 방화벽 설정
$ yum install firewalld
$ systemctl start firewalld
$ systemctl enable firewalld

$ firewall-cmd --permanent --add-service=http
$ firewall-cmd --permanent --add-service=https

### master node
$ firewall-cmd --permanent --add-port=2379-2380/tcp
$ firewall-cmd --permanent --add-port=6443/tcp
$ firewall-cmd --permanent --add-port=10250-10252/tcp
$ firewall-cmd --permanent --add-port=8285/udp
$ firewall-cmd --permanent --add-port=8472/udp

### worker node
$ firewall-cmd --permanent --add-port=10250/tcp
$ firewall-cmd --permanent --add-port=30000-32767/tcp
$ firewall-cmd --permanent --add-port=8285/udp
$ firewall-cmd --permanent --add-port=8472/udp

$ firewall-cmd --permanent --add-port=26443/tcp
$ firewall-cmd --reload

### 3. iptables 확인
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

#컨테이너의 네트워크 패킷이 호스트머신의 iptables 설정에 따라 제어되도록 한다.
#0일 경우 패킷이 iptables 설정을 우회한다.
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

 

3. 필요 패키지 설치

  • kubeadm: 클러스터를 부트스트랩하는 명령
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티
$ 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
repo_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

# permissive 모드로 SELinux 설정(효과적으로 비활성화)
$ sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
$ sudo systemctl enable --now kubelet

#설치확인
$ kubelet --version
$ kubeadm version
$ kubectl version

 

4. docker croupfs 변경

systemmd를 사용하는 Linux환경에서 kubelet과 Docker가 Cgroup Driver로 croupfs Driver를 이용하도록 설정되어 있다면 System이 불안정해진다.

$ cat > /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

 

5. 마스터 노드 클러스터 초기화

#--pod-network-cidr: pod들이 사용 할 내부 네트워크
$ kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=마스터 노드 IP 주소
...
Then you can join any number of worker nodes by running the folloving on each as root:

kubeadm join 마스터 노드 IP 주소:6443 --token ea2ewq.e2q112ej5fgkyz60 \
    --discovery-token-ca-cert-hash sha256:fd80ewad80kdsa845356mb4468023klh0e568e3d1h65kjgbc4c58lidbse47c6

 

6. kubectl 사용을 위한 환경 설정 및 노드 확인

$ 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 nodes
NAME             STATUS      ROLES       AGE      VERSION
...
master-desktop   Ready       master      3h40m    v1.19.4

 

7. 네트워킹 구성

$ sysctl net.bridge.bridge-nf-call-iptables=1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ kubectl get pods -n kube-system
NAMESPACE     NAME                                      READY        STATUS    RESTARTS   AGE
...
kube-system   kube-flannel-ds-54954                     1/1          Running   0          1m

 

8. 워커 노드 조인

(마스터 노드 클러스터 초기화 시 로그에서 추출하여 복사, 붙여넣기)

$ kubeadm join 마스터 노드 IP 주소:6443 --token ea2ewq.e2q112ej5fgkyz60 \
    --discovery-token-ca-cert-hash sha256:fd80ewad80kdsa845356mb4468023klh0e568e3d1h65kjgbc4c58lidbse47c6
...
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

 

9. kubectl 사용을 위한 환경 설정 및 노드 확인

$ mkdir -p $HOME/.kube
$ vi config #master node의 config 내용 복사, 붙여넣기

$ kubectl get nodes
NAME             STATUS      ROLES                     AGE      VERSION
...
master-desktop   Ready       control-plane,master      4h46m    v1.19.4
worker-desktop   Ready       <none>                    3h8m     v1.19.4

 

 

 


이슈 해결

1. [ERROR Port-10250]: Port 10250 is in use

$ kubeadm reset #10250 해제를 위해 reset하고 다시 실행해준다.

#reset을 했지만 10250이 내려가지 않는 경우
$ systemctl list-unit-files | grep kube #kubelet을 포함하는 unit들을 확인해주고, 중복실행되는 것이 있다면 사용할 unit을 제외하고 disable 시켜준다.

 

2. http://localhost:10248/healthz' failed with error

검색 했을때, docker 설정을 변경하고 재기동하는 등의 내용이 대부분이었지만 나는 스왑 메모리 비활성화를 하면 해결이 되었다.

$ swapoff -a

 

3. PC 재부팅 후 node Not ready 상태

$ systemctl restart kubelet
728x90

'환경' 카테고리의 다른 글

git commit 기록 수정 / 삭제  (0) 2022.04.13
Jenkins + Spinnaker 기반 웹 애플리케이션 배포  (0) 2022.04.06
Spinnaker 설치 및 설정 (offline)  (0) 2022.04.06
Spinnaker 개요  (0) 2022.04.06
Spinnaker 설치 및 설정 (online)  (0) 2022.04.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31