create proxmox vm template: https://4sysops.com/archives/how-to-create-a-proxmox-vm-template/
# proxmox 서버 cli
$ wget https://cloud-images.ubuntu.com/jammy/20230613/jammy-server-cloudimg-amd64.img
$ mv jammy-server-cloudimg-amd64.img jammy.qcow2 # qcow2로 변경
$ qemu-img info jellyfish.qcow2
$ qemu-img resize jellyfish.qcow2 32G # disk size 32G로 변경
# 아래 a,b 작업 완료 후
$ qmset 100 --serial0 socket --vga serial0
$ qm importdisk 900 jammy.qcow2 proxmox
a. proxmox web gui로 vm 생성
b. CreateVM > General (node,vmid,name) > OS (Do not use any media) > System (Qemu Agent) > Hard Disk ( scsi device 제거) > CPU > Memory > Network > Confirm > 확인
proxmox web gui에서 방금 생성한 disk edit > add
900 > options > Boot Order scsi0 disk 1번 또는 2번으로 변경후 start
vm 필수 package 설치
ubuntu os daemon 관리 popup 창 제거
$ vi /etc/needrestart/needrestart.conf
...
$nrconf{restart} = 'l'; # i -> l
...
containerd 설치 (kubernetes 1.21 이후 버전부터 docker deprecated )
# containerd v1.6.3 has a bug and doesn’t start containers due to issues with CNI on Kubernetes v1.23
wget https://github.com/containerd/containerd/releases/download/v1.6.2/containerd-1.6.2-linux-amd64.tar.gz
sudo tar Czxvf /usr/local containerd-1.6.2-linux-amd64.tar.gz
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo mv containerd.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
sudo systemctl status containerd
install runC
runC is an open-source container runtime for spawning and running containers on Linux according to the OCI specification.
minio client 설치 (https://min.io/docs/minio/kubernetes/upstream/)
MinIO는 오픈소스로 제공되는 오브젝트 스토리지 서버이며 AWS S3와의 호환되는 클라우드 스토리지를 구축할 수 있다.
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc && mv mc /usr/local/bin
$ mc config host list
kubekey 설치 (https://kubesphere.io/docs/v3.4/installing-on-linux/introduction/kubekey/)
Go 로 개발된 kubekey는 Ansible 기반 설치 프로그램을 대체하는 새로운 설치 도구이며 kubernetes 또는 kubesphere를 모두 설치할 수 있다.
$ curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.7 sh -
$ sudo mv kk /usr/local/bin
delete contents in /etc/machine-id
# machine id 를 삭제하여 생성된 vm template로 vm 을 cloning하여 생성할 경우 새로운 machine-id를 적용한다.
$ sudo echo "" > /etc/machine-id
kubernetes cluster 설정 전 vm 요구 사항
vm은 master, worker (node1, node2, node3) 3개로 구성한다.
node spec
master node:
cloud-init에서 고정 ip 할당
4vcpu/8GB
worker node:
cloud-init에서 고정 ip 할당
8vcpu/32GB
proxmox gui에서 필요한 용량의 disk를 각 node에 추가
- /var/lib/containerd (gitpod overlay filesystem 저장소)
gitpod 구성시 workspace가 구성
- /var/openebs/local (storageClass 구성)
hostPath로 CSI storage 저장소
master node ssh key 생성 및 등록 (root 계정사용)
# RSA 보다 간결한 암호화 기능을 제공하는 ed25519 를 사용
ssh-keygen -t ed25519
# master server
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authrized_keys
# 각 node의 root 계정의 .ssh/authrized_keys에 등록 (아래 key는 sample임)
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHtYJGYZHsYMgRAFNYERH1PXxZ1Oj/gJ0YhLXE0s3ZAH root@master" >> ~/.ssh/authrized_keys
vm disk 구성 (root 계정사용)
proxmox gui에서 각 worker node에 2개의 disk를 할당한 상태
# vm에 할당된 disk 확인
lsblk
# 할당된 disk filesystem 및 mount point 생성 (storageClass)
vgcreate -s 4m scdata /dev/sdb # storageClass 사용
lvcreate --extents 100%FREE -n data scdata
mkfs.ext4 /dev/pvdata/data
mkdir -p /var/openebs/local
# 할당된 disk filesystem 및 mount point 생성 (gitpodData)
vgcreate -s 4m gitdata /dev/sdb # storageClass 사용
lvcreate --extents 100%FREE -n data scdata
mkfs.ext4 /dev/gitdata/data
mkdir -p /var/containerd
# fstab에 mount 작업
blkid
...
/dev/mapper/pvdata-data: UUID="080e39ac-96dc-490a-82ea-ed7525f6df61" BLOCK_SIZE="4096" TYPE="ext4"
/dev/mapper/gitdata-data: UUID="fa986196-38ac-440d-b1c8-1d62eea146b6" BLOCK_SIZE="4096" TYPE="ext4"
...
vi /etc/fstab (입력)
...
UUID="080e39ac-96dc-490a-82ea-ed7525f6df61" /var/openebs/local ext4 defaults 0 1
UUID="fa986196-38ac-440d-b1c8-1d62eea146b6" /var/containerd ext4 defaults 0 1
...
mount -a
df -h |grep data
/dev/mapper/pvdata-data 126G 36G 84G 31% /var/openebs/local
/dev/mapper/gitdata-data 126G 71G 49G 60% /var/containerd
containerd 설정 변경 (worker node 만 해당)
cd /etc/containerd
vi config.toml
...
root = "/var/lib/containerd" # gitpod의 경우 새로 생성한 filesystem mountpoint
...
systemctl restart containerd
install kubernetes cluster with kubekey
kubekey kubernetes cluster 생성을 위한 config 설정 (master node root 사용자)
$ kubectl get challenges.acme.cert-manager.io
$ kubectl get certificates
$ kubectl get certificaterequest
$ kubectl get order
$ kubectl get secret # aws-prod-tls 확인
install kubed
Kubernetes Operator 로 ConfigMap 과 Secret 을 namespace 간에 동기화해주는 역할을 한다