pod 를 통해 내부에서 사용하는 내부 DNS 정보를 확인한다. 아래 명령에서 resolv.conf
조회를 통해 DNS 패턴을 읽어올 수 있다. default.svc.cluster.local 앞에 서비스 명을 붙이면 POD를 찾아 갈 수 있다. MaxScale의 경우 서비스 명이 maxscale1 이니 maxscale1.default.svc.cluster.local 가 DNS 명이다. 헤더리스로 운영되는 mariadb의 경우 서비스명 앞에 추가로 pod명을 추가해야 한다. 예를 들어 mariadb-0 의 경우 mariadb-0.mariadb.default.svc.cluster.local 가 된다.
vagrant@slave1:~$ k get po && k get svc
NAME READY STATUS RESTARTS AGE
mariadb-0 1/1 Running 1 (113m ago) 18h
mariadb-1 1/1 Running 1 (112m ago) 18h
mariadb-2 1/1 Running 1 (113m ago) 18h
maxscale1-6867fc9bfb-7hcpj 1/1 Running 1 (113m ago) 18h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
mariadb ClusterIP None <none> 3306/TCP 19h
maxscale1 NodePort 10.107.131.95 <none> 8989:30949/TCP,3306:30857/TCP 54m
vagrant@slave1:~$ k exec -it mariadb-0 -- cat /etc/resolv.conf
Defaulted container "mariadb" out of: mariadb, init-mariadb (init)
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
찾아낸 DNS 명으로 mariadb 내에서 타 mariadb 로 접속할 수 있다. 아래처럼 mariadb-0에 접속해서 mariadb-1로 접속을 한다.
root@mariadb-0:/# mariadb -uroot -psecret -h mariadb-1.mariadb.default.svc.cluster.local
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 11.6.2-MariaDB-ubu2404-log mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
mariadb-0,mariadb-1,mariadb-3 는 각기 아래의 DNS로 접근할 수 있다.
mariadb-0.mariadb.default.svc.cluster.local
mariadb-1.mariadb.default.svc.cluster.local
mariadb-2.mariadb.default.svc.cluster.local
MaxScale의 데이터베이스 서버의 IP대신 위의 DNS를 사용해서 연결해야 장애가 난 후 POD의 IP가 바뀌더라도 접속을 이어갈 수 있다.
아래의 내용을 저장해서 maxscale.cnf 파일로 생성한다. MaxScale을 통해 접속을 하면 위 데이터베이스 서버 중 하나로 접속을 라우팅할 수 있다.
[maxscale]
admin_secure_gui=false
threads=auto
maxlog=true
syslog=true
logdir=/var/log/maxscale/
log_debug=true
admin_host=0.0.0.0
[server1]
type=server
address=mariadb-0.mariadb.default.svc.cluster.local
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=mariadb-1.mariadb.default.svc.cluster.local
port=3306
protocol=MariaDBBackend
[server3]
type=server
address=mariadb-2.mariadb.default.svc.cluster.local
port=3306
protocol=MariaDBBackend
[RW-Split-Router]
type=service
router=readwritesplit
servers=server1,server2,server3
user=repl
password=secret
[RW-Split-Listener]
type=listener
service=RW-Split-Router
protocol=MariaDBClient
port=3306
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,,server3
user=repl
password=secret
위 설정 파일을 이용해서 컨피그맵을 생성한다.
k delete cm maxscale
k create configmap maxscale --from-file=maxscale.cnf
k rollout restart deploy maxscale1
MaxScale용 사용자와 패스워드를 repl, secret로 정의했다. mariadb-0로 접속해서 사용자를 생성한다. mariadb-1,mariadb-2 로 생성된 사용자 데이터가 동기화되었음을 확인한다.
MariaDB [(none)]> CREATE USER 'repl'@'%' IDENTIFIED BY 'secret';
Query OK, 0 rows affected (0.008 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------+
| User | Host |
+-------------+-----------+
| repl | % |
| root | % |
| healthcheck | 127.0.0.1 |
| healthcheck | ::1 |
| healthcheck | localhost |
| mariadb.sys | localhost |
| root | localhost |
+-------------+-----------+
7 rows in set (0.002 sec)
위 과정이 끝나면 웹 콘솔에서 아래와 같은 대시보드 확인이 가능하다.