쿠버네티스 컨테이너 타임존 변경하기
컨테이너를 이용하여 애플리케이션을 실행시킬 때 타임존을 변경해야 하는 경우가 생길 수 있습니다. 예를 들어, 로그를 남길 때 시간을 기록하게 되는데, 이 시간이 자신의 타임존과 다르다면 많이 불편할 것입니다. 이럴 경우 컨테이너의 타임존을 자신이 속한 타임존으로 변경해주면, 개발자는 좀더 효과적으로 로그를 확인할 수 있습니다.
이 글에서는 컨테이너의 타임존을 변경하는 방법을 이용하여, 쿠버티스 포드(POD)를 실행할때 타임존은 변경해보도록 하겠습니다
기본 타임존 (UTC +0)
먼저 busybox
컨테이너 이미지를 이용하여 POD
를 생성해 보겠습니다.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: default-timezone spec: containers: - image: busybox name: busybox args: - sleep - "100000" EOF
생성한 default-timezone
포드가 정상적으로 작동되면, 실행중인 컨테이너의 shell에 접속해서 date
명령어를 실행해 보겠습니다.
kubectl exec -it default-timezone sh
/ # date Tue Jun 9 11:55:56 UTC 2020 / # strings /etc/localtime TZif2 TZif2 UTC0 / # exit
서울 타임존 (UTC +9)
이제 타임존을 UTC에서 한국의 서울(Asia/Seoul)로 변경해 보겠습니다.
새로운 타임존을 컨테이너에 주입하기 위하여, volumeMounts
와 volumes
을 사용하였습니다. volumes
에서 hostPath
를 이용하여 호스트 노드에 있는 /usr/share/zoneinfo/Asia/Seoul
을 포드에 추가합니다. 그런 다음 컨테이너에서 volumeMounts
필드를 이용하여 추가한 볼륨을 컨테이너의 /etc/localtime
로 마운트합니다. 다시 말해서, 호스트 노드에 있는 /usr/share/zoneinfo/Asia/Seoul
을 컨테이너의 /etc/localtime
로 마운트하는 것입니다.
다음은 타임존을 서울로 설정한 포드 예제입니다. 예제를 실행하면, seoul-timezone
포드가 생성됩니다.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name : seoul-timezone spec: containers: - image: busybox name: busybox args: - sleep - "100000" volumeMounts: - name: tz-seoul mountPath: /etc/localtime volumes: - name: tz-seoul hostPath: path: /usr/share/zoneinfo/Asia/Seoul EOF
생성한 seoul-timezone
포드가 정상적으로 작동되면, 실행중인 컨테이너의 shell에 접속해서 date
명령어를 실행해 보겠습니다.
kubectl exec -it seoul-timezone sh
/ # date Tue Jun 9 20:58:01 KST 2020 / # strings /etc/localtime TZif2 5qx TZif2 KST-9 / # exit
타임존 환경변수 설정
대부분의 경우 앞서 설명한 방법만으로 충분하지만, 혹시 안되는 경우가 있다면 다음과 같이 TZ
라는 환경 변수에 타임존을 직접 지정해 줄 수 있습니다.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name : seoul-timezone spec: containers: - image: busybox name: busybox env: - name: TZ value: Asia/Tokyo args: - sleep - "100000" volumeMounts: - name: tz-seoul mountPath: /etc/localtime volumes: - name: tz-seoul hostPath: path: /usr/share/zoneinfo/Asia/Seoul EOF
SpringBoot(자바) 애플리케이션에서 타임존 설정
다음은 SpringBoot 애플리케이션에 타임존 변경을 추가한 디플로이먼트 매니페스트 예제입니다.
apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: api-server app.kubernetes.io/component: server app.kubernetes.io/part-of: example name: api-server spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: api-server app.kubernetes.io/component: server app.kubernetes.io/part-of: example template: metadata: labels: app.kubernetes.io/name: api-server app.kubernetes.io/component: server app.kubernetes.io/part-of: example spec: containers: - env: - name: JAVA_TOOL_OPTIONS value: "-Xms1024m -Xmx2048m" - name: SPRING_PROFILES_ACTIVE value: develop - name: TZ value: Asia/Seoul image: kangwoo/api-server imagePullPolicy: Always name: api-server ports: - containerPort: 8080 name: http protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /actuator/health port: 8089 scheme: HTTP initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 livenessProbe: failureThreshold: 3 httpGet: path: /actuator/info port: 8089 scheme: HTTP initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 volumeMounts: - name: tz-seoul mountPath: /etc/localtime resources: limits: cpu: "1" memory: 2Gi requests: cpu: "1" memory: 2Gi dnsPolicy: ClusterFirst volumes: - name: tz-seoul hostPath: path: /usr/share/zoneinfo/Asia/Seoul restartPolicy: Always terminationGracePeriodSeconds: 30
참고로, 자바 애플리케이션의 경우 TZ
라는 환경 변수 대신에, system property로 다음과 같이 추가할 수도 있습니다.
-Duser.timezone=Asia/Seoul