ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] SVN Pod 생성
    인프라/Kubernetes 2020. 12. 7. 12:11
     

    Docker Hub

     

    hub.docker.com

    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를 이용하여 자동 배포 시스템을 적용시켜보자.

    댓글

Designed by Tistory.