티스토리 뷰

들어가는 말

  • docker와 kubernetes(이하 k8s)를 간단하게 활용해 보기 위한 portainer와 rancher를 소개합니다.

대상

  • docker / k8s에 대해 기초를 아시는 분
  • docker / k8s를 이용한 P.O.C. 를 위해, docker / k8s를 간단하게 구성해보고 싶으신 분
  • docker / k8s를 클러스터로 구축하여 사용해보고 싶으신 분

사족

  • 본 소개글은 docker / k8s에 대한 소개글이 아닙니다.
  • portainer와 rancher 두 가지 툴 모두 공식 가이드가 매우 잘 되어 있습니다.
    • 기술 공유 측면보다는 소개라는 측면에서 봐주시면 좋겠습니다.
  • 팀에서 구축하셔서 사용 중인 portainer와 rancher를 재구축하면서 정리한 글입니다.
  • k8s을 간단하게 사용하기 위해 minikube라는 선택지도 있습니다.
  • 잘못된 내용이나 더 보아야 할 내용이 있다면 알려주시면 많은 도움이 됩니다.

환경

  • WMI, WDI 환경에서 설치 및 동작 검증하였습니다.
    • 본 소개글에서는 ToastCloud Instance에 설치하는 것으로 내용을 전개하겠습니다.
  • OS
    • CentOS 7.x 이상 환경에서 검증하였습니다.
      • CentOS 6.x 환경에서도 가능하다고 알고 있지만 권장하지 않습니다.
      • docker service, stack, swarm 사용을 위해 docker 1.13 이상이 설치 가능한 환경이면 무방합니다.
  • 메모리
    • 시스템 최소사양은 없으나 8gb 메모리를 가진 환경을 권장합니다.
    • 램은 많을수록 쾌적한 환경이 됩니다.

준비

인프라

  • WDI 환경의 CentOS 7.1에서 진행합니다.
  • 인스턴스
    • CentOS 7.1, Standard, m2, m2.large, vCPU 4, RAM 8GB, HDD 100GB
    • 3 EA
  • 보안 그룹
    • 9000 TCP 허용
      • remote 사용하시는 환경의 NAT ACL 등록
  • Floating IP
    • 1 EA
  • 주의

    • 사용을 마친 서버 및 IP는 종료/반납하는 것이 좋습니다.

      그림 1.
  • 경험에 의거 ipv6 기능을 꺼 두는편이 진행하기 편했습니다.

    • sudo vi /etc/sysctl.conf
      • 변경 후 재시작이 필요합니다.

net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 net.ipv6.conf.eth0.disable_ipv6 = 1 net.ipv6.bindv6only = 0

  • 작업 중 firewalld 를 끄고 진행하였습니다.
    • sudo systemctl stop firewalld

docker (Docker CE)

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  • 설치 방법

$ sudo yum install docker-ce docker-ce-cli containerd.io

  • 실행 및 동작 확인

$ sudo systemctl start docker $ sudo docker version Client: Version: 18.09.4 API version: 1.39 Go version: go1.10.8 Git commit: d14af54266 Built: Wed Mar 27 18:34:51 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.4 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: d14af54 Built: Wed Mar 27 18:04:46 2019 OS/Arch: linux/amd64 Experimental: false

Portainer

소개

준비

  • docker swarm이 필요합니다.
  • 1번 서버
    • swarm init 수행

[centos@k8s-test-1 ~]$ docker swarm init Swarm initialized: current node (u60jtvwp7z7itarfj5lf9x83n) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3wzws4os45vj7yvk3w98b9ueuz86zh5u9ouftrgp383j5j88x9-6ker2n2qykfao8mbo4l0ev6gg \ 192.168.0.4:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

  • 2번, 3번 서버
    • swarm join 수행
    • 1번 서버에서 swarm init 한 결과물을 사용합니다.

[centos@k8s-test-3 ~]$ sudo docker swarm join --token SWMTKN-1-3wzws4os45vj7yvk3w98b9ueuz86zh5u9ouftrgp383j5j88x9-6ker2n2qykfao8mbo4l0ev6gg 192.168.0.4:2377 This node joined a swarm as a worker.

설치

$ curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml $ sudo docker stack deploy --compose-file=portainer-agent-stack.yml portainer Creating network portainer_agent_network Creating service portainer_agent Creating service portainer_portainer

  • 설치 완료 확인

접속

  • 1번 서버에 할당해 놓은 floating ip:9000으로 접속합니다.

    그림 2.

    그림 3.
  • 각 서버에 떠 있는 컨테이너들을 확인할 수 있습니다.
    • 현시점에서 portainer agent들이 상주하고 있습니다.

샘플 (kafka, zookeeper 설치)

  • 설치만 하고 바로 넘어가긴 섭섭하니 kafka, zookeeper 한벌씩 portainer를 통해 docker로 배포해 보겠습니다.

주키퍼 배포

  • portainer > Containers > Add container

    그림 4.
  • 설정
    • wurstmeister/zookeeper 이미지 사용
    • k8s-test-3.novalocal 에 배포
    • 2181 포트를 호스트에 매핑
  • 배포 완료 확인

    그림 5.

카프카 배포

  • portainer > Containers > Add container

    그림 6.
  • 설정
    • wurstmeister/kafka:2.11-0.11.0.3 이미지 사용
    • k8s-test-2.novalocal 에 배포
    • 9092 포트를 호스트에 매핑

      그림 7.
  • 추가 설정
    • KAFKA_ADVERTISED_PORT=9092
    • KAFKA_ZOOKEEPER_CONNECT=test-zookeeper:2181
    • KAFKA_ADVERTISED_HOST_NAME=test-kafka

      그림 8.
  • 그외 설정
    • kafka 가 동작하는 container의 /etc/hosts 에 zookeeper container를 띄운 호스트(k8s-test-3.novalocal)의 ip를 등록합니다.
    • kafka 가 동작하는 container에 자기 자신을 등록합니다.
  • 배포완료 확인

    그림9.

카프카 동작 확인

  • Containers > test-kafka > Console

    그림 10.

    그림 11.
  • 카프카 정상 동작 확인

Rancher

소개

  • https://rancher.com/
  • Multi-Cluster Kubernetes
    • Management Rancher is open-source software for delivering Kubernetes-as-a-Service.
  • web UI 기반으로 k8s를 배포, 관리, 모니터링할 수 있는 도구입니다.

준비

  • WDI 환경에서 rancher를 통해 k8s 클러스터를 관리하기 위해서, 보안정책에 추가 port 오픈이 필요합니다.
  • 보안 정책에서 inbound 포트를 허용하도록 등록합니다. (ipv4, ipv6 모두 해당되지만 ipv6를 끌 경우 ipv4 만 등록합니다.)
    2376 TCP
    2379-2380 TCP
    8472 UDP
    9099 TCP
    6783 TCP
    6783-6784 UDP
    10250 TCP
    10254 TCP
    30000-32767 TCP/UDP

설치

 

 

docker run -d --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  rancher/rancher:latest
  • 설치 및 실행 완료
  • 접속 확인
    • 최초 접속시 admin 계정의 비밀번호 및 server 주소를 설정합니다.
    • 서버 주소 등록 단계에서 public floating ip 로 기본 설정되어 있는데 floating ip 가 아닌 eth0 의 ip 로 변경해줍니다.
  • 1번서버의 floating ip 로 80포트로 접속

    그림12.

번외 - 초기화 방법

k8s 클러스터 생성

  • Clusters > Add Cluster
  • 클러스터 유형 Custom, Cluster 제공자 Custom 나머지 옵션은 기본 값으로 진행합니다.

    그림 13.

    그림 14.
  • 클러스터 생성이 완료되었습니다.

k8s 클러스터 배포

  • 2,3번 서버를 대상으로 클러스터를 배포합니다.
  • Clusters > 생성한 클러스터 선택

    그림 15.
  • Edit 메뉴 진입 가장 아래에 있는 노드 옵션 확인합니다.

    그림 16.

    그림 17.

2번 서버

  • etcd, Control Plane, Worker를 체크한 뒤 생성되는 명령어를 복사하여 2번 서버에서 실행합니다.

    그림 18.
  • 초기화에 일정 시간이 지난 뒤 정상적으로 등록된 것으로 나옵니다.
  • 도움말
    • 사내 인프라 환경에서는 문제가 없었는데 TC instance 환경에서 이 과정 진행 중 1번 서버 - 2번 서버 간 특정 포트에 대한 통신 실패가 발생했고 tcp 덤프로도 트러블슈팅이 잘 안되어 다음과 같은 조치 했습니다.
      • ipv6 기능 전체 끄기
      • rancher의 pre open 포트들을 전부 security group에 등록
      • firewalld 끄기
      • rancher 최초 구동 및 접속 시 등록하는 서버 ip 를 floating ip 로 등록하지 않고 private ip (192... ) 로 등록

3번 서버

  • Worker 만 체크한 뒤 3번 서버에서 실행합니다.

    그림 19.

k8s 클러스터 구축 완료 확인


그림20.

k8s 클러스터 활용 - rabbitmq

  • kubectl 을 동작할 환경을 준비합니다.
    • rancher 위에서 수행했습니다.

      그림 21.

      그림 22.
  • Kubeconfig File 버튼을 눌러서 내용을 kubectl 이 동작하는 환경의 ~/.kube/config에 저장합니다.
  • kubectl 이 설정을 참조하는지 확인합니다.
    • kubectl cluster-info
  • rabbitmq 폴더를 생성합니다.
  • rabbitmq-deployment.yaml을 다음과 같이 작성합니다.

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: rabbitmq labels: app: rabbitmq spec: replicas: 1 template: metadata: labels: app: rabbitmq spec: containers: - image: rabbitmq:3.6.10 name: rabbitmq ports: - containerPort: 5672

  • rabbitmq-svc.yaml을 다음과 같이 작성합니다.

apiVersion: v1 kind: Service metadata: name: rabbitmq labels: app: rabbitmq spec: ports: - port: 5672 selector: app: rabbitmq

  • 서비스를 배포한 뒤 rabbitmq 가 배포된 것을 확인합니다.
    • kubectl create -f ./rabbitmq
    • kubectl get all -l app=rabbitmq

      그림 23.
  • 정상 동작 확인

나가는 말

  • portainer는 docker를 사용하기 편하게 GUI로 제공해주는 툴로서 모든 기능은 docker cli 명령어로도 가능합니다.
  • k8s 클러스터를 사용하기 위해 rancher로 클러스터를 구축해서 이용해 보고 있는데, k8s 클러스터 자체에 큰 문제는 발견하지 못했습니다.
    • 다만, rancher를 이용하였을 때 클러스터 생성은 쉽지만, 삭제나 트러블슈팅은 약간 어렵습니다.
      • 트러블슈팅이 어려운 건 kubernetes를 깊게 알지 못하는 상태에서 쓰려고 하고 있어서 발생한 것으로 생각합니다.
    • rancher를 production 환경에서 사용하는 것은 어려울 수도 있습니다.

퍼온글 :  https://meetup.toast.com/posts/207

댓글