반응형
  • 쿠버네티스 kube-flannel CrashLoopBackOff 해결 방법 (Error registering network: failed to acquire lease: node "node1" pod cidr not assigned)

아래와 같이 kube-flannel이 CrashLoopBackOff가 발생하였습니다.

watch kubectl get pods --all-namespaces

 

로그를 확인해본 결과 Error registering network: failed to acquire lease: node "node1" pod cidr not assigned 에러가 발생중인것을 확인할 수 있었는데, 해외 문서에 따르면 불분명한 문제(?)로 Pod CIDR 임대 실패하여 발생하는 에러라고 합니다.

kubectl -n kube-system logs -f kube-flannel-ds-h97vn

 

저는 아래와 같이 해당 현상을 해결할 수 있었는데, 우선 아래 명령어를 입력하여 kube-controller-manager.yaml 파일을 열어주세요.

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

 

allocate-node-cidrs=true는 재대로 설치 했다면 true로 되어있을 것이고, cluster-cidr를 확인 후 나와줍니다.

 

이후 master node에서 아래와 같이 입력해주면 되는데, 각자의 환경에 맞게 노드명과 CIDR를 수정하여 입력해주시면 됩니다.

저의 경우 node1, node2, node3이 있으므로 노드명을 변경해가며 총 3번 입력 후 kube-flannel이 재대로 Running 되는것을 확인할 수 있습니다.

# kubectl patch node [노드명] -p '{"spec":{"podCIDR":"위에서 확인한 CIDR"}}'
kubectl patch node node1 -p '{"spec":{"podCIDR":"172.168.0.0/24"}}'

 

반응형
반응형
  • 쿠버네티스 온프레미스 환경에서 직접 설치하기 (kubernetes install on premise, kubeadm)

온프레미스 환경에서 쿠버네티스를 설치하기 전에 사전 작업들을 해주어야할 필요성이 있습니다. 해당 글은 사전작업 → Docker 설치 → Kubernetes 설치 및 master-worker node 연동 순으로 진행 됩니다.

저의 환경은 아래와 같으며 본인 환경에 따라 적절히 변경하여 설치를 진행 해주시면 됩니다.

  1. OS : CentOS 7
  2. master node 1대, worker node 3대 구성
  3. 모든 서버 root 계정으로 설치 및 연동 진행

 

  • 1) 호스트 네임 변경 (master node, worker node 적용)

아래와 같이 echo와 hostnamectl 명령어를 이용해 호스트 네임을 변경해주세요. 재부팅은 하지 않으셔도 됩니다.

# master node
echo "master" > /proc/sys/kernel/hostname
hostnamectl set-hostname master

# worker node1
echo "node1" > /proc/sys/kernel/hostname
hostnamectl set-hostname node1

# worker node2
echo "node2" > /proc/sys/kernel/hostname
hostnamectl set-hostname node2

# worker node3
echo "node3" > /proc/sys/kernel/hostname
hostnamectl set-hostname node3

 

  • 2) hosts 파일 변경 (master node, worker node 적용)

master node, worker node의 정보를 hosts 파일에 적용 합니다. 아래 명령어를 사용해 master node, worker node 모두 적용 시켜줍니다.

# master node
cat <<EOF > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 master
192.168.100.21 node1
192.168.100.22 node2
192.168.100.23 node3
EOF

# node1
cat <<EOF > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 master
192.168.100.21 node1
192.168.100.22 node2
192.168.100.23 node3
EOF

# node2
cat <<EOF > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 master
192.168.100.21 node1
192.168.100.22 node2
192.168.100.23 node3
EOF

# node3
cat <<EOF > /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 master
192.168.100.21 node1
192.168.100.22 node2
192.168.100.23 node3
EOF

 

  • 3) firewalld 설정 (master node 적용)

firewalld를 사용중인 경우 master node에만 아래와 같이 방화벽 정책 설정을 진행 해주세요.

* 기존에 firewalld를 사용하지 않고 있는데 아래 명령어를 입력할 경우 기존 서비스하고 있던것들이 deny되어 장애가 발생할 수 있습니다.

# master node
systemctl start firewalld
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload

 

  • 4) selinux, swap 비활성화 및 br_netfilter 모듈 활성화(master node, worker node 적용)

master node 서버에서 아래와 같이 selinux, swap 비활성화 및 br_netfilter 모듈을 활성화 해주세요.

setenforce 0
sed "s/SELINUX=enforcing/SELINUX=disabled/g" -i /etc/sysconfig/selinux
modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
swapoff -a
sed -e 's/\(.*swap\)/#\1/' -i /etc/fstab

 

  • 5) Docker 설치 (master node, worker node 적용)
yum -y install yum-utils device-mapper-persistent-data lvm2 && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && yum -y install docker-ce
systemctl start docker && systemctl enable docker

 

  • 6) Kubernetes 저장소 추가 및 설치 (master node, worker node 적용)
# master node
cat <<EOF > /etc/yum.repos.d/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
EOF

yum install -y kubelet kubeadm kubectl


# worker node
cat <<EOF > /etc/yum.repos.d/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
EOF

yum install -y kubelet kubeadm

 

  • 7) kubelet 서비스 등록 및 시작 (master node, worker node 적용)
systemctl start kubelet && systemctl enable kubelet

 

  • 8) Kubernetes 초기화 작업 (master node 적용)

master node 서버에서 아래 명령어를 이용해 k8s 초기화 작업을 진행 합니다.  apiserver쪽에는 master node ip를 입력해주시고 그 뒤에는 클러스터 pod netowrk CIDE를 작성해주세면 됩니다.

# master node
#kubeadm init --apiserver-advertise-address=[마스터 노드 IP] --pod-network-cidr=[POD NETWORK CIDE]
kubeadm init --apiserver-advertise-address=192.168.100.10 --pod-network-cidr=172.16.0.0/24

 

초기화 작업이 성공적으로 종료되면 아래와 같이 token 볼 수 있는데, 이 token으로 worker node와 클러스터 연동을 해야하기 때문에 별도로 저장하여 보관해주시길 바랍니다.

 

  • 9) Cluster에게 root 권한 부여 (master node 적용)
# master node
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

  • 10) Calico 배포 (master node 적용)
# master node
curl https://docs.projectcalico.org/archive/v3.8/manifests/calico.yaml -O

 

이후 vim 편집기를 이용해 calico.yml 파일을 열은 후 아래 라인을 주석해제하고 8번에서 진행한 Pod CIDE로 수정을 해주시면 됩니다.

 

calico.yaml 파일을 배포 해주세요.

# master node
kubectl apply -f calico.yaml

 

이후 아래 명령을 통해 calico가 정상적으로 실행중인지 확인할 수 있습니다.

* coredns CrashLoopBackOff 발생 시 참고 : nirsa.tistory.com/293

# master node
watch kubectl get pods --all-namespaces

 

  • 11) kubernetes 초기화 작업 (worker node 적용)

이제 8번에서 작업 후 얻었던 token을 사용할때가 왔습니다. 따로 저장해두었던 token을 worker node 서버들에게 입력 해주세요.

 

  • 12) 연동 확인

kubectl get nodes 명령을 사용하면 아래와 같이 master, node1, node2, node3이 모두 연동된것을 확인할 수 있습니다.

 

반응형
반응형
  • 쿠버네티스 "coredns CrashLoopBackOff", "10.96.0.1:443: connect: no route to host" 에러 (firewalld)

아래와 같이 corends CrashLoopBackOff가 발생하며 Pod Log를 확인했을때 "10.96.0.1:443: connect: no route to host" 에러가 발생할 경우 firewalld가 실행중인것은 아닌지 확인해볼 필요성이 있습니다.

watch kubectl get pods --all-namespaces

 

kubectl -n kube-system logs -f coredns-74ff55c5b-k6jm6

 

저의 경우 아래 명령들을 통해 에러가 해결되었습니다.

systemctl stop firewalld
systemctl stop kubelet
systemctl stop docker

iptables --flush
iptables -tnat --flush

systemctl start kubelet
systemctl start docker
systemctl start firewalld

 

반응형
반응형
  • 쿠버네티스 master node "NotReady" 해결 방법 (coredns pending)

쿠버네티스를 설치하고나서 보니 마스터노드의 NotReady 가 발생 하였는데, get pods로 확인해보니 coredns가 Pending 상태임을 확인 하였습니다.

보통 노드와의 통신이 안되거나 CNI 설치가 되어있지 않은 경우에 coredns pending이 발생하기 때문에, CNI를 설치해주시거나 아래 방법으로 kube-flannel.yml을 적용시켜 해결하는 방법이 있습니다.

 

  • 1) kube-flannel.yml 적용
  • kubectl edit cm coredns -n kube-system를 입력하여 24라인의 loop 부분을 주석 처리

 

  • 아래 명령 입력
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 

  •  잠시 대기해주면 아래와 같이 kube-flannel-ds-8gggx가 PodInitializing 되고나서 coredns도 Running되며 master node의 NotReady도 해결이 되는것을 확인할 수 있습니다.

 

  • 2) CNI (calico) 설치
curl https://docs.projectcalico.org/archive/v3.8/manifests/calico.yaml -O

이후 vim 편집기를 이용해 calico.yml 파일을 열은 후 아래 라인을 주석해제하고 8번에서 진행한 Pod CIDE로 수정을 해주시면 됩니다.

 

calico.yaml 파일을 배포 해주세요.

kubectl apply -f calico.yaml

 

이후 아래 명령을 통해 calico가 정상적으로 실행중인지 확인할 수 있습니다.

* coredns CrashLoopBackOff 발생 시 참고 : nirsa.tistory.com/293

watch kubectl get pods --all-namespaces

 

반응형

+ Recent posts