Docker 에 Keepalived + Nginx 를 설치 하고 높 은 사용 가능

Docker 에 Keepalived + Nginx 를 설치 하고 높 은 사용 가능
글 목록
  • Docker 에 Keepalived + Nginx 를 설치 하고 높 은 사용 가능
  • 준비 작업
  • centos 미 러 를 다운로드 하고 환경 설정
  • 다운로드 설치 Nginx
  • yum 소스 설정
  • 다운로드 설치 Keepalived
  • 컴 파일 설치
  • Keepalived 설정
  • 설정 검사
  • 테스트
  • 용기 스냅 샷 만 들 기
  • 메 인 용기 만 들 기
  • maser 용기 에 들 어가 설정 수정
  • 슬 레이 브 용기 에 들 어가 설정 수정
  • 테스트 Keepalived
  • 필요 목표: Centos 미 러 기반 Keepalived + Nginx 설치 및 사용 가능
    준비 작업
    centos 미 러 를 다운로드 하고 환경 설정
    $ docker pull centos #      centos
    $ docker images #     
    $ docker run -itd --name centos centos #         
    $ docker exec -it centos bash #     
    $ yum -y upgrade #       
    $ yum install -y yum-utils vim make wget gcc openssl openssl-devel popt-devel #       
    

    다운로드 설치 Nginx
    yum 원본 설정
    공식 참고 문서http://nginx.org/en/linux_packages.html
    $ cat /etc/yum.repos.d/nginx.repo
    
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    $ yum install -y nginx #    Nginx
    $ whereis nginx #       ,        /etc/nginx
    $ nginx -t #     
    $ nginx #   
    $ curl localhost #         
    

    다운로드 설치 Keepalived
    Keepalived 홈 페이지 최신 버 전 다운로드
    $ mkdir -p /mnt/software && cd /mnt/software 
    $ wget https://www.keepalived.org/software/keepalived-2.0.20.tar.gz
    $ docker cp keepalived-2.0.20.tar.gz centos:/mnt/ #    !!       copy
    $ tar -zxvf keepalived-2.0.20.tar.gz 
    

    컴 파일 설치
    $ cd keepalived-2.0.20
    $ ./configure --prefix=/usr/local/keepalived
    

    컴 파일 이 끝 난 후 다음 과 같은 경고 가 나타 날 수 있 습 니 다.
    *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
    

    제시 대로
    $ yum -y install libnl libnl-devel
    No match for argument: libnl
    No match for argument: libnl-devel
    Error: Unable to find a match: libnl libnl-devel
    

    what 에 일치 하 는 소프트웨어 원본 이 없 습 니까?VRRP 기능 만 사용 하면 됩 니 다. VRRP Framework 사용, VRRP VMAC 사용, VRRP authentication 을 Yes 로 확보 하면 됩 니 다. 물론 따로 RPM 을 찾 아 libnl 을 설치 할 수도 있 습 니 다.
    https://centos.pkgs.org/7/centos-x86_64/libnl-1.1.4-3.el7.x86_64.rpm.html
    $ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libnl-1.1.4-3.el7.x86_64.rpm
    $ wget http://mirror.centos.org/centos/7/os/x86_64/Packages/libnl-devel-1.1.4-3.el7.x86_64.rpm
    $ rpm -ivh libnl-1.1.4-3.el7.x86_64.rpm
    $ rpm -ivh libnl-devel-1.1.4-3.el7.x86_64.rpm
    $ ./configure --prefix=/usr/local/keepalived
    $ make && make install
    

    Keepalived 설정
    $ cp /mnt/software/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
    $ cp /mnt/software/keepalived-2.0.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    $ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    $ mkdir -p /etc/keepalived
    $ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    $ chmod +x /etc/init.d/keepalived
    $ ip address #    ip 172.17.0.2    eth0
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
        link/ipip 0.0.0.0 brd 0.0.0.0
    3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
        link/tunnel6 :: brd ::
    22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    

    기본적으로 Keepalived 설정 파일 을 / etc / keepalived / keepalived. conf 에 놓 습 니 다.
    ! Configuration File for keepalived
    
    global_defs {
    	 #       ,           
       router_id LVS_DEVEL
       enable_script_security
       #            
       script_user root
    }
    
    vrrp_script chk_nginx {
        script "/etc/keepalived/check.sh"
        #  2     nginx     
        interval 2 
        #     ,          -5
        weight -5
        # require 2 failures for KO
        fall 2
        # require 2 successes for OK
        rise 2
    }
    
    vrrp_instance VI_1 {
        #       MASTER      BACKUP
        state MASTER
        #          
        interface eth0
        #       virtual_router_id     
        virtual_router_id 51
        # MASTER       BACKUP    BACKUP  99
        priority 100
        # MASTER   BACKUP                 ,    
        advert_int 1 
        #     
        authentication { 
        		#          
            auth_type PASS
            auth_pass 1111
        }
        #   IP,          ,      
        virtual_ipaddress { 
            172.17.0.200
            172.17.0.210
        }
        track_script {
           chk_nginx
        }
    }
    
    $ cd /etc/keepalived
    $ touch check.sh
    $ chmod +x check.sh
    

    check. sh 스 크 립 트 내용 은 다음 과 같 습 니 다.
    #!/bin/bash
    Nginx=`ps -ef | grep nginx | grep -v grep | wc -l`
    echo 'nginx status ' $Nginx
    if [ $Nginx -eq 0 ]
    then
        echo 'nginx shutdown...'
        nginx
        echo 'start nginx ...'
        sleep 2
        if [ `ps -ef | grep nginx | grep -v grep | wc -l` -eq 0 ]
        then
    				ps -ef | grep keepalived | grep -v grep | awk '{print $2}' | xargs kill -9
    				echo 'kill keepalived...'
        else
    	echo 'nginx started...'
        fi
    fi
    echo 'script end...'
    

    스 크 립 트 역할: nginx 프로 세 스 가 존재 하지 않 을 때 자동 으로 nginx 서 비 스 를 다시 시작 합 니 다. 2 초 동안 휴면 하고 nginx 프로 세 스 를 다시 검사 합 니 다. 존재 하지 않 으 면 keepalived 서 비 스 를 중단 합 니 다.
    테스트 스 크 립 트:
    $ ps ax|grep nginx
       40 pts/1    S+     0:00 grep --color=auto nginx
    $ ./check.sh
    nginx status  0
    nginx shutdown...
    start nginx ...
    nginx started...
    script end...
    $ ps ax|grep nginx
       48 ?        Ss     0:00 nginx: master process nginx
       49 ?        S      0:00 nginx: worker process
       57 pts/1    S+     0:00 grep --color=auto nginx
    

    설정 검사
    $ keepalived -t
    

    이로써 Keepalived 와 Nginx 가 모두 설정 되 었 습 니 다.
    테스트
    용기 스냅 샷 만 들 기
    $ docker ps -a | grep centos
    ace32d2fa597 centos "/bin/bash" About an hour ago Up About an hour  centos
    $ docker commit ace32d2fa597 centos_keepalived_nginx:0.0.1 #         
    $ docker images | grep centos_keepalived_nginx
    centos_keepalived_nginx   0.0.1               801e75c18232        51 seconds ago      569MB
    

    마스터 용기 만 들 기
    스냅 샷 에 따라 마스터 용 기 를 만 듭 니 다.
    $ docker run --privileged -itd -p 6698:80 --name keepalived_master --hostname keepalived_master centos_keepalived_nginx:0.0.1 /usr/sbin/init
    $ docker run --privileged -itd -p 6699:80 --name  keepalived_slave --hostname keepalived_slave centos_keepalived_nginx:0.0.1 /usr/sbin/init
    

    maser 용기 에 들 어가 설정 수정
    $ docker exec -it keepalived_master bash #    master   
    $ vi /usr/share/nginx/html/index.html #           slave    
    $ nginx
    $ curl localhoast
    

    slave 용기 에 들 어가 설정 수정
    $ docker exec -it keepalived_master bash #    master   
    $ vi /usr/share/nginx/html/index.html #           slave    
    $ nginx
    $ curl localhoast
    

    테스트 Keepalived
    master 용기 의 keepalived 를 시작 합 니 다.
    $ docker exec -it keepalived_master bash
    $ keepalived
    $ curl 172.17.0.200 # curl 172.17.0.210
    $ ip address
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
        link/ipip 0.0.0.0 brd 0.0.0.0
    3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
        link/tunnel6 :: brd ::
    36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet 172.17.0.200/32 scope global eth0
           valid_lft forever preferred_lft forever
        inet 172.17.0.210/32 scope global eth0
           valid_lft forever preferred_lft forever
    

    slave 용기 의 keepalived 를 시작 합 니 다.
    $ docker exec -it keepalived_slave bash
    $ vi /etc/keepalived/keepalived.conf # state    BACKUP priority       100         99
    $ keepalived
    $ curl 172.17.0.200 # curl 172.17.0.210
    

    요약:
  • 172.17.0.200 과 172.17.0.210 은 모두 maser 용기 에 접근 한 내용
  • 을 발견 할 수 있 습 니 다.
  • master 에 있 는 keepalived 를 닫 으 면 슬 레이 브 용기 에 접근 하 는 내용 으로 자동 으로 전환 합 니 다
  • nginx 프로 세 스 가 존재 하지 않 을 때 nginx 를 다시 시작 하려 고 시도 합 니 다. nginx 시작 에 실패 하면 keepalived 서 비 스 를 닫 고 자동 전환
  • 남 겨 진 문제:
  • Docker 에 설 치 된 가상 IP 는 어떻게 외부 네트워크 를 방문 하 게 하고 어떻게 매 핑 을 합 니까?Docker 가 깊이 연구 하지 못 했 으 니 잘 부탁드립니다.
  • check. sh 스 크 립 트 에서 Nginx 서 비 스 를 검사 할 때 0 으로 돌아 갈 때 도 있 고 2 로 돌아 갈 때 도 있 습 니 다 (Nginx 서 비 스 는 모두 닫 힌 상태 입 니 다). 하지만 touch 로 새 파일 을 만 드 는 것 도 문제 없습니다!!왜 그 럴 까?

  • 어서 오 세 요. 같이 소통...

    좋은 웹페이지 즐겨찾기