Amazon EKS, Azure AKS, Google GKE 등과 비슷하게 Oracle OKE에서도 Network LB가 제공된다.
Managed Kubernetes를 사용할 때 항상 등장하는 Load Balancer와 Network Load Balancer가 비슷하면서 약간 다른데,
Oracle Cloud Infrastructure의 User Manual에는 아래와 같이 설정하고 있다.
Load Balancer
A Load Balancer improves resource utilization, facilitates scaling, and helps ensure high availability. You can configure multiple load balancing policies and application-specific health checks to ensure that the load balancer directs traffic only to healthy instances. Includes: advanced proxy features such as layer-7 routing and SSL termination.
그림에서 묘사한 것처럼
HTTP
HTTPS
TCP
프로토콜을 사용하는 Backend 서비스만 지원한다.
따라서 UDP나 Dedicated Protocol을 사용하는 Backend 서비스가 있는 경우에 이 LB를 사용할 수 없다. ㅠㅠ
Network Load Balancer (일명, NLB)
A Network Load Balancer is a non-proxy layer-4 load balancing solution. It offers a scalable VIP to the customer and additionally provides the benefits of flow high availability, low latency, and source IP and port preservation. Includes:layer-4 pass-through load balancing and client header preservation.
그림에서 묘사한 것처럼
TCP
UDP # <-- 이것이 LB와 NLB가 다른 부분이다.
기타... 아무거나 다 (Any ~~~) # <-- 이것이 LB와 NLB가 다른 부분이다.
프로토콜을 사용하는 Backend 서비스를 지원한다.
그런데 Oracle Cloud Infra에서는 이 NLB(Network LB)는 3개까지만 사용하도록 제한하고 있다.
OCI Web Console에서는 이 NLB Max Limit을 설정하는 메뉴가 안 보이는데, 아마 Oracle에 직접 전화해서 NLB 개수를 Upgrade해야 하는 것 같다. (아직, 확실하진 않고... 내일 Oracle에 한번 전화해서 물어봐야겠다..)
아래 김종민 님의 설명을 읽고, Elasticsearch 및 Kibana 설치하는 것이 제일 쉽고 간단하다.
##
## Elasticsearch 기동하기
##
$ bin/elasticsearch
##
## Kibana 기동하기
## 주의: 명령 옵션으로 --host를 지정하지 않으면, 기본값이 127.0.0.1로 설정된다.
## 만약 Web Browser가 kibana 서버와 다른 곳에 있다면 반드시 아래와 같이
## 외부에서 접근 가능한 서버 주소를 지정해주어야 한다.
$ bin/kibana --host=192.168.0.11
Elasticsearch 서버와 Kibana 서버를 설치했으면, 아래의 문서를 보면서 Python Example App을 작성한다.
Elasticsearch Python Client Example
2022년 11월 현재, 아래의 Web Docs가 가장 쉽게 설명된 것 같다.
Python PKG 설치, 인증/연결, 설정, Client Example Code 등 필요한 내용을 다 포함하고 있다.
아래 Docs는 초반에 "Elastic Cloud"를 먼저 예시로 설명하고 있는데, 만약 Private 환경(즉, self-managed cluster)에서 Client Example을 테스트할 것이라면 이 Docs의 아래 부분만 읽으면 된다.
[ 즉, 바로 이 부분부터 읽고 따라하면 된다 ] https://www.elastic.co/guide/en/elasticsearch/client/python-api/master/connecting.html#connect-self-managed-new
CRUD(Create, Read, Update, Delete) 예제를 보고 싶다면, 아래 Web Docs를 열람.
그냥 Copy & Paste해서 `python3 myexample.py` 명령을 수행하면 된다.
Document 1개를 Elasticsearch에 저장하는 예제
from datetime import datetime
from elasticsearch import Elasticsearch
##
## NOTE : Configuration for multi node
##
NODES = [ "https://10.1.3.166:9200" ]
##
## Password for the 'elastic' user generated by Elasticsearch
##
ELASTIC_PASSWORD = "mypasswd"
##
## Create the client instance
##
es = Elasticsearch(
NODES,
ca_certs="/MyWorkSpace/elastic-stack-metal-install/elasticsearch-8.5.1/config/certs/http_ca.crt",
basic_auth=("elastic", ELASTIC_PASSWORD)
)
## Create documents
doc = {
'my-key-example-a': 'my-value-1',
'my-key-example-b': 'my-value-2',
'date': datetime.now(),
'msg': "my log message example... hello~ world ^^",
}
resp = es.index(index="example-index-0", id=0, document=doc)
print(resp['result'])
Bulk로 많은 Document를 Elasticsearch에 저장하는 예제
from datetime import datetime
from elasticsearch import Elasticsearch
from randmac import RandMac
NODES = [ "https://10.1.3.166:9200" ]
##
## Password for the 'elastic' user generated by Elasticsearch
##
ELASTIC_PASSWORD = "mypasswd"
##
## Create the client instance
##
es = Elasticsearch(
NODES,
ca_certs="/MyWorkSpace/elastic-stack-metal-install/elasticsearch-8.5.1/config/certs/http_ca.crt",
basic_auth=("elastic", ELASTIC_PASSWORD)
)
doc_id = 0
loop_cnt = 0
##
## Create documents
##
## 참고: 아래 for 문은 document 예시를 그럴듯하게 만들기 위함이다.
## 실제 Elasticsearch와는 아무런 관련이 없다. ^^
ip_networks = ["10", "172", "192"]
for ii in ip_networks:
for xx in range(254):
for yy in range(254):
for zz in range(254):
macaddress = str(RandMac())
doc = {
'app': 'nac-server',
'level': 'info',
'date': datetime.now(),
'ip-address': ii + '.' + str(xx) + '.' + str(yy) + '.' + str(zz),
'mac-address': macaddress,
'msg': 'Device ' + macaddress + ' is started',
}
doc_id += 1
loop_cnt += 1
resp = es.index(index="example-index-0", id=doc_id, document=doc)
print("Count: " + str(loop_cnt) + " " + str(resp['_index']) + " " + str(resp['_id']) + " " + str(resp['result']) + " shard:" + str(resp['_shards']) + " " + str(resp['_seq_no']))
print("\nTotal Document: " + str(doc_id))
Document를 조회하기
from datetime import datetime
from elasticsearch import Elasticsearch
NODES = [ "https://10.1.3.166:9200" ]
# Password for the 'elastic' user generated by Elasticsearch
ELASTIC_PASSWORD = "mypasswd"
# Create the client instance
es = Elasticsearch(
NODES,
ca_certs="/MyWorkSpace/elastic-stack-metal-install/elasticsearch-8.5.1/config/certs/http_ca.crt",
basic_auth=("elastic", ELASTIC_PASSWORD)
)
resp = es.get(index="test-index", id=5)
print(resp)
Kibana Web GUI로 결과 확인하기
Kibana Web GUI의 'dev tool'을 이용하여 아래와 같이 index, document를 조회할 수 있다.
위 Web GUI에서 사용했던 Elasticsearch Query 참고.
##
## Index 정보를 가져온다.
##
GET _cat/indices?v
## 응답은 이런 모양이다.
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open example-index-0 Up1jqY3PTG2pLHdOLJcLGQ 1 1 18126912 739 2.9gb 2.9gb
yellow open test-index nGaLdNNORHKfJF1maBlNvw 1 1 2 0 11.2kb 11.2kb
##
## "example-index-0" 인덱스에 있는 모든 document 중에서 3개만 가져온다.
##
GET example-index-0/_search?size=3
{
"query": {
"match_all": { }
}
}
##
## "app" 항목 중에서 "server"라는 어휘가 포함돠ㅣㄴ 문서를 모두 가져온다.
##
GET example-index-0/_search
{
"query": {
"match": { "app": "server" }
}
}
##
## "mac-address" 항목 중에서 정확하게 "0e:c3:0d:97:ba:f0" 와 일치하는 document만 가져온다.
##
GET example-*/_search
{
"query": {
"match_phrase": { "mac-address": "0e:c3:0d:97:ba:f0" }
}
}
##
## Elasticsearch Cluster 상태 정보를 가져온다.
##
GET /_cluster/state
GET /_cluster/state?filter_path=metadata.indices.*.stat*
GET /example-index-0/_stats
##
## Elasticsearch Cluster에 저장된 전체 Document 개수를 가져온다.
##
GET /_count
##
## 위 _count 정보 중에서 _shard 정보를 제외한 정보를 가져온다.
##
GET /_count?filter_path=-_shards
아래의 Network Setting 화면에서 [ VPN ] 항목 옆에 있는 + 버튼을 누르고 VPN Server 정보를 입력하기만 하면 끝이다.
위와 같이 설정하고, VPN 연결을 활성화하는 버튼을 누른다.
그런데 VPN 연결을 몇시간 사용하다보면, 간혹 모르는 사이에 끊어지는 경우가 있다.
그런 경우 아래와 같은 nmcli CLI 명령을 crontab에 추가하고 1시간 간격으로 자동 실행하도록 하면 편하다.
$ nmcli con up id "VPN1"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/24)
$
알아두면 좋은 명령어 예시
##
## VPN 연결 정보 조회
##
$ nmcli con
NAME UUID TYPE DEVICE
VPN1 b0838d77-ae82-4573-a15b-fba0f8884594 vpn enp4s0
Wired connection 1 bef5ca16-baca-35e4-8259-e5dbbacbe1c0 ethernet enp4s0
$
$ nmcli con down id VPN1