Playce Cloud팀의 카페인같은 엔지니어 변진영입니다. 클라우드 세상에서 언제나 깨어 있고, 깨우치기 위해 노력합니다.
안녕하세요.
Playce Cloud Team의 변진영입니다.
오늘은 CentOS 7.8 환경에서 Playce Kube 2.0을 이용해 클러스터를 설치해보고
Master와 Worker를 구성해보는 실습을 진행해보겠습니다.
(해당 실습은 Openstack에서 생성해둔 인스턴스, 볼륨 등의 리소스를 이용하여 진행됐습니다.)
Playce Kube는 쿠버네티스 오픈소스를 기반으로, 애플리케이션을 쉽게 배포하고
자동화된 운영관리를 제공하는 PaaS(Platform as a Service) 솔루션입니다.
방화벽 포트는 사전에 허용되어 있어야 합니다.
프로토콜 | 방향 | 포트 범위 | 설명 | 사용 주체 |
TCP | 인바운드 | 22 | SSH 접속용 포트 | |
TCP | 인바운드 | 8443 | 대시보드 HTTPS (현재 rancher) | Web Client |
TCP | 인바운드 | 9443 | Deploy Keycloak | 대시보드 |
TCP | 인바운드 | 5000 | Docker Registry (HTTPS) | 모든 Kubernetes 클러스터 노드들 |
TCP | 인바운드 | 80 | Repository HTTP (OS Repository, Kubernetes Repository, Helm Chart Repository, Jenkins Plugin Download) | 모든 Kubernetes 클러스터 노드들 |
TCP | 인바운드 | 443 | Repository HTTPS (OS Repository, Kubernetes Repository, Helm Chart Repository, Jenkins Plugin Download) | 모든 Kubernetes 클러스터 노드들 |
UDP | 인바운드 | 123 | Network Time Protocol (chrony) | 모든 Kubernetes 클러스터 노드들 |
TCP/UDP | 인바운드 | 53 | Domain Name System (bind9) | 모든 Kubernetes 클러스터 노드들 |
TCP | 인바운드 | 2049 | Network File System | 모든 Kubernetes 클러스터 노드들 |
프로토콜 | 방향 | 포트 범위 | 용도 | 사용 주체 |
TCP | 인바운드 | 22 | SSH 접속용 포트 | |
TCP | 인바운드 | 80 | Ingress HTTP 포트 | Web Client |
TCP | 인바운드 | 443 | Ingress HTTPS 포트 | Web Client |
TCP | 인바운드 | 6443 | 쿠버네티스 API 서버 | Kubernetes 마스터 노드 |
TCP | 인바운드 | 2379-2380 | etcd 서버 클라이언트 API | Kubernetes 마스터 노드. kube-apiserver, etcd |
TCP | 인바운드 | 10250 | Kubelet API | 모든 Kubernetes 클러스터 노드들. Self, 마스터 노드 |
TCP | 인바운드 | 10259 | kube-scheduler | Kubernetes 마스터 노드. Self |
TCP | 인바운드 | 10257 | kube-controller-manager | Kubernetes 마스터 노드. Self |
TCP | 인바운드 | 30000-32767 | NodePort 서비스 | 모든 Kubernetes 클러스터 노드들 |
TCP/UDP | 인바운드 | 53 | Domain Name System (bind9) | 모든 Kubernetes 클러스터 노드들. nodelocadns 를 사용할 경우 Self 만 사용 |
TCP | 인바운드 | 179 | Calico networking (BGP) | 모든 Kubernetes 클러스터 노드들 |
– 네트워크 토폴로지
서버 | OS | CPU | Memory | HDD | Network |
Bastion | Rocky linux 8.5 | 8 Core | 16 GB | 200GB/800GB | ex-net && restrict-net 10.252.1.23 |
Deploy | CentOS 7.8 | 8 Core | 16 GB | 50GB/800GB | restrict-net 10.252.0.29 |
Master | CentOS 7.8 | 8 Core | 16 GB | 50GB | restrict-net 10.252.1.125 |
Worker | CentOS 7.8 | 8 Core | 16 GB | 50GB | restrict-net 10.252.3.11 |
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 50G 0 disk
└─vda1 253:1 0 50G 0 part /
vdb 253:16 0 800G 0 disk
=> 추가된 디스크를 확인할 수 있습니다.
# 추가된 디스크를 파티셔닝해줍니다.
# fdisk /dev/vdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-1677721599, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1677721599, default 1677721599):
Using default value 1677721599
Partition 1 of type Linux and of size 800 GiB is set
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/vdb1 2048 1677721599 838859776 83 Linux
Command (m for help): w
The partition table has been altered!
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 50G 0 disk
└─vda1 253:1 0 50G 0 part /
vdb 253:16 0 800G 0 disk
└─vdb1 253:17 0 800G 0 part
=> 디스크가 파티셔닝된 것을 확인할 수 있습니다.
# 파티셔닝된 디스크를 ext4 형식의 파일시스템으로 포맷합니다.
# mkfs.ext4 /dev/vdb1
...
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
# 필요한 파일들을 위치 시킬 디렉토리를 미리 생성합니다.
# mkdir -p /playcecloud
# 생성한 디렉토리에 디스크를 마운트합니다.
# mount /dev/vdb1 /playcecloud/
# df -Th | grep playcecloud
/dev/vdb1 ext4 788G 2.4G 745G 1% /playcecloud
# 현재 Bastion만 인터넷에 연결되어있기 때문에
Bastion에서 필요한 파일을 다운로드 후 Deploy로 옮겨주는 작업을 진행할 예정입니다.
# 설치 파일을 다운로드합니다.
# curl -L http://download.playcecloud.io:13300/playcekube/PlayceCloud.Kube.v2.0.tar -o /playcecloud/srcdata/PlayceCloud.Kube.v2.0.tar
# 체크섬 파일은 체크섬 확인을 수행할 파일만 다운로드 받으면 됩니다. (MD5, SHA256 택 1)
# curl -L http://download.playcecloud.io:13300/playcekube/PlayceCloud.Kube.v2.0.tar.MD5SUMS -o /playcecloud/srcdata/PlayceCloud.Kube.v2.0.tar.MD5SUMS
# curl -L http://download.playcecloud.io:13300/playcekube/PlayceCloud.Kube.v2.0.tar.SHA256SUMS -o /playcecloud/srcdata/PlayceCloud.Kube.v2.0.tar.SHA256SUMS
# 데이터 파일과 체크섬 파일들을 다운로드합니다.
# 데이터 파일 목록
- PlayceCloudData.DeployBase.v2.0.tar
- PlayceCloudData.K8SRegistry.v2.0.tar
- PlayceCloudData.K8SRepo.v2.0.tar
- PlayceCloudData.OSRepo.centos7.v2.0.tar
# 체크섬 파일 목록
PlayceCloudData.K8SRepo.v2.0.tar.MD5SUMS
PlayceCloudData.K8SRepo.v2.0.tar.SHA256SUMS
PlayceCloudData.DeployBase.v2.0.tar.MD5SUMS
PlayceCloudData.DeployBase.v2.0.tar.SHA256SUMS
PlayceCloud.Kube.v2.0.tar.MD5SUMS
PlayceCloud.Kube.v2.0.tar.SHA256SUMS
PlayceCloudData.OSRepo.centos7.v2.0.tar.MD5SUMS
PlayceCloudData.OSRepo.centos7.v2.0.tar.SHA256SUMS
MD5와 SHA-256
# MD5 (Message-Digest algorithm 5)
MD5는 메세지 축약 알고리즘으로써, 파일 무결성 검사용으로 많이 쓰이고 있습니다.
128bit의 해쉬를 제공하며, 암호화와 복호화를 통하여 보안 용도로도 많이 쓰입니다.# SHA-256
SHA-256은 SHA(Secure Hash Algorithm)의 한 종류로서 256비트의 해시 값을 생성하는 해시 함수입니다.
# 다운로드된 파일들을 확인하고 체크섬 검사를 진행합니다.
# ls
PlayceCloudData.DeployBase.v2.0.tar PlayceCloudData.K8SRepo.v2.0.tar.SHA256SUMS
PlayceCloudData.DeployBase.v2.0.tar.MD5SUMS PlayceCloudData.OSRepo.centos7.v2.0.tar
PlayceCloudData.DeployBase.v2.0.tar.SHA256SUMS PlayceCloudData.OSRepo.centos7.v2.0.tar.MD5SUMS
PlayceCloudData.K8SRegistry.v2.0.tar PlayceCloudData.OSRepo.centos7.v2.0.tar.SHA256SUMS
PlayceCloudData.K8SRegistry.v2.0.tar.MD5SUMS
PlayceCloudData.K8SRegistry.v2.0.tar.SHA256SUMS PlayceCloud.Kube.v2.0.tar
PlayceCloudData.K8SRepo.v2.0.tar PlayceCloud.Kube.v2.0.tar.MD5SUMS
PlayceCloudData.K8SRepo.v2.0.tar.MD5SUMS PlayceCloud.Kube.v2.0.tar.SHA256SUMS
# 체크섬 검사는 정합성 확인을 위함이며 상황에 따라 생략할 수 있습니다.
# cat PlayceCloud.Kube.v2.0.tar.MD5SUMS | md5sum --check
PlayceCloud.Kube.v2.0.tar: OK
# scp -i .ssh/[key_file] /playcecloud/srcdata/[File_Name] [Deploy_ip]:/playcecloud/srcdata
# deploy 서버에 접속 후 옮겨진 파일들을 확인할 수 있습니다.
[root@centos-deploy ~]# ll /playcecloud/srcdata/
total 60205024
-rw-r--r--. 1 root root 2484516864 Jan 16 05:43 PlayceCloudData.DeployBase.v2.0.tar
-rw-r--r--. 1 root root 21382474752 Jan 16 05:57 PlayceCloudData.K8SRegistry.v2.0.tar
-rw-r--r--. 1 root root 2935609344 Jan 16 06:01 PlayceCloudData.K8SRepo.v2.0.tar
-rw-r--r--. 1 root root 34826094592 Jan 16 06:11 PlayceCloudData.OSRepo.centos7.v2.0.tar
-rw-r--r--. 1 root root 21220352 Jan 16 05:59 PlayceCloud.Kube.v2.0.tar
# 설치 파일을 압축 해제해줍니다.
# tar xpf /playcecloud/srcdata/PlayceCloud.Kube.v2.0.tar -C /playcecloud/
# ls /playcecloud/playcekube
assets bin certificates keycloak kube-packages kubespray LICENSE playcecloud.conf.example rancher README.md release.txt
=> 압축 해제된 파일의 항목들을 확인합니다.
# Playce Kube의 버전 및 릴리즈 정보를 확인할 수 있습니다.
# cat /playcecloud/playcekube/release.txt
name: Playce Kube
version: v2.0
release-date: 2022-07-05
# playcecloud.conf 설정
# cp /playcecloud/playcekube/playcecloud.conf.example /playcecloud/playcecloud.conf
# 환경에 맞게 설정값을 변경해줍니다. 보통 PLAYCE_DOMAIN과 UPSTREAM_DNS을 확인하며, PLAYCE_DEPLOY는 자동으로 deploy 서버 IP를 설정하지만 그렇지 못할 경우 수동으로 설정해줍니다.
# vi /playcecloud/playcecloud.conf
# PlayceCloud config env
...
PLAYCE_DEPLOY=$(ip -4 -o a | grep -Ev "slos" | head -n 1 | awk '{ print $4 }' | sed 's/(.*)/.*/1/')
...
# deploy 서버 설치를 진행합니다.
# Playce Kube에서 사용할 데이터 압축을 풀고 서비스를 실행하고 인증서 등을 생성합니다.
# /playcecloud/playcekube/bin/install_playcekube
[INFO] ######## PlayceCloud data PlayceCloudData.OSRepo.centos7.v2.0.tar untar start ########
Estimated: [==================================================]
Progess: [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]
...
Generating a 2048 bit RSA private key
.............................................+++
..........................................................................................+++
writing new private key to '/playcecloud/data/certificates/ca/playcecloud_rootca.key'
-----
Using configuration from /playcecloud/playcekube/certificates/openssl.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'KR'
organizationName :ASN.1 12:'Open Source Consulting Inc'
organizationalUnitName:ASN.1 12:'Playce Cloud Root CA'
Certificate is to be certified until Dec 23 07:42:56 2122 GMT (36500 days)
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b03d0de9ed57 rancher/rancher:v2.6.6 "entrypoint.sh" 4 minutes ago Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp playcekube_rancher
67f73b3b4d25 quay.io/keycloak/keycloak:18.0.2 "/opt/keycloak/bin/k…" 5 minutes ago Up 5 minutes 8080/tcp, 8443/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp playcecloud_keycloak
39ac80d0c9e1 itsthenetwork/nfs-server-alpine:12 "/usr/bin/nfsd.sh" 5 minutes ago Up 5 minutes 0.0.0.0:2049->2049/tcp, :::2049->2049/tcp playcecloud_nfs
752263d5648a nginx:1.20.2 "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp playcecloud_repository
c8ec6f29b073 ubuntu/bind9:9.16-21.10_edge "docker-entrypoint.sh" 5 minutes ago Up 5 minutes 0.0.0.0:53->53/tcp, 0.0.0.0:53->53/udp, :::53->53/tcp, :::53->53/udp, 953/tcp playcecloud_bind9
98aebe4e1be9 registry:2.7.1 "/entrypoint.sh /etc…" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp playcecloud_registry
# playcecloud_nfs: Playce Kube에서 Persistent volume을 사용할 수 있도록 기본적으로 제공하는 NFS 서버입니다.
# playcecloud_repository: Playce Kube에서 사용하는 각종 레포지토리 서버입니다.
# playcecloud_bind9: Playce Kube에서 사용하는 DNS 서버입니다. 클러스터 설치시 해당 정보가 자동으로 설정됩니다.
# playcecloud_registry: Playce Kube에서 사용하는 컨테이너 이미지 레포지토리 서버입니다.
# 기본적으로 있는 kubespray_ssh와 kubespray_ssh.pub 파일을 삭제합니다.
# rm /playcecloud/playcekube/kubespray/kubespray_ssh
# rm /playcecloud/playcekube/kubespray/kubespray_ssh.pub
# Bastion에 있는 개인키는 Deploy로 복사하고, 공개키는 생성해줍니다.
# scp -i .ssh/[Key_file] .ssh/[Key_file] root@[Deploy_IP]:/playcecloud/playcekube/kubespray/kubespray_ssh
# vi /playcecloud/playcekube/kubespray/kubespray_ssh.pub
ssh-rsa ...
# 샘플 env 파일 복사
# cp -rp /playcecloud/playcekube/kubespray/kubespray-sample.env /playcecloud/data/kubespray/envfiles/k8s.env
# 환경에 맞게 파일 내용 수정해줍니다.
# vi /playcecloud/data/kubespray/envfiles/k8s.env
# inventory config
ANSIBLE_USER=root
#ANSIBLE_PASSWD=vmffpdltm
=> key 접속을 하기 때문에 패스워드는 주석 처리해줍니다.
...
# network config
# NTP와 DNS는 Deploy 서버의 IP를 적용해야 원활한 사용이 가능합니다.
PRIVATE_DNS=[Deploy_IP]
PRIVATE_NTP=[Deploy_IP]
...
# Master와 Worker 서버의 IP를 입력해줍니다.
# hosts config
MASTERS=playcekube-master01:[Master_IP]
WORKERS=playcekube-worker01:[Worker_IP]
INGRESSES=playcekube-worker01
...
# 설정한 환경 파일을 적용해 클러스터 설치 쉘을 실행해줍니다.
# /playcecloud/playcekube/bin/playcekube_kubespray.sh -f /playcecloud/data/kubespray/envfiles/k8s.env
# context를 변경해줍니다.
# kubectl config use-context admin@k8s
Switched to context "admin@k8s".
# 노드 확인하기
# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
playcekube-master01 Ready control-plane,master 6h2m v1.22.8 10.252.1.125 <none> CentOS Linux 7 (Core) 3.10.0-1127.el7.x86_64 containerd://1.5.8
playcekube-worker01 Ready ingress 4h4m v1.22.8 10.252.3.11 <none> CentOS Linux 7 (Core) 3.10.0-1127.el7.x86_64 containerd://1.5.8
# 파드 확인하기
# kubectl get pod -A
Context란?
cluster와 user를 조합해서 생성된 값
# user: 클러스터에 접근할 유저의 정보
# cluster: 쿠버네티스 클러스터의 정보
이로써 클러스터 설치 및 마스터/워커 노드의 구성은 완료됐습니다.
이후에는 지원하는 addon들을 살펴보고 설치해보는 실습을 진행하겠습니다.
클러스터에서 사용하는 addon들은 helm 차트로 구성되어 쉽게 설치 및 관리가 가능합니다.
# helm chart 레포지토리에서 지원하는 addon 리스트를 확인할 수 있습니다.
# helm search repo
NAME CHART VERSION APP VERSION DESCRIPTION
playcekube/argo-cd 5.16.2 v2.5.4 A Helm chart for Argo CD, a declarative, GitOps...
playcekube/argo-events 2.0.3 v1.7.1 A Helm chart for Argo Events, the event-driven ...
...
# 설치된 helm list 확인
# helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
csi-driver-nfs playcekube 1 2023-01-17 08:16:28.800897266 +0900 KST deployed csi-driver-nfs-v4.0.0 v4.0.0
ingress-nginx playcekube 1 2023-01-17 08:15:52.156592048 +0900 KST deployed ingress-nginx-4.1.4 1.2.1
metrics-server kube-system 1 2023-01-17 08:15:51.280797278 +0900 KST deployed metrics-server-3.8.2 0.6.1
각 Addon들에 대한 인증을 적용하기 위해 keycloak 우선 설치를 권고드립니다.
# /playcecloud/playcekube/kube-packages/keycloak/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/oauth2-proxy/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/prometheus/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/minio/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/velero/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/argo-cd/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/argo-rollouts/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/argo-events/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/linkerd2/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/linkerd-viz/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/linkerd-jaeger/install-helm-charts.sh
# /playcecloud/playcekube/kube-packages/linkerd-multicluster/install-helm-charts.sh
지금까지 CentOS 7.8 환경에서 Playce Kube를 이용해 클러스터를 설치하고 Master/Worker를 구축해보는 실습을 진행해보았습니다.
다음에는 더 좋은 블로그로 찾아뵙겠습니다.
감사합니다!