Oracle Cloud로 "완전 무료" Kubernetes cluster 구축하기

성예인·2023년 11월 8일
3

인프라

목록 보기
1/1

한 프론트엔드 개발자가 백지 상태로 많은 시도 끝에 무료 Kubernetes cluster 구축하는 과정을 공유하는 글입니다. 글에 오류나 피드백은 감사히 받겠습니다 !

2024-3-19 ARM 인스턴스 생성 매크로를 php기반 매크로로 수정

개요

혼자 사이드 프로젝트를 진행하면서 배포를 위한 서버를 필요로 하는 일이 생겼습니다. Vercel과 같이 무료 배포 서비스도 있지만 CI/CD 부터 인프라 관리까지 흔히 말하는 Devops의 전반적인 업무를 경험해보고 싶어서 무료 클라우드 서비스를 탐색하던 중 OCI(oracle cloud)를 선택하게 된 계기와 왜 Kubernetes여야 하는지에 대해 설명해드리겠습니다.

왜 Kubernetes를 사용하는거야 ??

Kubernetes란 컨테이너 오케스트레이션으로써 컨테이너 오케스트레이션이란 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화합니다.
https://www.redhat.com/ko/topics/containers/what-is-container-orchestration

위 설명과 같이 Kubernetes는 여러개의 컨테이너를 관리하는 역할을 수행합니다. 저는 사이드 프로젝트를 아이디어가 생각 날때마다 찍어내고 싶은 생각이 있었고, 때문에 여러개의 컨테이너에 각각의 서비스를 올리고 효율적으로 관리할 수 있는 Kubernetes를 선택하였습니다. 또한 서비스의 사용자의 증감에 따라서 서버의 처리 능력이 부족할 경우 Scale out 작업이 간단하게 가능한 이점도 있습니다.

왜 Oracle cloud 일까 ??

https://hoing.io/archives/10446
위 블로그 글은 클라우드 서비스(AWS, GCP, OCI(Oracle cloud), NBP) 무료 플랜 비교글 입니다. 간단히 요약하면 OCI, GCP 만이 평생 무료 플랜이 존재하고 그중에서도 OCI가 가장 많은 인스턴스와 높은 사양을 지원해주기에 선택했습니다.

Kubernetes 클러스터를 구축하기 위해선 인스턴스의 사양이 특정 수준 이상이여야 하기에 OCI 만이 완전 무료 Kubernetes cluster를 구축할 수 있습니다.

구축하기

인스턴스 생성하기

저는 Kubernetes cluster를 구축하기 위해 OCI의 무료 리소스를 다음과 같이 사용하고 있습니다.

  • ARM 인스턴스 x2 (각각 컨트롤러 노드, 워커 노드 하나씩)
    • 사양: OCPU 2개, RAM 12GB
  • AMD 인스턴스 x1 (몇몇 스케쥴링이 필요한 작업을 돌리기 위한)
    • 사양: OCPU 1개, RAM 1GB

AMD 인스턴스는 아무때나 만들수 있지만, ARM 인스턴스는 Region 별로 정해진 수량이 있어서 매크로를 돌려 두어야 합니다.

먼저 매크로를 돌려둘 AMD 인스턴스를 만들겠습니다.

AMD 인스턴스 만들기

이미지 변경을 통해 인스턴스의 운영체제를 ubuntu로 바꿔주기

생성하기전 ssh 키 추가 섹션의 직접 만든 키를 넣어주거나, oracle에서 임의로 만들어주는 키를 다운로드 하기

ssh ubuntu@<인스턴스 ip> -i ./<인스턴스의 ssh 개인키>

매크로 만들기

참고 글: https://github.com/hitrov/oci-arm-host-capacity

PHP 7.4 설치

sudo apt-get update

sudo apt -y install software-properties-common

sudo add-apt-repository ppa:ondrej/php

sudo apt-get update

sudo apt -y install php7.4

sudo apt-get install -y php7.4-cli php7.4-json php7.4-common php7.4-mysql php7.4-zip php7.4-gd php7.4-mbstring php7.4-curl php7.4-xml php7.4-bcmath

Composer 설치

# 에러발생시 https://getcomposer.org/download 참고

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

sudo mv composer.phar /usr/local/bin/composer

매크로 설치

git clone https://github.com/hitrov/oci-arm-host-capacity.git

cd oci-arm-host-capacity/
composer install

API Key 만들기

오른쪽 상단 프로필 아이콘 클릭 -> 사용자 설정

왼쪽 하단 메뉴 -> API 키 -> API 키 추가 를 눌러 다음 화면에서 전용키 다운로드

구성 파일 미리보기 영역 텍스트를 복사 후 메모하기

로컬 PC에 다운로드한 전용키 서버로 옮기기

scp -i ./<인스턴스의 ssh 개인키> <API키 전용키> ubuntu@<인스턴스 ip>:~/

위 미리보기를 가지고 매크로 환경변수 설정하기

cp .env.example .env

nano .env

이후 아래 변수 수정하기

  • OCI_REGION
  • OCI_USER_ID
  • OCI_TENANCY_ID
  • OCI_KEY_FINGERPRINT
  • OCI_PRIVATE_KEY_FILENAME

예시

OCI_REGION=ap-seoul-1
OCI_USER_ID=ocid1.user....dxv7aq
OCI_TENANCY_ID=ocid1.tenancy....6xk4q
OCI_KEY_FINGERPRINT=00:00:00:00:00

# absolute path (including directories) or direct public accessible URL
OCI_PRIVATE_KEY_FILENAME="/home/ubuntu/example@example_2024-03-18T14_00_02.672Z.pem"

인스턴스 생성 화면에서 변수를 모아 메모하기

가용성 도메인 메모하기

인스턴스 사양 설정하기

이미지 우분투 20.04로 설정하기

SSH 키 없음으로 설정하기

F12로 개발자 도구를 켜고 네트워크 탭을 누른 후 생성 버튼 클릭하기

instances/로 500이 뜬 요청을 클릭 후 Payload를 클릭해 subnetId와 imageId 복사 후 메모하기

매크로 환경변수 추가 설정하기

cp .env.example .env

nano .env

네크워크 탭에서 메모한 것 기반으로 채워넣기

  • OCI_SUBNET_ID
  • OCI_IMAGE_ID
  • OCI_AVAILABILITY_DOMAIN

그 외 변수는 고정 값

  • OCI_OCPUS=2
  • OCI_MEMORY_IN_GBS=12
  • OCI_MAX_INSTANCES=2

인스턴스의 ssh key를 가지고 새로 만들어질 인스턴스에 접속할 ssh key로 등록하기

cat ~/.ssh/id_rsa.pub

출력되는 값을 아래 환경변수에 등록해주기

  • OCI_SSH_PUBLIC_KEY

테스트

php ./index.php

후 아래 출력이 나오면 정상

{
    "code": "InternalError",
    "message": "Out of host capacity."
}

크론잡 만들기

로그 파일 만들기

touch ~/oci-arm-host-capacity/oci.log

chmod 777 ~/oci-arm-host-capacity/oci.log

crontab -e

# 아래 복붙
* * * * * /usr/bin/php ~/oci-arm-host-capacity/index.php >> ~/oci-arm-host-capacity/oci.log

생성 후 접속

매크로를 만든 인스턴스에서 실행

ssh -i ~/.ssh/id_rsa ubuntu@ip.add.re.ss

여기까지 하고 수시로 OCI 접속하여 ARM 인스턴스 생성 여부 확인하면 됩니다. (운 좋으면 하루면 만들어지기도 합니다.)

인스턴스 설정하기

방화벽 해제

OCI 가상 네트워크 방화벽 해제하기

인스턴스 -> 인스턴스 세부정보 -> 서브넷 -> 보안 -> 수신 규칙 추가 -> TCP/UDP 프로토콜 모든 포트 열기


소스 CIDR은 0.0.0.0/0, IP 프로토콜은 TCP와 UDP 각각 수신 규칙 생성 or 모든 프로토콜

인스턴스 iptable 규칙 초기화

오라클 인스턴스는 방화벽 규칙이 미리 설정되어 있어 Kubernetes를 구축하는데에 방해가 될 수 있으므로 아래 명령어로 방화벽 규칙을 초기화합니다.

# 모든 ARM 인스턴스에서

sudo iptables-save > ~/iptables-rules

grep -v "DROP" iptables-rules > tmpfile && mv tmpfile iptables-rules-mod
grep -v "REJECT" iptables-rules-mod > tmpfile && mv tmpfile iptables-rules-mod

sudo iptables-restore < ~/iptables-rules-mod

sudo iptables -L

sudo netfilter-persistent save
sudo systemctl restart iptables

리눅스 방화벽 해제

# 모든 ARM 인스턴스에서

sudo ufw disable

Hosts 파일 수정

sudo nano /etc/hosts

# 아래 줄들 추가
<컨트롤러 노드 인스턴스의 전용 ip> <컨트롤러 노드 인스턴스의 공용 ip>
<워커 노드 인스턴스의 전용 ip> <워커 노드 인스턴스의 공용 ip>

Kubernetes 설치

Container runtime 설치

참고 글: https://tech.hostway.co.kr/2022/08/30/1374

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl enable --now docker && sudo systemctl status docker --no-pager
sudo usermod -aG docker worker
sudo docker container ls

# cri-docker Install
VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
echo $VER
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.arm64.tgz
tar xvf cri-dockerd-${VER}.arm64.tgz
sudo mv cri-dockerd/cri-dockerd /usr/local/bin/

# cri-docker Version Check
cri-dockerd --version

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

# cri-docker Active Check
sudo systemctl restart docker && sudo systemctl restart cri-docker
sudo systemctl status cri-docker.socket --no-pager 

# Docker cgroup Change Require to Systemd
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl restart docker && sudo systemctl restart cri-docker
sudo docker info | grep Cgroup

# Kernel Forwarding 
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

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

sudo sysctl --system

Kubelet, Kubeadm, Kubectl 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Kubenetes Initialize (컨트롤러 노드에서만)

sudo kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock

sudo kubeadm init --ignore-preflight-errors=all --apiserver-cert-extra-sans=<컨트롤러 노드 인스턴스의 public ip> --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=<컨트롤러 노드 인스턴스의 public ip> --cri-socket /var/run/cri-dockerd.sock

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

Inititalize 후 출력되는 join 커맨트를 복사하기

Kubernetes Join (워커 노드에서만)

아래와 같이 위에서 복사한 커맨드에 --cri-socker 옵션을 추가

kubeadm join <컨트롤러 노드 인스턴스의 public ip>:6443 --token ~ --discovery-token-ca-cert-hash ~ --cri-socket /var/run/cri-dockerd.sock

Kubernetes 설정

Calico (CNI) 설치

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Nginx Ingress 설치

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

nano deploy.yaml

1.
kind: Deployment
를
kind: DeamonSet
으로 변경

2. 그 아래에 spec 부분에 아래와 같은 구문 추가

spec:
  minReadySeconds: 0
  ...
  template:
    metadata:
      labels:
        app.kubernetes.io/component: controller
        ...
    spec:
      #TODO: 아래 3줄 추가하기
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        effect: NoSchedule
      containers:
      - args:
        ...

3. 맨 밑에 있는 구문 주석처리하기

# ---
# apiVersion: admissionregistration.k8s.io/v1
# kind: ValidatingWebhookConfiguration
...
#   sideEffects: None

전체 deploy.yaml 파일

위 명령어 실행 후 아래 명령어를 실행

kubectl apply -f deploy.yaml

Nginx Ingress SSL 인증서 생성 도우미 설치

cert manager를 설치

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

issuer.yaml을 생성 및 적용

nano issuer.yaml

아래 코드 추가

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    #TODO: 이메일 주소 채우기
    email: <이메일 주소>
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx
kubectl apply -f issuer.yaml

Argocd 설치 및 Ingress 설정하기

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

서비스 접근을 위해 Ingress를 설정 (DNS를 통해 argocd 서브도메인 뚫어놓기)

nano argo-ingress.yaml

아래 코드 추가
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - argocd.<도메인>
    secretName: argo-tls-secret
  rules:
  - host: argocd.<도메인>
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              name: http
kubectl apply -f argo-ingress.yaml

OCI Load balancer 설정

Let's Encrypt로 Certification 만들기 (매크로용 AMD 인스턴스에서)

참고 글: https://blog.johnnybytes.com/how-to-use-and-renew-ssl-certificates-on-oracle-cloud-oci-load-balancers-3c3b4c72c136

ACME(Automatic Certificate Management Environment) 다운로드

curl — silent https://raw.githubusercontent.com/srvrco/getssl/latest/getssl > getssl ; chmod 700 getssl

ACME 설정하기

./getssl -c <사용할 도메인>

.getssl/getssl.cfg 수정하기

nano .getssl/getssl.cfg

아래와 같이 수정하기

# The staging server is best for testing (hence set as default) 
# CA="https://acme-staging-v02.api.letsencrypt.org" 
# This server issues full certificates, however has rate limits
CA="https://acme-v02.api.letsencrypt.org"
RENEW_ALLOW=”90" 
# Use the following 3 variables if you want to validate via DNS VALIDATE_VIA_DNS="true" 
DNS_ADD_COMMAND=/home/ubuntu/.getssl/dns_add_manual DNS_DEL_COMMAND=/home/ubuntu/.getssl/dns_del_manual

인증서 발급을 위한 DNS 검증 스크립트 가져오기

https://github.com/srvrco/getssl/tree/master/dns_scripts
위 링크에서 사용하는 DNS 서비스에 맞는 dnsadd<DNS 서비스>, dnsdel<DNS 서비스> 파일을 찾은 후
~/.getssl 하위에 저장하기
(필자는 cloudflare를 사용중이기에 cloudflare를 기준으로 작성하겠습니다.)

스크립트 상단 변수 채워주기

#!/usr/bin/env bash
# either configure here or export environment variables in getssl.cfg
email=${CF_EMAIL:-'<cloudflare 이메일>'}
key=${CF_KEY:-''}
api_token=${CF_API_TOKEN:-'<cloudflare API Token>'}
zone_id=${CF_ZONE_ID:-''}

cloudflare API Token 구하는 방법

.getssl/<사용할 도메인>/getssl.cfg 수정하기

nano .getssl/<사용할 도메인>/getssl.cfg

아래와 같이 수정하기

CA="https://acme-v02.api.letsencrypt.org"
PRIVATE_KEY_ALG="rsa"
#TODO: 사용할 도메인으로 수정하기
SANS="*.<사용할 도메인>"
PREFERRED_CHAIN="ISRG Root X1"
FULL_CHAIN_INCLUDE_ROOT="true"

인증서 발급하기

./getssl <사용할 도메인>

위 명령어 실행 후 몇 분정도 대기하면 아래와 비슷한 결과가 생성됩니다.

Requesting Finalize Link
Requesting Order Link
Requesting certificate
Certificate saved in /home/ubuntu/.getssl/example-domain.com/example-domain.com.crt
/home/ubuntu/.getssl/example-domain.com/example-domain.com.crt not returned by server
getssl: example-domain.com - rsa certificate obtained but not installed on server

왼쪽 상단 메뉴 -> ID & 보안 -> 인증서

인증서 생성 -> 임포트됨 선택 -> 임의의 인증서 이름 입력 -> 다음 -> 다음

위에서 부터 각각
인증서 - ~/.getssl/<사용할 도메인>/<사용할 도메인>.crt
인증서 체인 - ~/.getssl/<사용할 도메인>/fullchain.crt
전용 키 - ~/.getssl/<사용할 도메인>/<사용할 도메인>.key

대응되는 파일의 내용 붙여넣기하기

다음 -> 다음 -> 인증서 생성

인증서 갱신 자동화 하기

touch renew_certificate.sh && chmod +x renew_certificate.sh

nano renew_certificate.sh

아래 내용 넣기

#!/bin/bash
CERT_OCI_ID="<사용자 OCID>"
/home/ubuntu/ssl/getssl -q <사용할 도메인>

CERT_PATH=$(cat "/home/ubuntu/.getssl/<사용할 도메인>/<사용할 도메인>.crt")
CERT_CHAIN=$(cat "/home/ubuntu/.getssl/<사용할 도메인>/fullchain.crt")
CERT_KEY=$(cat "/home/ubuntu/.getssl/<사용할 도메인>/<사용할 도메인>.key")

oci certs-mgmt certificate update-certificate-by-importing-config-details --certificate-id=$CERT_OCI_ID --cert-chain-pem="$CERT_CHAIN" --certificate-pem="$CERT_PATH" --private-key-pem="$CERT_KEY"

사용자 OCID 구하는 경로
우측 상단 프로필 아이콘 -> 메뉴 맨 상단 버튼 클릭 -> OCID 복사하기

crontab -e

# 에디터가 열린 후

0 0 * * 4 ubuntu /home/ubuntu/renew_certificate.sh

# 붙여넣기 후 esc -> :wq -> enter

Load balancer 만들기

왼쪽 상단 햄버거 버튼 -> 네트워킹 -> 로드 밸런서 -> 로드 밸런서 생성

예약된 IP 주소 선택 -> 공용 IP 이름 (아무거나) 입력 -> 구획에 생성은 루트 선택

가상 클라우드 네트워크는 하나 있는 옵션 선택 -> 서브넷은 공용 서브넷 선택 -> 다음

백엔드 추가 -> ARM 인스턴스 두개 선택 -> 선택된 백엔드 추가

URL 경로는 /healthy-check
상태 코드는 404 로 변경
포트는 아래 방법을 통해 구한뒤 입력

포트 구하는 방법
컨트롤러 노드에서 실행

kubectl get svc ingress-nginx-controller -n ingress-nginx

출력 결과에서 PORT(S) 아래 30347 부분 복사하기

NAME                       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.111.108.78   <none>        80:30347/TCP,443:31906/TCP   42d

HTTPS 선택 -> SSL 인증서에서 위에서 만든 인증서 선택

다음 -> 제출

로드 밸런서 생성 이후

생성된 로드 밸런스 세부정보 -> 좌측 하단 리소스 -> 인증서 클릭

인증서 리소스를 로드 밸런스 관리 인증서로 변경 -> 인증서 추가

따로 생성한 인증서 붙여넣기 -> 인증서 추가 (저는 cloudflare를 통해 간단하게 15년짜리 ssl 인증서를 발급하였습니다.)

cloudflare로 15년 짜리 ssl 인증서 발급하는 방법
cloudflare 콘솔 -> SSL/TLS -> 클라이언트 인증서 -> 인증서 생성 -> 인증서 유효 기간 15년으로 선택 -> 생성 -> 인증서와 개인 키 복붙하기
자세한 방법

생성된 로드 밸런스 세부정보 -> 좌측 하단 리소스 -> 백엔드 집합 클릭

백엔드 집합 생성 -> 임의의 백엔드 집합 이름 넣기 -> SSL 사용 체크 후 로브 밸런서 관리 인증서 -> 아까 생성한 인증서 이름 선택

URL 경로는 /healthy-check
상태 코드는 404 로 변경
포트는 아래 방법을 통해 구한뒤 입력

포트 구하는 방법
컨트롤러 노드에서 실행

kubectl get svc ingress-nginx-controller -n ingress-nginx

출력 결과에서 PORT(S) 아래 31906 부분 복사하기

NAME                       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.111.108.78   <none>        80:30347/TCP,443:31906/TCP   42d

백엔드 집합 생성까지 완료 된 후
argocd.<사용할 도메인>에 접속하였을 때 잘 동작한다면 무료 Kubernetes cluster를 올바르게 구축한 것 입니다.

마무리

작년에 시도해보려다가 몇일간 시도끝에 실패한 뒤 올해 새로 사이드 프로젝트를 진행하고 싶어 다시 마음 먹고 약 1주일간 시도 끝에 성공해낸 방법을 담았습니다.

만약 서버비가 부담되시는 분들은 제가 설명드린 방법대로 무료 서버를 구축하여 인프라 구축 경험을 늘리며 좋은 사양의 서버를 무료로 사용하는 방법도 좋은 것 같습니다. 많은 분들에게 도움이 되었으면 좋겠습니다.

profile
프론트엔드 엔지니어

19개의 댓글

comment-user-thumbnail
2023년 11월 12일

오우.. 정리 아주 멋집니다. 내공이 대단하세요. 어디로 입금하면 되나요?? ㅎㅎ

1개의 답글
comment-user-thumbnail
2023년 12월 28일

대박이네요. 좋은 글 감사합니다.
Kubenetes Korea Group에 공유해도 괜찮을까요?

1개의 답글
comment-user-thumbnail
2024년 1월 16일

매크로 부분을 그대로 따라했는데 형식 오류가 계속 발생하네요 ㅜㅜ
최소한의 내용(oci compute instance launch --availability-domain $A --compartment-id $C --subnet-id $S --image-id $I)만 전송해도 동일한 오류가 발생하니 원인을 찾기가 힘드네요 ㅜㅜ

3개의 답글
comment-user-thumbnail
2024년 1월 25일

안녕하세요. oci로 따라해봤는데요.
Container runtime 설치 해당 명령어들이 arm 인스턴스에서는 에러가 발생합니다.
혹시 변경된점이 있는건가요?

cri-docker Install을 다 완료하고 version check를 하게 되면

-bash: /usr/local/bin/cri-dockerd: cannot execute binary file: Exec format error
에러가 발생합니다.

1개의 답글