티스토리 뷰
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
링크