본문 바로가기

소프트웨어/Linux

CentOS 쿠버네티스 서버 구성하기

kubectl get service -n kube-system

회사에서 업무 테스트를 위해 쿠버네티스를 구성해야 되는 일이 생겨서 구글링을 하면서 따라하다가...
하라는데로 하는데 안되서 삽질을 하다가 혹시 나중에 참고하기 위해 포스팅 합니다.
도커도 개념만 알고 쿠버네티스도 어떻게 나온제품인지만 알고 사용도 안해봤기 때문에 무작정 따라하기에만 좋고 트러블슈팅은 해드릴수가 없습니다.

이 글을 보고 따라하시는 분들은 가상환경에서 하시고 꼭 스냅샷을 찍어두세요...꼭!!!!ㅠㅠ

이 글은 삽질하다 다음 포스터들을 보고 설치한 내용입니다.
https://www.cubrid.com/blog/3820603

 

CUBRID | 블로그 - Docker, Kubernetes 환경에서 CUBRID 컨테이너 서비스 해보기

Docker, Kubernetes 환경에서 CUBRID 컨테이너 서비스 해보기 최근에 여러 기업에서 Docker, Kubernetes를 사용하여 컨테이너로 서비스 하는 사레들을 많이 보았습니다. CUBRID도 컨테이너로 만들어서 Docker, Ku

www.cubrid.com

https://zunoxi.github.io/devops/2020/04/27/devops-k8s-install-k8s/

 

Kubernetes 2. CentOS7에 쿠버네티스 설치하기

개요 Centos7에 Kubernetes 클러스터 설치하기 목차 1.서버 가상화 2 VM Centos 설치 3.VM 세팅 4.Docker와 Kubernetes 설치 Kubernetes install on Centos7 리눅스에 대한 기초가 부족해서 거의 1주일이 넘게 쿠버네티스

zunoxi.github.io

 

두 블로그에 설명이 잘되어 있어서 큰 도움이 되었습니다.

1. 작업환경

kvm에 centos7 release 7.9.2009 를 사용하여 OS를 설치하였습니다.

  사양
vCPU 2
MEM 2048 MB
디스크 60 GB

디스크는 실사용 목적이 아닌 테스트 목적이여서 크게 신경 안쓰고 적용하였습니다.
쿠버네티스는 서버가 최소 2대가 필요합니다.
Master - 1대
Worker - 1대
하지만 대부분의 글에 3대로(Master 1대, Worker 2대) 되어 있길래 저도 3대로 구성하였습니다.

2. OS 기본 세팅

OS 기본 세팅에는 호스트네임, selinux, 방화벽 등 기본 세팅을 진행합니다.
(master 서버 구성 후 가상환경 복사를 해도 되기때문에 master 노드에서만 실행하셔도 됩니다.)

2-1. hostname

각 서버별로 설정해줍니다.
아래 명령을 실행 후 hostname 명령을 치면 설정된 것을 확인 가능합니다. 

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-worker1
hostnamectl set-hostname k8s-worker2

2-2. /etc/hosts 

ip는 사용하시는 ip로 변경해주세요. hostname 부분도 바꾸셨으면 변경해서 추가하시면 되요.

cat << EOF >> /etc/hosts
 
192.168.0.127 k8s-master
192.168.0.128 k8s-worker1
192.168.0.129 k8s-worker2
EOF

2-3. selinux

seliinux는 permissive로 세팅해 줍니다.

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sestatus

2-4. 방화벽

CentOS7 에서는 firewalld를 사용합니다. firewalld를 끄고 진행해도 되지만 firewalld 를 설정합니다.
2-4-1. Master 노드

firewall-cmd --permanent --zone=public --add-port=6443/tcp
firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=10251/tcp
firewall-cmd --permanent --zone=public --add-port=10252/tcp
firewall-cmd --reload

2-4-2. Worker 노드

firewall-cmd --permanent --zone=public --add-port=10250/tcp
firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
firewall-cmd --reload

2-4-3. pod network add-on(Master, Worker)

firewall-cmd --permanent --zone=public --add-port=179/tcp
firewall-cmd --reload

2-5. SWAP

Master, Worker 노드 모두 swap을 꺼줘야합니다. 

swapoff -a 
sed -i '/ swap / s/^/#/' /etc/fstab

2-6. iptable 커널 옵션

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

2-7. 쿠버네티스 Yum Repositotu 설정

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

 

3. Docker 설치

쿠버네티스는 Docker를 기반으로 하기 때문에 쿠버네티스 설치 전 docker를 설치해줘야합니다.
전 docker와 kubernetes를 마지막 버전으로 설치했더니 오류가 나서 버전을 정해서 설치하겠습니다.

- 버전
Docker 18.06.2.ce
kubernetes 1.15.5

3-1. docker 설치에 필요한 Yum Package 설치

yum install -y yum-utils device-mapper-persistent-data lvm2

3-2. Docker CE Repositoty 추가

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3-3. Docker-ce 설치

yum install docker-ce-18.06.2.ce

 

4. Kubernetes 설치

1

4-1. kubelet, kubeadm, kubectl 설치

yum install -y --disableexcludes=kubernetes kubeadm-1.15.5-0.x86_64 kubectl-1.15.5-0.x86_64 kubelet-1.15.5-0.x86_64

 

여기까지 설치하고 가상환경에서 master 노드를 복사해서 worker노드들을 만들어 주고,
hostname과 firewalld 설정을 worker 노드용으로 설정해주시면 됩니다.

5. Master node 설정

5-1. Docker 실행

systemctl daemon-reload
systemctl enable --now docker

5-2. Kubernetes 실행

systemctl enable --now kubelet

저는 여기서 삽질을 했습니다.
kubelet이 잘 실행 되었나 확인을 하는데 계속 오류가 나서 해결해 볼려고 별 삽질을 다했는데....
다 지우고 다른 버전으로 설치해보고 하다가 이 포스팅 글에 있는 버전으로 설치하고
이 다음에 실행하는 kubeadm init을 실행하니 정상 실행이....
(눈물ㅜㅠ..공부가 더 필요한 부분이네요.
우선 머리가 아파서 이 버전으로 쭉 진행하고 있습니다.)

5-3. Kubernetes 초기화 실행

kubeadm init으로 쿠버네티스 클러스터를 구축합니다.

kubeadm init --pod-network-cidr=172.16.0.0/16

쿠버네티스 초기화가 정상적으로 진행되면 다음과 같이 나옵니다.
마지막에 있는 kubeadm join을 잘 적어두셔야 worker 노드에 사용 할 수 있습니다.

쿠버네티스 초기화 후 정상 동작하는 kubelet의 모습

5-4. Regular user 설정

이 부분을 해줘야 root 계정으로 kubectl을 사용 할 수 있습니다.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

6. Worker node 설정

6-1. Docker 실행

systemctl daemon-reload
systemctl enable --now docker

6-2. Kubernetes 실행

systemctl enable --now kubelet

6-3. Kubernetes 노드 연결

Master 노드에서 kubeadm init 을 하고 나온 마지막 kubeadm join을 넣어줍니다.

kubeadm join 192.168.0.127:6443 --token `~~~1 \
    --discovery-token-ca-cert-hash sha256:21312312313213123123213123

6-4. Master 노드에서 Worker 노드 확인

kubectl get nodes

7. Kubernetes Master Node 네트워크 설정

아래 명령어를 치면 Coredns가 pending 상태인 것을 확인 할 수 있다.

kubectl get pods -n kube-system
kubectl get pods --all-namespaces

 

7-1. Calico 설치

쿠버네티스의 pod network add-on 중 하나인 Calico설치

curl -O https://docs.projectcalico.org/v3.9/manifests/calico.yaml
sed s/192.168.0.0\\/16/172.16.0.0\\/16/g -i calico.yaml
kubectl apply -f calico.yaml

설치가 완료되고 아래 명령어로 확인하면 calico가 PodInitializing, ContainerCreating으로 나오고 몇분이 지나면 모두 Running으로 나온다.

kubectl get pods -n kube-system
kubectl get pods --all-namespaces

7-2. DashBoard 설치

이 부분은 Cubrid 블로그의 부분을 그대로 사용했습니다.
kubectl proxy 없이 Dashboard에 직접 접속하기위해 유효한 인증서를 사용하여 보안 HTTPS연결을 설정해야 한다.

7-2-1. 인증서 생성

mkdir ~/certs
cd ~/certs

openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
openssl req -new -key dashboard.key -out dashboard.csr
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt

7-2-2. Recommended setup

kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

7-2-3. Dashboard 서비스를 NodePort 방식으로 변경

Dashboard 서비스를 NodePort 방식으로 변경하면 'kubectl proxy' 없이 NodePort를 통해서 직접 접속할 수 있습니다.

kubectl edit service kubernetes-dashboard -n kube-system

 

7-2-4. Dashboard 접속정보 확인

kubectl get service -n kube-system

7-2-5. Dashboard 계정 생성

kubectl create serviceaccount cluster-admin-dashboard-sa
kubectl create clusterrolebinding cluster-admin-dashboard-sa --clusterrole=cluster-admin --serviceaccount=default:cluster-admin-dashboard-sa

7-2-6. Dashboard 접속 시 필요한 계정 토큰 정보 확인

kubectl get secret $(kubectl get serviceaccount cluster-admin-dashboard-sa -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode

여기서 나오는 토큰을 복사해줍니다.

7-2-7. Dashboard 접속 확인

같은서버라면 https://localhost:31055 로 하면 접속이 되고 외부접속이라면 https:/ip:31055로 하면 접속이 됩니다.

 

여기까지 쿠버네티스 구성부터 대쉬보드까지 구성해보았습니다.

사용방법은 좀 나중에 테스트 해보고 포스팅하겠습니다.

반응형