이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Kubernetes 이론

Kubernetes 설치 과정

이쿠우우 2020. 8. 7. 10:21
반응형

Kubernetes 로컬 설치 과정 정리

 

kubeadmin을 사용하여 설치합니다.

 

[설치 환경]

container runtime 
Docker

 

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

 

systemctl daemon-reload

 

systemctl restart docker
systemctl restart kubelet
docker info|grep "Cgroup Driver"

 

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