리눅스로 한 학기 살기 프로젝트-8.5

ashcircle·2025년 5월 6일

오늘은 쿠버네티스를 도커 컨테이너로 구동해서 컨테이너 위에서 디코봇을 실행하려 한다.

파일 위치는 project1 아래 모두 넣어둔다.

디코 봇은 저번과 동일하다.

import os
import discord

# 환경변수에서 토큰 읽기
TOKEN = os.environ['BOT_TOKEN']

# Intents 설정 (메시지, 멤버 등 필요한 권한 활성화)
intents = discord.Intents.default()
intents.message_content = True  # 메시지 내용 읽기 권한 (discord.py 2.x 이상에서 필수)

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.content.lower() == 'hello':
        await message.channel.send(f'Hello, {message.author.display_name}!')

client.run(TOKEN)

다음은 dockerfile을 만든다.

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "discord_bot.py"]

다음으로 requirements.txt를 만들어 설치할 라이브러리를 명시한다.

discord.py

minikube의 Docker 데몬을 사용하도록 환경을 설정한 뒤 이미지를 빌드한다.

$ eval $(minikube docker-env)
$ docker build -t discord-bot:latest .

minikube를 제한된 리소스에서 도커로 실행한다.

$ minikube start --driver=docker --cpus=2 --memory=4096

봇 토큰을 secret으로 저장한다.

kubectl create secret generic discord-bot-secret --from-literal=BOT_TOKEN=여기에_디스코드_봇_토큰_입력

deployment.yaml을 작성한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: discord-bot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: discord-bot
  template:
    metadata:
      labels:
        app: discord-bot
    spec:
      containers:
      - name: discord-bot
        image: discord-bot:latest
        env:
        - name: BOT_TOKEN
          valueFrom:
            secretKeyRef:
              name: discord-bot-secret
              key: BOT_TOKEN
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1

하단의 strategy를 추가해 무중단 배포를 적용한다.

maxUnavailable: 0 : 업데이트 중 항상 모든 파드가 서비스에 남아 있도록 한다.
maxSurge: 1 : 업데이트 중 새 파드를 기존 파드 수보다 1개 더 생성할 수 있다.

배포

kubectl apply -f deployment.yaml

다음 포스트에서는 jenkins ci/cd 시스템을 구축하여 코드를 push하면 자동으로 빌드와 배포를 해주는것 까지 해보려한다.

profile
안녕하세요 코린이입니다.

0개의 댓글