오늘은 쿠버네티스를 도커 컨테이너로 구동해서 컨테이너 위에서 디코봇을 실행하려 한다.
파일 위치는 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하면 자동으로 빌드와 배포를 해주는것 까지 해보려한다.