Freesunny

zabbix에서 docker network interface 제외하는 방법

Zabbix

참고 : zabbix 4.0 

 

Administration > General > Regular expressions > Network interfaces for discovery

 

'Zabbix' 카테고리의 다른 글

[zabbix] TCP 모니터링 하는 법  (0) 2019.11.26
[Zabbix] redis 모니터링 방법  (0) 2019.09.10
[Zabbix] 디스크 모니터링 하는 방법  (0) 2019.09.10

Redis Cluster 구축 (redis cluster + predixy)

Redis

기존에 redis server 4 대 와 twemproxy 5 대를 가지고 서비스에 사용하고 있었는데, 

redis server 가 replication을 사용하지 않는 구조여서 redis cluster로 변경하였다.


redis cluster 방식으로 변경을 결정한 이유는 
* twemproxy 환경에서 redis server를 replication 구조로 가지고 가려면, sentinel 도 필요하고

* twemproxy는 master/slave를 자동으로 인식할 수 없기 때문에, redis master 서버 장애 발생 시, sentinel을 통해서 twemproxy 설정을 변경하고 재시작하는 스크립트를 구성해줘야 때문....

 

요구사항

* Redis Server는 Master/Slave 구조를 가진다. (Master 장애 시 Slave 가 Master로 승격)

* Sharding 구조 (필요시 노드 추가/삭제 가 가능하여함)

* 단일 엔드 포인트로 Sharding 처리 (APP에는 하나만의 endpoint 만 등록, proxy에서 모든 리다이렉션 처리)

 

redis cluster를 이용하여 sharding과 replication를 사용하기로 했고,

cluster 사용 시 node들 간의 리다이렉션 처리가 문제가 있는데, 이러한 문제를 해결할 수 있는 predixy를 사용해 보기로 하였다.

 

* 참고 사이트 : http://blog.haandol.com/2018/09/07/redis-cluster-predixy.html

 

기존 구조 : redis server 4대, twemproxy 5 대

기존 구조 : redis server 4 대 + twemproxy 5 대

 

변경되는 구조 : redis server 8 대, predixy 4 대  

변경되는 구조 : redis server 8 대, predixy 4 대

 

1. 서버 설치

 

OS : Ubuntu 18.04

Redis : redis 5.0.6 (패키지로 설치)

Redis 패키지 설치 방법

$ sudo add-apt-repository ppa:chris-lea/redis-server
$ sudo apt update
$ sudo apt -y install redis-server
$ sudo systemctl enable --now redis-server

/etc/redis.conf 편집

디폴트 설정에서 아래의 부분만 변경하고, 그 밖에 설정은 서비스에 맞게 설정한다.

bind 0.0.0.0                          # 다른 노드, proxy 에서 접속을 위해서
port 8000                             # 서비스에 필요한 포트로 변경
masterauth  xxxxxxxxxxx               # master/slave 간에 사용하는 패스워드
requirepass yyyyyyyyyyy               # cluster node 간에 사용하는 패스워드
cluster-enabled yes                   # cluster 활성화
cluster-config-file nodes-8000.conf   # cluster config 파일네임
cluster-node-timeout 5000             # default 150000 > 5000

redis-server 재시작 (sudo systemctl restart redis-server.service)

모든 redis 노드들을 동일하게 세팅한다.

 

 

2. create cluster

 

redis 노드 중에 1대에 접속하여 redis-cli로 cluster를 만든다. (노드들의 ip 및 포트는 설정에 맞춰서 입력)

redis-cli --cluster create \
192.168.0.218:8000 \
192.168.0.220:8000 \
192.168.0.222:8000 \
192.168.0.226:8000 \
192.168.0.219:8000 \
192.168.0.221:8000 \
192.168.0.223:8000 \
192.168.0.225:8000 \
--cluster-replicas 1 -a yyyyyyyyyyy

 

redis-cli로 node 상태 확인

$ redis-cli -8000 -a yyyyyyyyyyy
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:8000> cluster info
d57127549b3a9e0f4c0485c99c6a7c766efb18a9 192.168.0.225:8000@18000 slave 691dd7088a7fccc52abe41a46746a73bca626c53 0 1572927545000 8 connected
691dd7088a7fccc52abe41a46746a73bca626c53 192.168.0.222:8000@18000 master - 0 1572927545528 3 connected 8192-12287
de8facc5f968f66e34ad7f40a88bd56129f63b58 192.168.0.220:8000@18000 slave 792e379426277a0d9d9c2586ab5d174d5a9fc5f5 0 1572927545528 9 connected
3e63ba3104a715e8c34009ef63e846171813b00b 192.168.0.221:8000@18000 slave 04342d3da7cba17e3b7e9506c1becab2fef8ca79 0 1572927546000 6 connected
5770c42d086c1ed6414358172109f9c6dcff4a5d 192.168.0.219:8000@18000 master - 0 1572927546934 10 connected 12288-16383
328b18957c6b0822d8abccba4d498b297871d271 192.168.0.226:8000@18000 slave 5770c42d086c1ed6414358172109f9c6dcff4a5d 0 1572927545428 10 connected
792e379426277a0d9d9c2586ab5d174d5a9fc5f5 192.168.0.223:8000@18000 master - 0 1572927546434 9 connected 4096-8191
04342d3da7cba17e3b7e9506c1becab2fef8ca79 192.168.0.218:8000@18000 myself,master - 0 1572927545000 1 connected 0-4095

 

3. predixy 설정

 

docker-ce, docker-compose 설치

$ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt update
$ sudo apt install -y docker-ce
$ sudo usermod -aG docker $USER
$ sudo chmod +/usr/local/bin/docker-compose
$ sudo ln -/usr/local/bin/docker-compose /usr/bin/docker-compose
 

* docker-compose 최신 버전은 1.24.1이었으나, 간헐적인 지연 현상이 발생하여, 1.23.2로 설치하였다.

 

predixy docker-compose 파일 설치 (Haandol님 저장소 clone)

$ git clone https://github.com/haandol/predixy
$ cd predixy
 

 

conf/predix.conf 수정

$ cat conf/predixy.conf | egrep -"^#|^$"
Name redis-proxy
Bind 0.0.0.0:9000 # 컨테이너의 서비스 포트로 변경
WorkerThreads 4
MaxMemory 0
ClientTimeout 300
BufSize 4096
LogRotate 1d
LogVerbSample 0
LogDebugSample 0
LogInfoSample 10000
LogNoticeSample 1
LogWarnSample 1
LogErrorSample 1
Include auth.conf
Include cluster.conf
Include latency.conf

 

conf/cluster.conf 수정

$ cat conf/cluster.conf | egrep -"^#|^$"
ClusterServerPool {
    Password yyyyyyyyyyy  # predixy > redis clsuter 접속시 사용할 패스워드
    MasterReadPriority 60
    StaticSlaveReadPriority 50
    DynamicSlaveReadPriority 50
    RefreshInterval 1
    ServerTimeout 1
    ServerFailureLimit 10
    ServerRetryTimeout 1
    KeepAlive 120
    Servers {
        + 192.168.0.218:8000
        + 192.168.0.219:8000
        + 192.168.0.220:8000
        + 192.168.0.221:8000
        + 192.168.0.222:8000
        + 192.168.0.223:8000
        + 192.168.0.226:8000
        + 192.168.0.225:8000
    }
}

* 설정상으로는 Master/Slave 의 Read 처리 비율도 조정이 가능한 것으로 보인다.

 

conf/auth.conf 수정

$ cat conf/auth.conf | egrep -"^#|^$"
Authority {
    Auth zzzzzzzzzzz {
        Mode read
    }
    Auth zzzzzzzzzzz {
        Mode write
    }
    Auth zzzzzzzzzzz {
        Mode admin
    }
}

* app > predixy 접속 시 사용할 패스워드 설정

 

docker-compose.yml

$ cat docker-compose.yml
version: '3.4'
services:
  predixy:
    restart: always
    image: haandol/predixy:latest
    volumes:
      - ./conf:/etc/predixy/conf
    ports:
      - 9000:9000

* 재부팅해도 다시 실행되도록,

* 컨테이너 포트, 호스트 포트 수정

 

실행

$ docker-compose up -d

 

접속 후 predixy 서비스 포트로 접속을 하면 됨.
마스터 장애 시 슬레이브가 마스터로 변경되는 것을 확인할 수 있다.

docker-compose 설치 - 1.23.2

Docker

docker-compose 최신 버전(1.24.1)을 설치한 후에 실행 시 간헐적인 지연 현상(30초 ~ 1분 정도) 이 발생하여, 1.23.2 버전으로 낮추었다.

 

설치 명령 

sudo chmod +/usr/local/bin/docker-compose
sudo ln -/usr/local/bin/docker-compose /usr/bin/docker-compose
 

 

container netstat 확인하는 방법

Docker

container 의 PID 확인
# docker inspect -f '{{.State.Pid}}' container_id or container_name

해당 PID의 netstat 확인

# nsenter -t PID -n netstat

예제)

# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
48ed5791585e        dockeropggredis_redis-slave2   "docker-entrypoint..."   2 years ago         Up 4 months         0.0.0.0:8002->6379/tcp   dockeropggredis_redis-slave2_1
a72d895ea6dc        dockeropggredis_redis-slave1   "docker-entrypoint..."   2 years ago         Up 4 months         0.0.0.0:8001->6379/tcp   dockeropggredis_redis-slave1_1
# docker inspect -f '{{.State.Pid}}' 48ed5791585e
1746
# nsenter -t 1746 -n netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.11:42577        0.0.0.0:*               LISTEN
#

 

docker-compose 로 bridge network 변경하기

Docker

docker의 bridege network 주소가 사용하고 있는 사설 주소와 충돌이 나서 통신이 안되는 경우가 발생하면,

docker-compose.yaml 내에 아래의 설정으로 network 주소를 변경할 수 있다.

 

networks:
 default:
  ipam:
   driver: default
   config:
   - subnet: 172.27.3.0/24

 

쿠버네티스 대시보드 편하게 접속하기(#1)

Kubernetes

EKS로 쿠버네티스 클러스터를 셋팅하였는데, kubeproxy 를 로컬에 띄어서 로컬로 접속하는 방식인데, 
서버를 통해서 접속하는 방식으로 바꿨다. 

<변경 사유>

  • 매번 명령을 실행시키기 번거롭다.
  • 여러 개의 클러스터를 관리해야 한다. (aws 계정도 여러 개 사용)
  • HTTPS를 사용하고 싶다.
  • 사내에 사용가능한 리눅스가 있다.
  • 사용빈도가 매우 높지 않다.
  • 비용을 쓰고 싶지 않다. (ELB로 접속하는 방식이 있으나...)

대시보드에 ELB를 붙여서 접속하는 방법도 있으나, 비용적인 부분과 사용빈도가 크지 않기 때문에,
사내에 있는 linux 를 x통해서, 접속하는 방식으로 변경해 보았다.

 

접속도

 

 

여러 개의 계정과 여러 개의 클러스터를 관리해야 하기 때문에, docker container 를 통해서 구축 하였다.

파일 : build/Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl ca-certificates python python-pip vim
RUN pip install awscli

RUN apt-get update && apt-get install -y apt-transport-https
RUN curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list
RUN apt-get update
RUN apt-get install -y kubectl

ARG SECRET_ID
ARG SECRET_KEY
ARG REGION
ARG CLUSTER

RUN mkdir -p /root/.aws
RUN echo "[default]" > /root/.aws/credentials
RUN echo "aws_access_key_id=$SECRET_ID" >> /root/.aws/credentials
RUN echo "aws_secret_access_key=$SECRET_KEY" >> /root/.aws/credentials
RUN echo "region=$REGION" >> /root/.aws/credentials
RUN aws eks update-kubeconfig --region $REGION --name $CLUSTER

패키지 업데이트, awscli, kubectl 설치

(변수로 받아서)credentials 파일 생성, (변수로 받아서) kubeconfig 생성

 

파일 : docker-compose.yaml

version: '3.5'
services:
 eks-kubeproxy:
  build:
   context: ./build
   dockerfile: Dockerfile
   args:
    SECRET_ID: "XXXXXXXXXXXXXXXXXXXX"
    SECRET_KEY: "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
    REGION: "ap-northeast-2"
    CLUSTER: "eks-cluster"
  image: eks-cluster
  restart: always
  ports:
   - "8080:8080"
  command: >
   bash -c "kubectl proxy --port=8080 --address=0.0.0.0 --disable-filter=true &"

 

 

docker-compose build & 실행

# docker-compose build
# docker-compose up -d

'Kubernetes' 카테고리의 다른 글

kubernetes 노드 변경  (0) 2019.08.05
nodeAffinity 를 이용하여 pod 를 원하는 노드에 배포하기  (0) 2019.07.31
Service 재시작 하기  (0) 2019.07.25
EKS 쿠버네티스 대시보드 접속  (0) 2019.07.23
Pod 재시작 하기  (0) 2019.07.15