-
[Kubernetes] SVN Pod 생성인프라/Kubernetes 2020. 12. 7. 12:11
garethflowers/svn-server의 Dockfile을 이용해서 svn을 띄우자
# vi Dockerfile FROM alpine:3.12.0 CMD ["/usr/bin/svnserve", "-d", "--foreground", "-r", "/var/opt/svn"] EXPOSE 3690 HEALTHCHECK CMD netstat -ln | grep 3690 || exit 1 VOLUME ["/var/opt/svn"] WORKDIR /var/opt/svn RUN apk add --no-cache \ subversion==1.13.0-r2 \ wget==1.20.3-r1
여기서 알아야할 점은 /usr/bin/svnserve서버를 --foreground로 실행하는 것이다.
HEALTHCHECK는 제대로 실행되고 있는지 확인하고 container가 즉시 종료됨을 방지함과 동시에 container가 제대로 동작한는지 확인하고 3690포트가 떠있지 않으면 exit 1 을 통해 오류로 인한 종료를 실행하게 된다.
Dockerfile을 작성할 때 중요한 점은 실행되고 바로 종료되어선 안된다는 것이다.
svnserve를 --foreground로 실행하는 이유도 background로 할 경우 실행되고 바로 종료되어 버리기 때문이기도 하고 이것을 방지하려고 HEALTHCHECK를 사용하는 것도 어느정도 있는것으로 보인다.
# docker build -t docker-registry.com:30500/svn:v1.0 .
Dockerfile build!
docker registry를 사용하고 있다. (설치링크) domain name과 port를 적어주고 /{tag이름}:{version}을 작성해주자.
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-registry.com:30500/svntest v1 5f2ebc162d8b 2 days ago 16.1MB
image 생성 확인
# docker push docker-registry.com:30500/svn:v1.0
docker push를 통해 registry로 등록
# curl docker-registry.com:30500/v2/svn/tags/list {"name":"svn","tags":["v1.0"]}
registry v2 api를 통해 확인해보니 등록이 잘 되어있다.
# vi svn.yaml apiVersion: v1 kind: Pod metadata: name: svn namespace: infra labels: app: svn spec: nodeName: kube-node2 containers: - name: svn image: docker-registry.com:30500/svn:v1.0 ports: - containerPort: 3690 volumeMounts: - mountPath: /var/opt/svn name: svn-home volumes: - name: svn-home hostPath: path: /var/opt/svn type: DirectoryOrCreate --- apiVersion: v1 kind: Service metadata: name: svn namespace: infra spec: type: NodePort selector: app: svn ports: - protocol: TCP port: 3690 targetPort: 3690 nodePort: 30369
Service, 외부 30369 port를 통해 svn에 접속가능, Pod, container속에 /var/opt/svn가 default svn repository여서 외부도 그냥 동일하게 하였다. host directory를 다른곳으로 정하려면 spec.volumes.hostPath.path를 변경하면 됨
# kubectl apply -f svn.yaml pod/svn created service/svn created
apply로 pod, service를 생성하자
# kubectl get pods -n infra NAME READY STATUS RESTARTS AGE docker-registry 1/1 Running 1 4d19h jenkins 1/1 Running 2 4d19h svn 1/1 Running 0 60s
svn pod 생성이 확인되었다.
svn repository 생성은 (morian-kim.tistory.com/14) 여기를 참조해서 Directory, 사용자, 권한 생성을 하도록 하자.
생성할 때 docker exec 명령어도 되고 kubectl exec 를 통해 접근도 가능하다.
ex)
# kubectl exec pod/svn -n infra -- svnadmin create --fs-type fsfs /var/opt/svn/test
# kubectl exec pod/svn -n infra -- ls -l /var/opt/svn/ total 0 drwxr-xr-x 6 root root 86 Dec 3 04:48 test
container 내부 생성확인
# ll /var/opt/svn 합계 0 drwxr-xr-x. 6 root root 86 12월 3 13:48 test
volume 설정된 host pc에도 생성 확인
또.. 생성 시간이 다른데 Dockerfile을 변경해서하려니 이미지 Layer가 늘어나고 또 registry에 등록해야하고 하는 번거로움이 있으니 ... yaml파일을 수정하여 설정을 변경해보자.
default timezone은 UTC 이다. 이를 KST로 변경해야한다.
# ll /etc/localtime lrwxrwxrwx. 1 root root 32 11월 12 03:03 /etc/localtime -> ../usr/share/zoneinfo/Asia/Seoul
host pc의 localtime 값
# kubectl exec pod/svn -n infra -- ls -l /etc/localtime ls: /etc/localtime: No such file or directory command terminated with exit code 1
svn container에는 존재하지 않는다.
설정값을 변경해보자
apiVersion: v1
kind: Pod
metadata:
name: svn
namespace: infra
labels:
app: svn
spec:
nodeName: kube-node2
containers:
- name: svn
image: docker-registry.com:30500/svn:v1.0
ports:
- containerPort: 3690
volumeMounts:
- mountPath: /var/opt/svn
name: svn-home
- mountPath: /etc/localtime
name: localtime
readOnly: true
volumes:
- name: svn-home
hostPath:
path: /var/opt/svn
type: DirectoryOrCreate
- name: localtime
hostPath:
path: /etc/localtime
type: File
---
apiVersion: v1
kind: Service
metadata:
name: svn
namespace: infra
spec:
type: NodePort
selector:
app: svn
ports:
- protocol: TCP
port: 3690
targetPort: 3690
nodePort: 30369
빨간부분을 추가하였다. hostPath의 type에 File은 File이 존재하여야 한다는 뜻이고, 다른 type이나 내용은 (kubernetes.io/ko/docs/concepts/storage/volumes/) 이곳을 참조하자.
mount 설정은 실행중에 changed가 되지 않으니 delete 후 apply 하도록 하자
# kubectl delete -f svn.yaml pod "svn" deleted service "svn" deleted # kubectl apply -f svn.yaml pod/svn created service/svn created
# kubectl exec -it svn -n infra -- date Mon Dec 7 12:06:40 KST 2020
변경확인!
이클립스를 통해 잘 동작하는 것을 확인하였다.
끝!
다음에는 현재 설치되어있는 svn, jenkins, docker registry를 이용하여 자동 배포 시스템을 적용시켜보자.
'인프라 > Kubernetes' 카테고리의 다른 글
[Kubernetes] Jenkins Pod 설치 (0) 2020.12.02 [Kubernetes] private docker registry Pod 설치 (0) 2020.12.02 [Kubernetes] Visual하게 DashBoard를 설치, 접속해보자 (2) 2020.11.26 [Kubernetes] 설치 명령어 모음 (0) 2020.11.26 [Kubernetes] Horizontal Pod Autoscaler (0) 2020.11.25