자바 개발하려면 무료툴로는 eclipse가 좋긴 하지만 무거운 감이 있다.
어딘가 k8s 클러스터에 띄워놓고 필요할때 web으로 붙으면 사용 가능한 개발환경을 구성해보자.
statefulset으로 codeserver를 띄우는데 생성되는 파드마다 각각의 스토리지와 서비스를 갖도록 해보자
구성 순서
- .git-credentials, .gitconfig파일 생성
- linuxserver/codeserver 이미지를 베이스로 하여 git-credentials, gitconfig를 포함하고 openjdk11과 maven, gradle 설치하는 Dockerfile 생성
- 이미지빌드
nexus 연결config 관련 persistentVolume 생성
Dockerfile을 만들고 빌드해보자.
#GIT_CREDENTIALS 은 ID:token@gitlab주소
#예시) https://my-id:my-token-hash@my-gitlab.gitlab-domain.co.kr
echo ${GIT_CREDENTIALS} > .git-credentials
#GIT_CONFIG 예시
#[credential "https://my-gitlab.gitlab-domain.co.kr/"]
# helper = store
printf "%s" "${GITCONFIG}" > .gitconfig
cat <<EOF > Dockerfile
FROM linuxserver/code-server:4.90.3
COPY .git-credentials /config/.git-credentials # dockerhub제외
COPY .gitconfig /config/.gitconfig # dockerhub제외
RUN apt-get update && apt-get install -y openjdk-11-jdk && apt-get clean
RUN apt-get update && apt-get install -y maven && apt-get clean
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
RUN apt-get install -y unzip wget
RUN wget --no-check-certificate https://services.gradle.org/distributions/gradle-7.6.4-bin.zip
RUN unzip gradle-7.6.4-bin.zip
RUN sudo mv ./gradle-7.6.4 /opt/gradle
RUN sudo ln -s /opt/gradle/gradle-7.6.4 /opt/gradle/latest
ENV GRADLE_HOME=/opt/gradle
RUN export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin:/opt/gradle/bin
RUN rm -rf gradle-7.6.4-bin.*
EOF
#빌드
#.gitcredential, .git-config 제외한 이미지를 도커허브에 올렸습니다.
docker build -t docker.io/mooneyred/codeserver:jdk11-mvn-gradle --platform linux/amd64,linux/arm64 .
도커허브 바로가기 https://hub.docker.com/r/mooneyred/codeserver
https://hub.docker.com/r/mooneyred/codeserver
hub.docker.com
이제 k8s 배포를 해보자. statefulset으로 배포하고 replicas가 증가할때마다 별도의 서버처럼 동작하도록 서브패스를 지정하여 pv를 마운트한다. nexus 연결을 위한 settings.xml 관련 설정도 하였으나 이 설정모두 optional이기 때문에 주석처리하였다.
kind: StatefulSet
apiVersion: apps/v1
metadata:
name: codeserver
namespace: default
labels:
app: codeserver
spec:
replicas: 1
selector:
matchLabels:
app: codeserver
template:
metadata:
creationTimestamp: null
labels:
app: codeserver
spec:
#volumes:
# - name: codeserver-workspace
# persistentVolumeClaim:
# claimName: codeserver-workspace
# - name: codeserver-extension
# persistentVolumeClaim:
# claimName: codeserver-extension
# - name: codeserver-data
# persistentVolumeClaim:
# claimName: codeserver-data
# - name: codeserver-common
# persistentVolumeClaim:
# claimName: codeserver-common
# - name: m2-settings-xml
# configMap:
# name: mvn-settings-sample
# defaultMode: 420
containers:
- resources:
limits:
cpu: 1500m
memory: 3Gi
requests:
cpu: 500m
memory: 2Gi
terminationMessagePath: /dev/termination-log
name: code-server
env:
- name: SUDO_PASSWORD
value: init123!
- name: PASSWORD
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: PROXY_DOMAIN
value: $(POD_NAME).supermoon.it
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: PATH
value: >-
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-11-openjdk-amd64/bin:/opt/gradle/bin
ports:
- containerPort: 8443
protocol: TCP
imagePullPolicy: IfNotPresent
#volumeMounts:
# - name: codeserver-workspace
# mountPath: /config/workspace #project 저장 경로
# subPathExpr: $(POD_NAME) # 스테이트풀셋의 파드명을 서브디렉토리로 설정하여 파드별 고유공간 지정
# - name: codeserver-extension
# mountPath: /config/extensions #extension 저장 경로
# subPathExpr: $(POD_NAME)
# - name: codeserver-data
# mountPath: /config/data #사용자 커스텀 설정과 캐시 저장
# subPathExpr: $(POD_NAME)
# - name: m2-settings-xml
# mountPath: /config/.m2/settings.xml #넥서스 연결을 위한 설정 컨피그맵 마운트 경로
# subPath: settings.xml
# - name: codeserver-common
# mountPath: /config/common # 파드간 파일 공유를 위한 경로
terminationMessagePolicy: File
image: docker.io/mooneyred/codeserver:jdk11-mvn-gradle
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
affinity: {}
schedulerName: default-scheduler
serviceName: ''
podManagementPolicy: OrderedReady
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 0
revisionHistoryLimit: 1
이제 서비스를 생성하고 노드포트로 노출하여 접속해본다.
java, mvn, gradle 모두 정상 동작하는 것을 확인할 수 있었다.

pvc를 설정하지 않으면 파드가 재시작 될때마다 모든 정보가 날아가기 때문에 주석부분 참고하여 지정하는 것을 추천한다.
728x90
'환경관련' 카테고리의 다른 글
| Claude Code, Gemini CLI SELF_SIGNED_CERT_IN_CHAIN (1) | 2025.08.11 |
|---|---|
| IIS reverse proxy설정 - 폐쇄망 기준 (0) | 2025.07.14 |
| k9s (0) | 2024.10.23 |
| 내 도메인으로 k8s 클러스터 접근하기 (0) | 2024.04.04 |
| 미니pc에 k8s cluster 구축 (1) | 2024.04.03 |
