본문 바로가기

Linux Server

[CentOS 7.8] 쿠버네티스(K8S) 클러스터 구축

본 게시글의  내용을 바탕으로 업데이트 하여 가이드 재업로드 하였으니, 아래 링크를 참고 바랍니다.

신규 작성 가이드 : https://khs960508.tistory.com/25

 

[Linux] CentOS7 에서 K8S 클러스터, ArgoCD 구성하기

기존에 올려둔 가이드내용으로 업데이트하여 글 재업로드 진행 기존 가이드 : https://khs960508.tistory.com/10 [Linux] CentOS7 에서 K8S 클러스터 구축 간단한 개념 정리 쿠버네티스? Linux 컨테이너 작업을

khs960508.tistory.com

 

간단한 개념 정리

쿠버네티스?

Linux 컨테이너 작업을 자동화하는 오픈소스 플랫폼을 뜻함 이 플랫폼에서는 컨테이너화된 애플리케이션을 배포하고 확장하는 데 수동 프로세스가 필요하지 않음 Linux 컨테이너를 실행하는 호스트 그룹을 함께 클러스터링할 수 있으며 쿠버네티스를 통해 이러한 클러스터를 쉽고 효율적으로 관리할 수 있다.

클러스터는 퍼블릭 클라우드, 프라이빗 클라우드 또는 하이브리드 클라우드 전체로 호스트를 확장할 수 있다 쿠버네티스는 Apache Kafka를 통한 실시간 데이터 스트리밍과 같이 신속한 확장을 요하는 클라우드 네이티브 애플리케이션을 호스팅하는 데 이상적인 플랫폼이다.

 

GitOps?

쿠버네티스의 구성요소들을 관리하고 배포하기 위해서는 Manifest파일을 구성하여 실행해야 하는데 이러한 파일들은 계속해서 변경되기 때문에 지속적인 관리가 필요한데 이를 편하게 Git으로 관리하는 방식

 

ArgoCD?

한마디로 쿠버네티스를 위한 CD(Continuous Delivery)툴 GitOps방식으로 관리되는 Manifest 파일의 변경사항을 감시, 현재 배포된 환경의 상태와 Git에 정의된 Manifest 상태를 동일하게 유지하는 역할을 수행

 

인프라 구성도

구성도에는 LB와 오토스케일링이 추가되어있지만, 해당 글에서는 LB와 오토스케일링을 넣지않고 진행하였습니다.

작업진행 순서

1. VPC, Subnet, NACL, ACG 설정 (편의를 위해 모든접근소스 모든포트를 열어놓았습니다)

2. NCP 서버 5대 생성 (BootStrap, Master1, Worker1, Worker2, Worker3)

 

모든 서버에서 진행 [Bootstrap / Master1]

# ssh-keygen t rsa
# systemctl restart sshd

 

BootStrap 서버에서만 진행

# vi /etc/hosts

각 노드서버들ip 적고 master1, worker1 .... worker3 까지 입력후 저장

 

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master1 (~worker3까지)

# ssh root@master1 hostname (~worker3까지)
# yum repolist
# vi /etc/yum.repos.d/docker-ce.repo

 

아래 내용을 docker-ce.repo에 작성

 

[docker-ce]
name=Docker-CE Repository
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
keepcache=0
gpgkey=https://download.docker.com/linux/centos/gpg

 

# yum install nfs-utils nfs-utils-lib

 

모든 서버에서 진행 [Bootstrap / Master1]

# echo 1 > /proc/sys/net/ipv4/ip_forward
# systemctl stop firewalld && systemctl disable firewalld
# sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux && cat /etc/sysconfig/selinux
# setenforce 0
# swapoff -a

 

BootStrap 서버에서만 진행

# yum install epel-release
# yum -y update

# yum install python3 (파이썬 설치)

 

# git clone https://github.com/kubernetes-sigs/kubespray.git
# cd kubespray/
# sudo pip3 install -r requirements.txt

 

# cp -rfp inventory/sample inventory/saascluster
# declare -a IPS=( 각 노드들의 IP주소를 입력, 각IP별 띄어쓰기로 구분 )
# CONFIG_FILE=inventory/saascluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

 

*내용이 정상적으로 출력되는지 확인*
cat inventory/saascluster/group_vars/all/all.yml
# cat inventory/saascluster/group_vars/k8s_cluster/k8s-cluster.yml

 

# ansible-playbook -i inventory/saascluster/hosts.yaml  --become --become-user=root cluster.yml

 

BootStrap 서버에서만 진행

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=0
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gp

 

# yum install kubectl

 

Master1 노드에서 아래 명령어 실행

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

 

BootStrap 노드에서 아래 명령어 실행

# mkdir -p $HOME/.kube
# vi .kube/config

config 내용.txt
0.01MB

각 노드의 config 내용이 올려진 자료와 같게 복사+붙여넣기 (기존에 작성되어있는 내용과 똑같은거같음)

 

Master1 노드에서 아래 명령어 실행

# kubectl proxy --port=8080 &
# curl http://localhost:8080/api

 

BootStrap 노드의 config내용중 ip Address 부분을 Master1 노드에서 curl을 쳐서 나온 아이피주소로 수정

Master1 노드에서 kubectl version , kubectl cluster-info 정상작동 확인

 

 

helm차트 설치&도커설치

Master1 노드에서 진행

# curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
# chmod 700 get_helm.sh
# ./get_helm.sh
# helm version

# helm repo add stable https://charts.helm.sh/stable
# helm repo add bitnami https://charts.bitnami.com/bitnami
# helm repo add incubator https://charts.helm.sh/incubator
# helm repo add ibm-helm https://raw.githubusercontent.com/IBM/charts/master/repo/ibm-helm
# helm repo add gitlab https://charts.gitlab.io/
helm plugin install https://github.com/chartmuseum/helm-push.git

(주소들이 바뀐게 많은데, 위 명령어를 쳤을때 바뀐주소를 알려줍니다. 주소부분 고쳐서 다시 명령어 쳐주시면 됩니다.)

 

helm install nfs-server stable/nfs-server-provisioner
# kubectl get storageclass

# yum install -y docker

 

도커 설치후 서비스 시작

# systemctl start docker
# systemctl enable docker

 

ArgoCD 설치

Master1 노드에서 진행

# kubectl create namespace argocd
# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

*삭제명령어*
# kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml


argocd cli 설치하기
#VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
# curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64
# chmod +x /usr/local/bin/argocd

# kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
# kubectl -n argocd get secret argocd-secret

초기비밀번호 확인
# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

포트포워딩
# kubectl port-forward --address 0.0.0.0 svc/argocd-server -n argocd 7000:80 &

 

접속
웹페이지에서 http://아르고가 설치된 노드의 IP주소:7000 으로 접속 -> admin / 초기비밀번호 로그인

 

 

 

쿠버네티스 대시보드 설치 (추후에 내용정리후 추가할 예정)

Master1 노드에서 진행

 

대시보드 설치

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
EOF

 

 

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
EOF

 

토큰정보 조회

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

 

system:anonymous 권한 추가 (이 권한을 추가하면 외부 주소를 통해 Kubernetes 대시보드에 접근할 수 있다.)

cat <<EOF | kubectl --kubeconfig=$KUBE_CONFIG apply -f -
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-anonymous
rules:
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["https:kubernetes-dashboard:"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- nonResourceURLs: ["/ui", "/ui/*", "/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/*"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-anonymous
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard-anonymous
subjects:
- kind: User
  name: system:anonymous
EOF

 

대시보드 접근방법

 

 

*이슈사항 정리*

처음 페이탈? 에러가 나면서 클러스터 구축에 실패했을때는 워커노드3개의 외부통신 설정이 안되어있어 필요한 파일을 못받아오는 것 같아 Nat Gate를 통해 외부통신을 연결한뒤 다시 시도하니 페이탈에러는 똑같이 뜨지만 클러스터 구축은 성공한다...