
1๋ฌ ์ ํ ์๋ฒ๋ฅผ ๊ตฌ์ถํด ๋ณด๊ณ ์ถ์ด์ ์ฌ๋น๋ก ๋งฅ๋ฏธ๋๋ฅผ ๊ตฌ๋งคํ์ต๋๋ค.
8~9์์ ์ผ์ ์ด ๋ง์์ ๋ง์ ์๊ฐ์ ๋ค์ด์ง๋ ๋ชปํ์ง๋ง, ์ถ์ ์ฐํด๊น์ง ํ์ฉํ์ฌ ์ด๋ ์ ๋ ๊ตฌ์ถ์ ์๋ฃํ์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ถํ์ ์ ๋ฆฌํ ๊ณํ์
๋๋ค๋ง, ์งํ ๊ณผ์ ๊ณผ ์ค๊ฐ์ ๊ฒช์๋ ์ด๋ ค์์ ์ ์ด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํ ์๋ฒ, ๋งฅ๋ฏธ๋๋ฅผ ์ ํํ ์ด์
ํ ์๋ฒ๋ฅผ ๊ตฌ์ถํด ๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ ์ฌํด ์ด๋ถํฐ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
DevOps์ ๊ด์ฌ์ ๊ฐ์ง ๋ค๋ก ์ ๋ง์ ๊ณ ์ ํ ์๋ฒ๋ฅผ ๊ตฌ์ถํด ๋ณด๊ณ ์ถ์๊ณ ,
์ ๊ฐ ์ด์ ์ค์ธ ์ฌ์ด๋ ํ๋ก์ ํธ์ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ถ์ JSON ํ์์ผ๋ก ๋๊ณ ๋ฐ๋ก ์๋ฒ๋ฅผ ๋์ง ์๊ณ ์๋๋ฐ ์๊ฐ์ด ์ง๋๋ฉด์ ์ ์ง๋ณด์๋ ํ๋ค์ด์ง๊ณ ์ฌ๋ฌ ์ด์ ๋ก ์๋ฒ์ ํ์์ฑ์ ๋๋ผ๊ณ ์์์ต๋๋ค.
๊ทธ๋ผ์๋ ํ ์๋ฒ๋ฅผ ๋ง์ค์๋ ์ด์ ๋ ๊ฐ์กฑ๊ณผ ํจ๊ป ์ง๋ด๊ณ ์์ด ์์์ด๋ ๋น์ฉ ๋ฌธ์ ๊ฐ ๊ฑฑ์ ๋๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค LinkedIn์ ํ ๊ฒ์๊ธ์ ๋ณด๊ณ ๋งฅ๋ฏธ๋๋ผ๋ฉด ์ ๋ ฅ ์๋ชจ๋ ์ ๊ณ , ์์๊ณผ ๋ฐ์ด๋ ๋ฌธ์ ๊ฐ ์๊ฒ ๋ค๋ ์๊ฐ์ ๊ตฌ๋งค๋ฅผ ํ๊ฒ ๋์์ต๋๋ค.
์ฌ์์ ๊ธฐ๋ณธ ์ฌ์์์ RAM๋ง 16GB๋ก ์
๊ทธ๋ ์ด๋ํ์ฌ ๊ตฌ๋งคํ์์ต๋๋ค.
ํ์ฌ ์ฌ์ง ์ค์ธ ํ์ฌ์ ์ด์ ์๋ฒ์ ๋น๊ตํด ๋ณด์์ ๋, ์ด ์ ๋๋ฉด ์ํ๋ ์์ค์ ์๋ฒ๋ ๊ตฌ์ถ ๊ฐ๋ฅํ๊ฒ ๋ค๋ ํ๋จ์ ๋ด๋ ธ์ต๋๋ค.
๊ตฌ์ถ ๊ณผ์ ์์ ๊ฒช์ ์ด๋ ค์
macOS์ Kubernetes
macOS์ ๋ฆฌ๋ ์ค๋ ๋ชจ๋ UNIX ๊ณ์ด์ด์ง๋ง, ์๋ก ๋ค๋ฅธ ์ด์์ฒด์ ๋ผ๊ณ ๋ณด์์ผ ํ๊ณ ํนํ macOS๊ฐ M1/M2 ์นฉ์ ์ฑ์ฉํ ๋ค๋ก๋ ํธํ ๋ฌธ์ ๊ฐ ์๊ฐ๋ณด๋ค ๋ง์ต๋๋ค. ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ Kubernetes๋ฅผ ์ค์นํ ๋๋ ๊ฒช๊ฒ ๋์์ต๋๋ค.
ํต์์ ์ธ Kubernetes ์ค์น ๋๊ตฌ ๋๋ถ๋ถ์ ๋๋ผ์ด๋ฒ๋ฅผ ์๊ตฌํ๋๋ฐ, ๋ณดํต Docker Desktop์ ๋ง์ด ์๋ดํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ๋๋ฌด ๋ฌด๊ฑฐ์์ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์๊ณ ์ถ์๊ณ , ํนํ ๊ฐ์ฅ ์ฐธ๊ณ ์๋ฃ๊ฐ ๋ง์๋ minikube์ ๊ฒฝ์ฐ Docker ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ธ๋ถ๋ง์ ์๋น์ค๋ฅผ ๋ ธ์ถํ๋ ๊ณผ์ ์ด ๊น๋ค๋กญ๊ณ ๋ถํธํ์ต๋๋ค. ๊ทธ ์ธ kind๋ MicroK8s ๋ฑ์ ๋๊ตฌ๋ ์ฌ์ฉํด ๋ณด์์ง๋ง ๋ง์กฑ์ค๋ฝ์ง ์์๊ณ , HyperKit ๋๋ผ์ด๋ฒ์ฒ๋ผ M1/M2 ์นฉ์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์์ต๋๋ค.
๊ฒฐ๊ตญ ๋ง์ ์ํ์ฐฉ์ค ํ ์ ํํ ๊ฒ์ ์ด์ ์ ๋ง์กฑ์ค๋ฝ๊ฒ ์ฌ์ฉํ๋ Multipass + K3s์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋คํํ๋ ์ด์ ์ K3s ๊ตฌ์ถ ๊ณผ์ ์ ๊ธฐ๋กํด ๋์ด์, ๋น๊ต์ ์์ํ๊ฒ Kubernetes๋ฅผ ์ธํ
ํ ์ ์์์ต๋๋ค.
๊ฒฐ๊ตญ K3s๋ฅผ ํฌํจํด์ macOS์์ Kubernetes ํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ Docker ๋๋ VM์ ์ค๊ฐ์ ๋์ด์ผ ํ๋ค๋ ์ ์ด ๋ง์กฑ์ค๋ฝ์ง๋ ์์ต๋๋ค.
ํ์ง๋ง ๋จ์ ์ฑ๋ฅ๋ง์ผ๋ก ๋งฅ๋ฏธ๋๋ฅผ ์๋ฒ๋ก ์ ํํ ๊ฒ์ด ์๋์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ดํด์ผ ํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์ค์๋ ๋ฆฌ๋
์ค ์๋ฒ๋ฅผ ๊ผญ ๊ตฌ๋งคํด ๋ด์ผ๊ฒ ๋ค์.
macOS์ Docker ๋น๋
Docker ์ด๋ฏธ์ง ๋น๋์๋ GitHub Actions๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ๋งฅ๋ฏธ๋ ๋ด๋ถ์์ ์ํํ ์๋ ์์ง๋ง, ๋ฆฌ์์ค ์ฌ์ฉ์ ์ต๋ํ ์ค์ด๊ณ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๊ฐ๋ฅํ๋ฉด ํ์ฉํ๊ณ ์ถ์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค.
GitHub Actions๋ macOS์์ Docker ๋น๋ ์ง์์ด ๋น์ฝํด์ Ubuntu๋ก ๋น๋๋ฅผ ์ํํด์ผ ํ๋๋ฐ, ๋์ CPU ์ํคํ
์ฒ๊ฐ ๋ฌ๋ผ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋น๋์ ์คํ์ด ์ ๋๋๋ฐ GitHub Actions์์ ๋น๋ํ ์ด๋ฏธ์ง๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ฉํฐ ํ๋ซํผ์ ์ง์ํ๋๋ก Docker ๋น๋๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ด ๊ณต์ ๋ฌธ์์ ์์์ง๋ง ์ค์ ๋ก ์ ์ฉํด ๋ณด๋ ์๋๊ฐ ๋๋ฌด ๋๋ ค ์ฑํํ์ง ์์๊ณ , ์ต์ข
์ ์ผ๋ก๋ Distroless ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๋ ํ์ผ์ ๋งฅ๋ฏธ๋์ ํธํ๋๋ arm64 ์ํคํ
์ฒ ์ด๋ฏธ์ง์ ์ด๋์์ผ ์คํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค.
macOS์ Rust ๋น๋
ํ ์๋ฒ์ ๋ฐฐํฌํ๊ธฐ ์ํด ์ฒ์์ผ๋ก ๋ง๋ ๊ฒ์ด ํ์ผ ์๋ฒ์์ต๋๋ค.
Rust๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๊ธฐ๋ฅ์ด ๊ฐ๋จํ๊ณ ์ด๋ฒ ๊ธฐํ์ Rust๋ฅผ ์จ ๋ณด๊ณ ์ถ์ด์ ์ฑํํ๊ฒ ๋์์ต๋๋ค.
๋ค๋ง ์์์ ์ธ๊ธํ CPU ์ํคํ
์ฒ์ ์ฐจ์ด๋ก ์ธํด Rust ๋น๋ ํ์ผ๋ ์ ๋๋ก ์คํ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์กฐ์ฌํด ๋ณด๋ Rust๋ ํ๋ซํผ์ ์ง์ ํด์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ด ์์๊ณ , ์ฌ๋ฌ ์ํ์ฐฉ์ค๋ฅผ ๊ฑฐ์ณ ์ต์ข
์ ์ผ๋ก๋ ํ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ก ๊ตฌ์ฑํ์ต๋๋ค.
์๋๋ ๋น๋์ ์ฑ๊ณตํ Dockerfile ์ต์ข
๋ณธ์
๋๋ค.
FROM rust:latest AS builder
WORKDIR /app
COPY Cargo.toml .
RUN mkdir src
COPY src src
RUN apt update && apt upgrade -y
RUN apt install -y g++-aarch64-linux-gnu libc6-dev-arm64-cross
RUN rustup target add aarch64-unknown-linux-gnu
RUN rustup toolchain install stable-aarch64-unknown-linux-gnu
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
RUN cargo build --release --target aarch64-unknown-linux-gnu
FROM gcr.io/distroless/cc-debian12:latest-arm64 AS release
WORKDIR /app
COPY --from=builder /app/target/aarch64-unknown-linux-gnu/release/file-server-rust .
EXPOSE 8080
CMD ["./file-server-rust"]
๊ทธ ์ธ
-
VM ๋ด๋ถ IP๋ฅผ ๋คํธ์ํฌ์ ๊ณต๊ฐํ๊ณ ๊ณต์ ๊ธฐ๋ก ํฌํธํฌ์๋ฉํ๊ธฐ ์ํด Multipass VM์ ๋คํธ์ํฌ ์ค์ ์ด ํ์ํ์ต๋๋ค. ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
-
์ธ๋ถ์ ๋๋ฉ์ธ์ผ๋ก ์๋น์ค๋ฅผ ๊ณต๊ฐํ๊ธฐ ์ํด HTTPS ์ค์ ์ด ํ์ํ๋๋ฐ, ๊ธฐ์กด์ ์์ ํ๊ณ ์๋ ๋๋ฉ์ธ์ Cloudflare๋ก ์ด๊ดํ๊ณ cert-manager๋ก ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ๋๋ก ํ์์ต๋๋ค. Cloudflare๋ ์๋์ ์ผ๋ก ์ฝํ ํ ์๋ฒ์ ๋ณด์์ ๊ฐํ์์ผ ์ค ์ ์์ด์ ๊ณ์ ์ฌ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค.
-
Argo CD์ UI๋ฅผ ๋๋ฉ์ธ์ผ๋ก ๊ณต๊ฐํ ๋ Redirection์ด ๊ณ์ ๋ฐ์ํ์ฌ ์ฐ๊ฒฐ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์๋ง์ ์ด์๋ค์์ ๊ด๋ จ ๋ด์ฉ๋ค์ ์ฐพ์ ์ ์์๋๋ฐ, ์ ๋ ๊ฒฐ๊ตญ ์๋ ์ค์ ์ ์ถ๊ฐํ์ฌ ํด๊ฒฐํ์์ต๋๋ค.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: argocd-ingress annotations: cert-manager.io/cluster-issuer: tls-issuer kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/backend-protocol: "HTTP" spec: # ... -
์ถ๊ฐ๋ก ๊ณต์ ๊ธฐ์์ ๋งฅ๋ฏธ๋์ ๊ณ ์ IP๋ฅผ ๋ถ์ฌํ๊ฑฐ๋, ํฌํธํฌ์๋ฉ ์์ ์ ํด์ผ ํ๋๋ฐ ์ด ๋ถ๋ถ์ ๊ฒ์์ ํตํด ํด๊ฒฐํ์์ต๋๋ค. ์ค์ ๋ฒ์ด ๋ชจ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์๋ ๋ฐ๋ก ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
๋ง์น๋ฉฐ

์๊ฐ๋ณด๋ค ์ด๋ ค์์ด ๋ง์์ง๋ง, ์ด๊ธฐ ์ค์ ์ ์๋ฃํ๊ณ ํ ์คํธ์ฉ ํ์ผ ์๋ฒ๋ ์ธ๋ถ์ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
์ต๊ทผ ์ฌ์ด๋ ํ๋ก์ ํธ์ ์๋คํ์๋๋ฐ, ํ ์๋ฒ๋ฅผ ๊ตฌ๋งคํ๋ฉด์ ๋ช ํํ ๋ชฉํ๊ฐ ์๊ธฐ๋ ๊ณผ์ ์ด ์ด๋ ค์๋ ๊ณ์ ์๋ํ๊ฒ ๋๊ณ ํด๊ฒฐํ ๋ค์๋ ํฐ ์ฑ์ทจ๊ฐ์ ๋๋ผ๊ฒ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ผ๋ก๋ ๊ธฐ์กด์ ์๋น์คํ๋ ์ฌ์ด๋ ํ๋ก์ ํธ๋ค์ ๋ชจ๋ ํ ์๋ฒ๋ก ์ด๊ดํ๊ณ , ๋ชจ๋ํฐ๋ง ์์คํ ๋ ๊ตฌ์ถํ์ฌ ์์ฑ๋๋ฅผ ๋์ผ ๊ณํ์ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
- Support amd64 on M1 with docker instance ยท Issue #2422 ยท canonical/multipass ยท GitHub
- Multi-platform image | Docker Docs
- Rust: Docker Image Optimization With Multi-stage Builds - DEV Community
- Cross-compilation in Rust (kerkour.com)
- How to add a network to an existing instance | Multipass documentation
- ์ค๋ผํด ํด๋ผ์ฐ๋ ๋ฌด๋ฃ์ฟ ๋ฒ๋คํฐ์ค (K3S) ์๋ฒ์ ์ธ์ฆ์ ๋ฌ๊ธฐ - Hibernation IT
- Ingress Configuration - Argo CD - Declarative GitOps CD for Kubernetes (argo-cd.readthedocs.io)
- ERR_TOO_MANY_REDIRECTS ยท Issue #2953 ยท argoproj/argo-cd (github.com)