Kubernetes 로컬 설치 과정 정리
kubeadmin을 사용하여 설치합니다.
container runtime
Master Node server
OS = CentOS 7
IP : 192.168.64.150
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
Node server
OS = CentOS 7
IP : 192.168.64.149
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
Kubernetes 설치 최소사양
Master 노드 최소 사양 : CPU: 2 Core, RAM: 2G
Workder 노드 최소 사양 : CPU: 1 Core, RAM: 1G
Kubernetes version
1.18
1. Master, Worker Node Server 공통 작업
1.1. 사전 설치 환경 구성
1.1.1. hostname 변경
Master node server
명령어 :
hostnamectl set-homename kube.master.node
or
hostnamectl set-hostname kube.master.node
worker node server
명령어 :
hostnamectl set-homename kube.woker.node
or
hostnamectl set-hostname kube.woker.node
1.1.2. /etc/hosts 파일 수정
/etc/hosts 파일에 클러스터를 구성할 서버의 ip와 호스트 이름을 작성
1.1.3. selinux disabled
vi /etc/sysconfig/selinux
1.1.4. 스왑 오프
명령어 : swapoff -a
/etc/fstab 파일 수정
1.1.5. firewalld 종료
systemctl stop firewalld
systemctl disable firewalld
참고) Firewalld disbale 시키지 않고 방화벽 in/out bound 설정하는 법
MasterNode
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 |
Worker Node
Protocol | Driection | Port Range | Purpose | Used By |
TCP | Inbound | 10250 | Kubelet API | Self, Control Plane |
TCP | Inbound | 30000-32767 | NodePort Service | All |
1.1.6. iptable 설정
centos 7 의 경우 일부 iptables 가 우회되어 트래픽이 잘못 라우팅 되는 경우가 있어서 따로 설정해줘야 함
vi /etc/sysctl.d/k8s.conf
(k8s.conf 파일은 존재하지 않으므로 생성해줘야 함)
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
정상적으로 입력되었는지 확인
명령어 : sysctl --system
1.2. 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 install -y docker-ce
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
1.3. Kubernetes 설치
master node server와 worker node 서버에 모두 설치되어 있어야 함
1.3.1. /etc/yum.repos.d 디렉터리에 kubernetes.repo 파일 생성
vi /etc/yum.repos.d/kubernetes.repo
kubernetes.repo 하위 참고
[kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 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 |
1.3.2. yum 설치 진행
명령어 : yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
1.3.3. kubernetes 서비스 등록
systemctl enable --now kubelet
1.3.4. 재부팅
init 6 or reboot
2. Master Node 클러스터 구성
2.1. 설치 명령어
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.64.150
[--pod-network-cidr]
Pod 애드온 설치를 위한 옵션
Fiannel을 사용하지 않는다면 이 옵션은 사용하지 않음
pod들이 사용할 내부 네트워크 대역을 입력함
Fiannel CNI를 사용할 시 고정값 : 10.244.0.0/16
[--apiserver-advertise-address]
Master Node server의 IP 주소 입력
2.2. 결과
Cluber 가입 명령어
worker node 가 master node에 가입하기 위해서 사용할 명령어로
아래 이미지의 결과를 복사해놔야 함
마지막
kubeadm join 192.168.64.150:6443 --token p8kwr1.yn85nem1pdxxhpnj \
--discovery-token-ca-cert-hash sha256:7cf98e112422480a01a5c141165b1680178c00b0f00c8eb7b46e8df742c7b39f
항목이 나와야 정상 설치
해당 문자를 기억해야 함
(미리 복사를 해서 메모장 같은 곳에 저장해놓는 것이 좋음)
2.3. kubectl 명령을 실행하기 위한 환경변수 설정
export KUBECONFIG=/etc/kubernetes/admin.conf
참고)
vi /etc/profile 에 해당 환경변수 추가해줘야 부팅될 때 환경변수를 읽어옴
kubectl의 경우에는 kubernetes-admin Role의 인증 및 인가가 되어 있어야 실행이 가능함
admin.conf에는 kubernetes-admin Role을 인증 및 인가받기 위한 Role 및 인증 키값이 들어있음
2.4. CNI 설치
2.4.1. CNI 란?
CNI = Container Network Interface
보통 Pod는 여러 노드에 걸쳐서 배포되는데 pod는 서로 하나의 네트워크에 있는 것처럼 통신이 가능함
이러한 기능을 지원하는 것이 CN
2.4.2. Flannel 이란?
서로 다른 노드에 있는 pod 간 통신을 완성하기 위해서는 관련 기능을 제공하는 network-plugin이 필요함
Flannel 은 대표적인 network-plugin 종류 중 하나.
설치 명령어 : kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
주의)
항상 최신 버전을 확인해야 함
2.5. Master node 실행 확인
kubectl get pods --all-namespaces
2.6. Master node 클러스터 정보 확인
kubectl cluster-info
3. Worker Node
3.1. Master node에 소속되기
명령어 :
kubeadm join [API_SERVER_ADDR]:[API_SERVER_PORT] --token [TOKEN] --discovery-token-ca-cert-hash sha256:[CA_HASH]
[API_SERVER_ADDR]:[API_SERVER_PORT]
ADDR : Master server IP
PORT : Master server kubernetes port
[TOKEN]
Token 조회 명령어
kubeadm token list
[CA_HASH]
명령어 : openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
예)
kubeadm join 192.168.64.150:6443 --token p8kwr1.yn85nem1pdxxhpnj --discovery-token-ca-cert-hash sha256:7cf98e112422480a01a5c141165b1680178c00b0f00c8eb7b46e8df742c7b39f
해당 명령은 mater node 설치 시
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.64.150
명령의 마지막 확인 메시지와 동일함
(상위에서 복사하라고 했던 부분)
3.2. 정상적으로 소속되었는지 mater node server에서 확인
명령어 : kubectl get nodes
소속되기 전 상태
정상적으로 worker node server 가 소속된 상태
ERROR 정리
localhost:8008 was refused 에러
상황
master node에서만 사용 가능
master ndoe에서 kubectl get nodes 명령 실행 시 발생함
해결책
아래 명령 수행
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
참고
https://snowdeer.github.io/kubernetes/2018/02/13/kubernetes-can-not-use-kubectl/
Master, Worker node NotReady 에러
원인
원인 파악을 위해 kubectl describe nodes 명령으로 노드의 자세한 정보를 파악함
runtime network not ready: NetworkReady=false
reason:NetworkPluginNotReady
message:docker: network plugin is not ready: cni config uninitialized
CNI 관련 network 가 정상적이지 않음
해결책
CNI 설치 확인
flannel 최신 버전 확인
2020.02.23일 자 최신 버전 :
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubeadm init 오류
원인
설치 중 원인 불명의 오류
해결법
# docker 초기화
$ systemctl stop docker
$ docker rm -f `docker ps -aq`
$ docker volume rm `docker volume ls -q`
$ umount /var/lib/docker/volumes
$ rm -rf /var/lib/docker/
$ systemctl restart docker
# k8s 초기화
$ kubeadm reset
$ systemctl restart kublet
# iptables에 있는 데이터를 청소하기 위해
$ reboot
이후 다시 kubeadm init 진행
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://likefree.tistory.com/12
https://galid1.tistory.com/425
https://gsk121.tistory.com/407
https://medium.com/finda-tech/overview-8d169b2a54ff
kubernetes Master Node HA (이중화) 구성
https://fliedcat.tistory.com/170
https://skysoo1111.tistory.com/47
'Kubernetes > Kubernetes 이론' 카테고리의 다른 글
Kubernetes Secret (0) | 2020.08.17 |
---|---|
Kubernetes ConfigMap (0) | 2020.08.17 |
Kubernetes Pod 더 자세히 알아보기 (2) | 2020.08.07 |
Kubernetes Addon (0) | 2020.08.05 |
Kubernetes 이론 (8) | 2020.08.05 |