statefulset으로 vscode+ Maven + Gradle 환경 구성

2024. 11. 12. 15:41·환경관련

자바 개발하려면 무료툴로는 eclipse가 좋긴 하지만 무거운 감이 있다.

어딘가 k8s 클러스터에 띄워놓고 필요할때 web으로 붙으면 사용 가능한 개발환경을 구성해보자.

statefulset으로 codeserver를 띄우는데 생성되는 파드마다 각각의 스토리지와 서비스를 갖도록 해보자

구성 순서

  1. .git-credentials, .gitconfig파일 생성
  2. linuxserver/codeserver 이미지를 베이스로 하여 git-credentials, gitconfig를 포함하고 openjdk11과 maven, gradle 설치하는 Dockerfile 생성
  3. 이미지빌드
  4. nexus 연결 
  5. 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
'환경관련' 카테고리의 다른 글
  • Claude Code, Gemini CLI SELF_SIGNED_CERT_IN_CHAIN
  • IIS reverse proxy설정 - 폐쇄망 기준
  • k9s
  • 내 도메인으로 k8s 클러스터 접근하기
yunapapa
yunapapa
working on the cloud
    250x250
  • yunapapa
    supermoon
    yunapapa
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • 개발 (20)
        • java (17)
        • web (2)
        • MSX (1)
        • Go (0)
      • CloudNative (50)
        • App Definition & Developeme.. (17)
        • Orchestration & Management (4)
        • Runtime (3)
        • Provisioning (7)
        • Observability & Analysis (14)
        • event review (5)
      • AWS (7)
      • 환경관련 (17)
      • 취미생활 (0)
        • 맛집 (0)
        • 게임 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • CNCF Past Events
    • Kubernetes Korea Group
  • 공지사항

  • 인기 글

  • 태그

    dop-c02
    Java
    오블완
    istio
    AWS
    helm
    티스토리챌린지
    kubernetes
    gitlab
    springboot
    devops
    k8s
    OpenShift
    APM
    Pinpoint
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
yunapapa
statefulset으로 vscode+ Maven + Gradle 환경 구성
상단으로

티스토리툴바