계란찜
계란말이
카레 라이스
된장찌개
생선구이
유부초밥
작성일: 2023년 11월 23일
여기서 언급한 앱은 지극히 나의 취향 및 스터디, 업무에 때문에 설치하는 것임.
CLI 명령 수행하고, vi or vim 편집기 사용할 때 편하다.
Source code 편집할 때 사용.
Markdown(MD) 문법이 지원되서, Source code snippet을 예쁘게 기록하기 좋다.
(여기서 예쁘다고 표현한 것은 미적으로 예쁘다는게 아니고, vim editor에서 봤던 모양대로 메모장에 옮겨 적을 수 있다는 뜻이다)
CPU 및 각종 Processor의 온도를 알려주는 앱
Download Link: https://xs-labs.com/en/apps/hot/overview/
Word, Sheet, PPT 등 각종 Office 파일을 열람, 편집할 수 있다.
공식적으로 무료 사용이 가능해서 좋다.
PDF 파일 열람할 때 사용한다.
Windows 11, Ubuntu Linux, Kali Linux 등을 사용할 때 편하다.
안드로이드 스마트폰에 있는 파일을 macbook으로 전송하기 위해 사용
Download Link: https://www.android.com/filetransfer/
Network Packet을 capture하여 열람할 때 편하다.
화상 미팅을 위함.
남들이 다 사용하는 메신저이니까, 어쩔 수 없이 설치.
개발 담당자들간 Source code 작성 중에 서로 소통하기 편하기 위해.
Source code를 copy & paste 하기 편하고, code snippet이 상대방에게 예쁘게 전달되서 좋다.
동영상 편집할 때 사용한다.
인터넷 방송용 컨텐츠 만들 때 사용한다.
나는 가끔 동료들 교육할 Webinar 자료 만들 때, 사용한다.
동영상 포맷 변환 프로그램.
Download Link: https://handbrake.fr/downloads.php
동영상 재생 프로그램.
원격 데스크탑 앱.
다른 PC에 접속할 때 사용한다.
Mac에서 Parallels + Windows 11 VM 사용시 한영변환 키 설정 (9) | 2024.01.10 |
---|---|
개발자를 위한 macOS에 zsh, oh-my-zsh 설치 및 설정 (0) | 2023.12.06 |
macOS Sonoma에서 Parallels 17 비정상 동작 (0) | 2023.11.03 |
Mac M1 프린터 드라이버 설치 (0) | 2022.02.21 |
Mac 에서 기본 앱 설정 변경 (0) | 2022.02.21 |
작성일: 2024년 2월 15일
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP ... 생략 ...
10.0.10.111 Ready node 11d v1.25.4 10.0.10.111 130.162.111.222 ...
10.0.10.112 Ready node 11d v1.25.4 10.0.10.112 146.156.111.110 ...
##
## 위 worker node 정보 중에서 "EXTERNAL-IP"를 이용하여 SSH 접속
## (Oracle OS를 사용했다면, opc가 기존 계정이다)
##
$ ssh opc@130.162.111.222
(암호 없이 private key를 통해 인증 완료)
##
## 주의: OKE Cluster 구축할 때 사용한 node의 private key, public key 쌍 중에서 private key를
## 내 Client PC에 가지고 있어야 위와 같이 접속된다.
## 그러므로, 꼭 private key 관리를 잘 해야 한다.
##
Kubernetes에 ceph cluster 구축하기 (rook를 이용하여 ceph 설치) (1) | 2024.08.07 |
---|---|
Kubernetes Service 리소스의 External-IP를 DNS에 자동 설정하는 Python Script [ Ver 1.0 ] (0) | 2024.03.25 |
Kubernetes cluster에 Prometheus와 Grafana 설치 (Helm 챠트 이용) (0) | 2023.10.26 |
Kubernetes 스터디 자료 모음 (0) | 2023.08.24 |
kubernetes에서 특정 StorageClass를 default로 선택되도록 설정 (0) | 2023.08.23 |
작성일: 2023년 12월 2일
나는 Spirent, Ixia 같은 계측기 전문 회사의 계측 장비를 구입 또는 빌려서 성능 측정을 해오고 있었는데,
공신력을 따지는 성능 측정 보고서가 필요한 경우가 아니라면, Open source code로 구현된 계측기도 쓸만할 것 같다.
이것저것 찾아보다가 CISCO TRex 프로젝트가 눈에 들어왔다.
- Intel DPDK를 사용
- Stateful 통신(예: TCP HTTP HTTPS DNS 등 Request & Response 방식), Stateless 통신(예: 단방향 UDP 통신) 모두 지원
- Open source
- TRex를 사용하면 개발자는 다양한 유형의 트래픽을 생성하고 결과로 수신되는 데이터를 분석
- 데이터 분석은 MAC 및 IP 수준에서 수행
- DUT는 L3 Switch(IP Router) 또는 L4 이상의 IP network 처리 장치라고 가정
- Linux 환경에서 작동
OS & HW:
- OS: Ubuntu 22.04
- Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz (16 cores)
- Memory 128GB
$ mkdir -p /opt/trex
$ cd /opt/trex
$ wget --no-cache https://trex-tgn.cisco.com/trex/release/latest
$ tar -xfz latest
$ ls -F
v3.04/
$ cd v3.04
테스트 네트워크는 아래 그림과 같다.
2개의 Linux 장비 중에서 왼쪽 장비는 TRex를 설치하고, 오른쪽 장비는 DUT로 사용할 것이다.
DUT는 Linux에 static ip routing을 설정하여 간단한 Router 동작만 하게 할 것이다.
아래 예시처럼 똑같이 따라하면 된다.
$ ./dpdk_setup_ports.py -i
By default, IP based configuration file will be created. Do you want to use MAC based config? (y/N) N
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
| ID | NUMA | PCI | MAC | Name | Driver | Linux IF | Active |
+====+======+=========+===================+================================================+=================+==========+==========+
| 0 | 0 | 03:00.0 | 08:33:73:01:6b:98 | 82580 Gigabit Network Connection | igb | eth2 | |
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
| 1 | 0 | 03:00.1 | 08:33:73:01:6b:99 | 82580 Gigabit Network Connection | igb | eth3 | |
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
...
... 중간 생략 ...
...
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
| 14 | 1 | 88:00.0 | 08:33:73:08:3b:2a | 82599ES 10-Gigabit SFI/SFP+ Network Connection | uio_pci_generic | | |
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
| 15 | 1 | 88:00.1 | 08:33:73:08:3b:2b | 82599ES 10-Gigabit SFI/SFP+ Network Connection | uio_pci_generic | | |
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
| 16 | 1 | 8a:00.0 | 08:33:73:08:3b:2c | 82599ES 10-Gigabit SFI/SFP+ Network Connection | ixgbe | eth16 | |
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
| 17 | 1 | 8a:00.1 | 08:33:73:08:3b:2d | 82599ES 10-Gigabit SFI/SFP+ Network Connection | ixgbe | eth17 | |
+----+------+---------+-------------------+------------------------------------------------+-----------------+----------+----------+
Please choose an even number of interfaces from the list above, either by ID, PCI or Linux IF
Stateful will use order of interfaces: Client1 Server1 Client2 Server2 etc. for flows.
Stateless can be in any order.
For performance, try to choose each pair of interfaces to be on the same NUMA.
Enter list of interfaces separated by space (for example: 1 3) : 14 15
For interface 14, assuming loopback to its dual interface 15.
Putting IP 1.1.1.1, default gw 2.2.2.2 Change it?(y/N) N
For interface 15, assuming loopback to its dual interface 14.
Putting IP 2.2.2.2, default gw 1.1.1.1 Change it?(y/N) N
Print preview of generated config? (Y/n) Y
... 출력 내용 생략 ...
$ vi /etc/trex_cfg.yaml
### Config file generated by dpdk_setup_ports.py ###
- version: 2
interfaces: ['88:00.0', '88:00.1']
port_info:
- ip: 16.0.0.253 ## 내가 수정한 부분. TRex client side IP address.
default_gw: 16.0.0.254 ## 내가 수정한 부분. DUT IP address.
- ip: 48.0.0.253 ## 내가 수정한 부분. TRex server side IP address.
default_gw: 48.0.0.254 ## 내가 수정한 부분. DUT IP address.
platform:
master_thread_id: 0
latency_thread_id: 1
dual_if:
- socket: 1
threads: [8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31]
$
위 port_info 항목에서 설정한 network 대역에 대해서 간략하게 설명하면,
- Client host가 사용할 IP address range: 16.0.0.0 ~ 16.0.0.127 (16.0.0.0/25)
- Server host가 사용할 IP address range: 48.0.0.0 ~ 48.0.0.127 (48.0.0.0/25)
- Client host가 사용할 gateway address: 16.0.0.254
- Server host가 사용할 gateway address: 48.0.0.254
DUT 장비에서 아래와 같이 ip_forward에 관해 설정한다.
##
## Linux OS가 IP packet을 forward할 수 있도록 ip_forward를 enable 시킨다.
##
sysctl -w net.ipv4.ip_forward=1
# or
# echo 1 > /proc/sys/net/ipv4/ip_forward
DUT 장비에서 Network port를 설정한다.
$ vi /etc/netplan/00-installer-config.yaml
network:
version: 2
ethernets:
eth0:
addresses:
- 16.0.0.254/25
routes:
- to: 16.0.0.0/25
via: 16.0.0.253
eth1:
addresses:
- 48.0.0.254/25
routes:
- to: 48.0.0.0/25
via: 48.0.0.253
... 중간 생략 ...
$ netplan apply
위 network 설정에 대한 부연 설명:
- TRex의 client 및 server가 emulation하는 IP address(16.0.0.0/25)가 DUT와 동일한 IP network이면 안 된다.
- 아마도 TRex를 구현할 때, (IP address + MAC address)를 Mapping하여 Host를 emulation하면 computing cost 및 MAC learning에 대한 load가 커지기 때문에 MAC address를 과감하게 생략하고 L3 switch 뒤에 Host 장치가 있다고 가정하고 TRex를 구현한게 아닌가 싶다. (나의 상상력에 의한 추정)
테스트를 위한 준비 작업은 끝 !!
아래 글은 실제로 TCP, UDP 패킷을 생성하여 성능 테스트 방법이다.
복잡한 입력 내용은 없고, 아래 예제 CLI 명령을 복붙(Copy & Paste)하면 땡 !!
TRex로 사용할 Linux 장비에 SSH 터미널을 미리 2개 접속해놓고 사용하는 것이 좋다.
$ ./t-rex-64 -i --astf
The ports are bound/configured.
Starting TRex v3.04 please wait ...
set driver name net_ixgbe
driver capability : TCP_UDP_OFFLOAD TSO LRO
set dpdk queues mode to RSS_DROP_QUE_FILTER
Number of ports found: 2
zmq publisher at: tcp://*:4500
wait 1 sec .
port : 0
------------
link : link : Link Up - speed 10000 Mbps - full-duplex
promiscuous : 0
port : 1
------------
link : link : Link Up - speed 10000 Mbps - full-duplex
promiscuous : 0
number of ports : 2
max cores for 2 ports : 1
tx queues per port : 3
-------------------------------
RX core uses TX queue number 2 on all ports
core, c-port, c-queue, s-port, s-queue, lat-queue
------------------------------------------
1 0 0 1 0 0
-------------------------------
-Per port stats table
ports | 0 | 1
-----------------------------------------------------------------------------------------
opackets | 0 | 0
obytes | 0 | 0
ipackets | 0 | 0
ibytes | 0 | 0
ierrors | 0 | 0
oerrors | 0 | 0
Tx Bw | 0.00 bps | 0.00 bps
-Global stats enabled
Cpu Utilization : 0.0 %
Platform_factor : 1.0
Total-Tx : 0.00 bps
Total-Rx : 0.00 bps
Total-PPS : 0.00 pps
Total-CPS : 0.00 cps
Expected-PPS : 0.00 pps
Expected-CPS : 0.00 cps
Expected-L7-BPS : 0.00 bps
Active-flows : 0 Clients : 0 Socket-util : 0.0000 %
Open-flows : 0 Servers : 0 Socket : 0 Socket/Clients : -nan
drop-rate : 0.00 bps
current time : 2.8 sec
test duration : 0.0 sec
##
## 이 터미널은 계속 출력용으로 사용되고, 사용자 입력을 받을 수 없다.
##
$ ./trex-console
... 중간 생략 ...
Type 'help' or '?' for supported actions
trex> stats --ps
Port Status
port | 0 | 1
----------------+----------------------+---------------------
driver | net_ixgbe | net_ixgbe
description | 82599ES 10-Gigabit | 82599ES 10-Gigabit
link status | UP | UP
link speed | 10 Gb/s | 10 Gb/s
port status | IDLE | IDLE
promiscuous | off | off
multicast | off | off
flow ctrl | none | none
vxlan fs | - | -
-- | |
layer mode | IPv4 | IPv4
src IPv4 | 16.0.0.253 | 48.0.0.253
IPv6 | off | off
src MAC | 08:33:73:08:3b:2a | 08:33:73:08:3b:2b
--- | |
Destination | 16.0.0.254 | 48.0.0.254
ARP Resolution | 00:87:33:72:a8:9c | 00:87:33:72:a8:9d
---- | |
VLAN | - | -
----- | |
PCI Address | 0000:88:00.0 | 0000:88:00.1
NUMA Node | 1 | 1
RX Filter Mode | hardware match | hardware match
RX Queueing | off | off
Grat ARP | every 120 seconds | every 120 seconds
------ | |
trex> start -f astf/http_simple.py -m 2 -d 10 ## 10초 동안 테스트 수행
trex> tui
tui> Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 0 bps
version : ASTF @ v3.04 total_tx_L1 : 0 bps
cpu_util. : 0.0% @ 1 cores (1 per dual port) total_rx : 0 bps
rx_cpu_util. : 0.0% / 0 pps total_pps : 0 pps
async_util. : 0% / 38.44 bps drop_rate : 0 bps
total_cps. : 0 cps queue_full : 0 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | LOADED | LOADED |
speed | 10 Gb/s | 10 Gb/s |
CPU util. | 0.0% | 0.0% |
-- | | |
Tx bps L2 | 0 bps | 0 bps | 0 bps
Tx bps L1 | 0 bps | 0 bps | 0 bps
Tx pps | 0 pps | 0 pps | 0 pps
Line Util. | 0 % | 0 % |
--- | | |
Rx bps | 0 bps | 0 bps | 0 bps
Rx pps | 0 pps | 0 pps | 0 pps
---- | | |
opackets | 343 | 1401 | 1744
ipackets | 1401 | 343 | 1744
obytes | 38396 | 1895776 | 1934172
ibytes | 1895776 | 38396 | 1934172
tx-pkts | 343 pkts | 1.4 Kpkts | 1.74 Kpkts
rx-pkts | 1.4 Kpkts | 343 pkts | 1.74 Kpkts
tx-bytes | 38.4 KB | 1.9 MB | 1.93 MB
rx-bytes | 1.9 MB | 38.4 KB | 1.93 MB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: -
Press 'ESC' for navigation panel...
status: [OK]
tui> stop
trex> exit
$
위 터미널 내용을 Image로 캡처하면, 아래 모양처럼 보인다.
위에서 사용한 astf/http_simple.py 스크립트 외에 내가 테스트하면서 유용하다고 생각했던 스크립트들을 열거하면 아래와 같다.
##
## 서로 다른 내용의 여러 개 PCAP을 동시에 Play할 때는 아래 스크립트를 사용한다.
##
trex> start -f astf/http_by_l7_percent.py -m 100 -d 30
... 출력 내용 생략 ...
##
## Interative mode의 CLI가 아닌 경우도 지원한다.
##
$ ./t-rex-64 --astf -f astf/http_simple_cc.py -m 300mbps -d 30
TCP/HTTP 테스트랑 터미널 구성이나 CLI 명령 입력이 비슷하기 때문에 [ Terminal B ]에 입력하는 내용만 설명하겠다.
##
## UDP로 1개의 요청 메시지를 보내고, 1개의 응답 메시지를 받는 경우.
##
trex> start -f astf/udp1.py -m 10000 -d 30
##
## SIP/UDP 요청 메시지를 보내고, 응답 메시지를 받는 경우.
##
trex> start -f astf/udp_sip.py -m 1000000 -d 5
##
## DNS/UDP 요청 메시지를 보내고, 응답 메시지를 받는 경우.
##
trex> start -f astf/udp_topo_traffic.py -m 30000 -d 10
단방향으로 UDP 패킷만 보내는 경우에는 아래와 같이 명령을 수행한다. (Spirent C1 계측기와 유사한 동작)
$ ./t-rex-64 -i --stl --no-scapy-server
... 출력 내용 생략 ...
$ ./trex-console
trex> portattr -a --prom on
... 출력 내용 생략 ...
trex> stats --ps
... 출력 내용 생략 ...
trex> start -f stl/udp_1pkt_src_ip_split.py -m 9809mbps -d 15
... 출력 내용 생략 ...
trex> start -f stl/bench.py -m 10kbps -d 5
... 출력 내용 생략 ...
trex> start -f stl/udp_multi_simple_list_test.py -m 10kbps -d 5
... 출력 내용 생략 ...
trex> start -f stl/udp_1pkt_simple.py -m 10kbps -d 5
... 출력 내용 생략 ...
trex> streams -a
... 출력 내용 생략 ...
HTTP 세션이 오래 유지되도록 하면서 서버 장비 또는 L4 ~ L7 Network 장비의 Memory 부하를 끌어올리는 테스트를 하고자 한다면,
아래의 설정과 명령을 따라 수행하면 된다.
(테스트 절차가 위에서 했던 테스트와 비슷하므로 자세한 설명은 생략한다.)
우선 TRex 설정 값부터 조정해야 한다.
trex_cfg.yaml 파일에서 dp_flows 항목의 값을 적당히 높여준다.
물론 TRex가 돌아가는 장비(HW)의 Memory가 충분한지 먼저 확인하고 적절하게 값을 높여서 설정한다.
$ vim /etc/trex_cfg.yaml
- version: 2
memroy:
## 30GB --> 15,000,000 flows (이 값을 참고하여 필요한 만큼 값을 올린다)
dp_flows: 15000000
... 중간 생략 ...
$ cd $TREX_ROOT
$ ./t-rex-64 -i --astf
그리고 아래와 같이 python 스크립트를 수행한다.
$ ./trex-console
trex> start -f astf/http_high_active_flows.py -m 1000 -t delay=10000000
## 유용한 옵션 값을 제시하면 아래와 같다.
## 아래 옵션으로 실행하면,
## CC : 500,000 ~ 550,000
## CPS : 40,000
## BPS : 300Mbps
## CPU : 50%
tui> start -f astf/http_high_active_flows.py -m 50000 -t delay=10000000
## 아래 옵션으로 실행하면,
## CC : 1,000,000 # 위 명령보다 delay를 2배 늘리면, CC도 2배 늘어난다.
## CPS : 40,000
## BPS : 320Mbps
## CPU : 50%
tui> start -f astf/http_high_active_flows.py -m 50000 -t delay=20000000
참고: -m 옵션의 값을 처음에는 작게 설정해서 테스트하고, 테스트 결과를 보면서 -m 옵션 값을 2~10배씩 올려가면서 테스트한다.
문서 이름 | 문서 URL |
TRex - Use Case (TCP, UDP) (참고: 깊은 이해 없이 따라하기 좋음) |
https://promwad.com/news/cisco-trex-traffic-generator |
TRex - 최초 구성 설정 방법 | https://github.com/cisco-system-traffic-generator/trex-core/blob/master/doc/trex_config.asciidoc |
TRex 사용 매뉴얼 | https://trex-tgn.cisco.com/trex/doc/trex_manual.html |
TRex PKG 릴리즈 리스트 (버전별) | https://trex-tgn.cisco.com/trex/release/ |
TRex - Use Case (UDP) | https://satishdotpatel.github.io/trex-load-generator/ |
TRex Stateless support | https://trex-tgn.cisco.com/trex/doc/trex_stateless.html |
TRex Advance stateful support (TCP, HTTP 테스트할 때 도움이 됨) |
https://trex-tgn.cisco.com/trex/doc/trex_astf.html |
TRex GUI | https://github.com/cisco-system-traffic-generator/trex-stateless-gui |
SSH Port forwarding (SSH Tunneling) 구성 예제 및 실습 (0) | 2023.12.22 |
---|---|
Juniper Switch 제어를 위한 Python Script 예제 (Junos PyEX 패키지 사용하기) (0) | 2023.12.11 |
Raw Ethernet Packet - Example Source Code (0) | 2023.10.06 |
IP 패킷 조작 툴 - Scapy (0) | 2023.09.25 |
PVLAN (Private VLAN) 개념 (스터디 자료 모음) (0) | 2023.09.23 |
작성일: 2023년 11월 3일
2년 전에 macOS Monterey 버전이 설치된 Macbook을 구입하고, 한번도 OS upgrade를 하지 않았다가 오늘 Sonoma로 업그레이드했다. (macOS 12 --> macOS 14)
Parallels(패러렐즈) 17이 원래 Monterey 버전에 맞춰서 개발되었기 때문에 Sonoma에서 잘 동작하지 않을 것이라 예상을 했었고,
실제로 Sonoma로 upgrade를 하고 나니까 일부 동작이 이상하게 동작했다.
나는 Parallels Desktop 17에서 Coherence 모드로 Windows 11을 사용하고 있었기 때문에 이상한 GUI 동작이 발생했는데,
Coherence 모드를 사용하지 않는다면, 대부분 정상적으로 동작한다.
내가 coherence 모드에서 발견한 이상한 동작은 이런 것들이다.
결론적으로;
- Coherence Mode로 Parallels 17을 사용하지 않는 사용자라면, Sonoma로 macOS를 업그레이드해도 잘 동작한다.
- Corehence Mode로 Parallels 17을 사용하는 사용자라면, 화면에 표현된 일부 GUI 요소가 동작하지 않을 수 있다.
개발자를 위한 macOS에 zsh, oh-my-zsh 설치 및 설정 (0) | 2023.12.06 |
---|---|
macOS에 설치할 App (앱, 프로그램) (0) | 2023.11.23 |
Mac M1 프린터 드라이버 설치 (0) | 2022.02.21 |
Mac 에서 기본 앱 설정 변경 (0) | 2022.02.21 |
Mac에서 연말정산 (0) | 2022.01.29 |
작성일: 2023년 10월 25일
내가 참고했던 문서: https://semaphoreci.com/blog/prometheus-grafana-kubernetes-helm
Helm chart를 사용하면, 키보드로 명령을 몇 줄 입력하면 모든 설치 및 구성이 끝난다.
내가 수행했던 명령을 캡쳐했다. 아래 예제를 따라하면 잘 설치된다.
/home/sejong/chart/prometheus# helm install -n almighty prometheus ./
NAME: prometheus
LAST DEPLOYED: Wed Oct 25 18:01:27 2023
NAMESPACE: almighty
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.almighty.svc.cluster.local
Get the Prometheus server URL by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace almighty -l "app.kubernetes.io/name=prometheus,app.kubernetes.io/instance=prometheus" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace almighty port-forward $POD_NAME 9090
The Prometheus alertmanager can be accessed via port 9093 on the following DNS name from within your cluster:
prometheus-alertmanager.almighty.svc.cluster.local
Get the Alertmanager URL by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace almighty -l "app.kubernetes.io/name=alertmanager,app.kubernetes.io/instance=prometheus" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace almighty port-forward $POD_NAME 9093
#################################################################################
###### WARNING: Pod Security Policy has been disabled by default since #####
###### it deprecated after k8s 1.25+. use #####
###### (index .Values "prometheus-node-exporter" "rbac" #####
###### . "pspEnabled") with (index .Values #####
###### "prometheus-node-exporter" "rbac" "pspAnnotations") #####
###### in case you still need it. #####
#################################################################################
The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
prometheus-prometheus-pushgateway.almighty.svc.cluster.local
Get the PushGateway URL by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace almighty -l "app=prometheus-pushgateway,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace almighty port-forward $POD_NAME 9091
For more information on running Prometheus, visit:
https://prometheus.io/
/home/sejong/WorkSpace/chart/prometheus#
---
/home/sejong/chart/grafana# helm install -n almighty grafana ./
NAME: grafana
LAST DEPLOYED: Wed Oct 25 18:37:27 2023
NAMESPACE: almighty
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
kubectl get secret --namespace almighty grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:
grafana.almighty.svc.cluster.local
Get the Grafana URL to visit by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace almighty -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace almighty port-forward $POD_NAME 3000
3. Login with the password from step 1 and the username: admin
/home/sejong/WorkSpace/chart/grafana#
---
## Grafana admin 계정 암호 찾기
$ kubectl get secret --namespace almighty grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
gxq5MbMBa2w5qkqpvkaYGU5T8bJDOTag9ayy5kxi
Helm chart가 잘 만들어져 있어서 큰 노력없이 클러스터 구축이 끝났다.
Helm chart를 만든 분께 감사하다는 말을 전하고 싶다.
Kubernetes Service 리소스의 External-IP를 DNS에 자동 설정하는 Python Script [ Ver 1.0 ] (0) | 2024.03.25 |
---|---|
Oracle OKE Kubernetes worker node에 SSH 접속하는 방법 (2) | 2023.11.21 |
Kubernetes 스터디 자료 모음 (0) | 2023.08.24 |
kubernetes에서 특정 StorageClass를 default로 선택되도록 설정 (0) | 2023.08.23 |
Kubespray를 이용하여 Kubernetes Cluster 구축하기 (3) | 2023.08.21 |
작성일: 2023년 10월 10일
예제 코드
/**
* How to build
* $ gcc send-raw-packet.c -o send-raw-packet
*
* How to run
* $ ./send-raw-packet
* or
* $ ./send-raw-packet eth0
*/
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <linux/ip.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <errno.h>
// FIXME: MY_DEST_MACX 값은 각자 테스트 환경이 맞게 수정해서 사용.
#define MY_DEST_MAC0 0x52
#define MY_DEST_MAC1 0x54
#define MY_DEST_MAC2 0x00
#define MY_DEST_MAC3 0xcf
#define MY_DEST_MAC4 0xab
#define MY_DEST_MAC5 0x76
// FIXME: DEFAULT_IF 값은 각자 테스트 환경이 맞게 수정해서 사용.
#define DEFAULT_IF "enp7s0"
#define BUF_SIZ 1024
int main(int argc, char *argv[])
{
int sockfd;
int tx_len = 0;
char sendbuf[BUF_SIZ];
char ifName[IFNAMSIZ];
struct ifreq if_idx;
struct ifreq if_mac;
struct ether_header *eh = (struct ether_header *) sendbuf;
struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header));
struct sockaddr_ll socket_address;
// Network interface name 지정하기 (예: eth0)
if (argc > 1)
{
strcpy(ifName, argv[1]);
}
else
{
strcpy(ifName, DEFAULT_IF);
}
// RAW socket 사용을 위한 File descriptor 생성하기
if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1)
{
printf("socket() error: %d (%s)\n", errno, strerror(errno));
return 0;
}
// Network interface의 index 값 구하기
memset(&if_idx, 0, sizeof(struct ifreq));
strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0)
{
printf("ioctl(SIOCGIFINDEX, %s) error: %d (%s)\n", ifName, errno, strerror(errno));
return 0;
}
// Network interface의 MAC address 구하기
memset(&if_mac, 0, sizeof(struct ifreq));
strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1);
if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0)
{
printf("ioctl(SIOCGIFHWADDR, %s) error: %d (%s)\n", ifName, errno, strerror(errno));
return 0;
}
// Ehternet header 구성하기 (참고: sendbuf pointer가 eh 주소를 pointing)
memset(sendbuf, 0, BUF_SIZ);
/*
* ioctl() 함수를 이용해서 얻은 'enp7s0' NIC에 대한 MAC Address 값을
* ethernet header 구조체의 ether_shost 변수에 복사한다.
*/
printf("( %s ) MAC address = ", ifName);
for (int idx = 0; idx < 6; idx++)
{
eh->ether_shost[idx] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[idx];
printf("%02x", eh->ether_shost[idx]);
if (idx < 5)
{
printf(":");
}
}
printf("\n");
/*
* 일반적으로 NIC port의 MAC address를 ethernet frame의 source address로 사용하지만
* Ethernet packet 전송 테스트를 위해서 가짜 Source MAC address를 만들었다.
*/
eh->ether_shost[3] = 0x01;
eh->ether_shost[4] = 0x02;
eh->ether_shost[5] = 0x03;
// Ethernet frame - Destination host MAC address
eh->ether_dhost[0] = MY_DEST_MAC0;
eh->ether_dhost[1] = MY_DEST_MAC1;
eh->ether_dhost[2] = MY_DEST_MAC2;
eh->ether_dhost[3] = MY_DEST_MAC3;
eh->ether_dhost[4] = MY_DEST_MAC4;
eh->ether_dhost[5] = MY_DEST_MAC5;
// Ethertype: Internet Protocol (0x0800)
eh->ether_type = htons(ETH_P_IP);
tx_len += sizeof(struct ether_header);
// FIXME: IP Header
// 각자 테스트 환경에 맞게 iph 변수를 수정하여 사용하기
iph->ihl = 20 >> 2; // NOTE: (20 >> 2) * 4 = 20 bytes (IHL은 4 byte 단위로 해석되기 때문)
iph->version = 4;
iph->protocol = IPPROTO_IP;
iph->saddr = inet_addr("10.1.1.10");
iph->daddr = inet_addr("10.1.1.11");
iph->tot_len = 46 + 32;
tx_len += sizeof(struct iphdr);
/* Payload (Packet data) */
for (char idx = 0; idx < 32; idx++)
{
sendbuf[tx_len++] = idx;
}
/* Index of the network device */
socket_address.sll_ifindex = if_idx.ifr_ifindex;
/* Address length*/
socket_address.sll_halen = ETH_ALEN;
/* Destination MAC */
socket_address.sll_addr[0] = MY_DEST_MAC0;
socket_address.sll_addr[1] = MY_DEST_MAC1;
socket_address.sll_addr[2] = MY_DEST_MAC2;
socket_address.sll_addr[3] = MY_DEST_MAC3;
socket_address.sll_addr[4] = MY_DEST_MAC4;
socket_address.sll_addr[5] = MY_DEST_MAC5;
/* Send packet */
if (sendto(sockfd, sendbuf, tx_len, 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) < 0)
printf("Send failed\n");
return 0;
}
예제 코드
/**
* How to build
* $ gcc recv-raw-packet.c -o recv-raw-packet
*
* How to run
* $ ./recv-raw-packet
* or
* $ ./recv-raw-packet eth0
*/
#include <unistd.h>
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <errno.h>
#define ETHER_TYPE 0x0800
#define DEFAULT_IF "enp7s0"
#define BUF_SIZ 1024
int main(int argc, char *argv[])
{
char sender[INET6_ADDRSTRLEN];
int sockfd, ret;
int sockopt;
ssize_t pktbytes;
struct ifreq ifopts; // To set promiscuous mode
struct ifreq if_ip; // To get IP address of this host NIC
struct sockaddr_storage peer_addr;
uint8_t buf[BUF_SIZ];
char ifName[IFNAMSIZ];
// Network interface name 지정하기 (예: eth0)
if (argc > 1)
{
strcpy(ifName, argv[1]);
}
else
{
strcpy(ifName, DEFAULT_IF);
}
// Ethernet + IP + UDP header
struct ether_header *eh = (struct ether_header *) buf;
struct iphdr *iph = (struct iphdr *) (buf + sizeof(struct ether_header));
struct udphdr *udph = (struct udphdr *) (buf + sizeof(struct iphdr) + sizeof(struct ether_header));
if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETHER_TYPE))) == -1)
{
printf("socket(PF_PACKET, SOCK_RAW, ETHER_TYPE) error: %d (%s)\n", errno, strerror(errno));
return -1;
}
// Set interface to promiscuous mode
strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1);
ioctl(sockfd, SIOCGIFFLAGS, &ifopts);
ifopts.ifr_flags |= IFF_PROMISC;
ioctl(sockfd, SIOCSIFFLAGS, &ifopts);
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) {
printf("setsockopt(SO_REUSEADDR) error: %d (%s)\n", errno, strerror(errno));
close(sockfd);
exit(0);
}
// Bind to device
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, IFNAMSIZ-1) == -1) {
printf("setsockopt(SO_BINDTODEVICE, %s) error: %d (%s)\n", ifName, errno, strerror(errno));
close(sockfd);
exit(0);
}
repeat:
printf("\nWaiting to recvfrom...\n");
pktbytes = recvfrom(sockfd, buf, BUF_SIZ, 0, NULL, NULL);
printf(" Got packet %lu bytes\n", pktbytes);
printf("Destination MAC address = ");
for (int idx = 0; idx < 6; idx++)
{
printf("%02x", eh->ether_dhost[idx]);
if (idx < 5)
{
printf(":");
}
}
printf("\n");
// Get source IP
((struct sockaddr_in *)&peer_addr)->sin_addr.s_addr = iph->saddr;
inet_ntop(AF_INET, &((struct sockaddr_in*)&peer_addr)->sin_addr, sender, sizeof sender);
// Look up my device IP addr
memset(&if_ip, 0, sizeof(struct ifreq));
strncpy(if_ip.ifr_name, ifName, IFNAMSIZ-1);
if (ioctl(sockfd, SIOCGIFADDR, &if_ip) >= 0) {
printf("Source IP: %s\n My IP: %s\n", sender,
inet_ntoa(((struct sockaddr_in *)&if_ip.ifr_addr)->sin_addr));
// Ignore if I sent it
if (strcmp(sender, inet_ntoa(((struct sockaddr_in *)&if_ip.ifr_addr)->sin_addr)) == 0) {
printf("but I sent it :(\n");
ret = -1;
goto done;
}
}
/* UDP payload length */
ret = ntohs(udph->len) - sizeof(struct udphdr);
/* Print packet */
printf("\tData:");
for (int idx = 0; idx < pktbytes; idx++)
{
printf("%02x ", buf[idx]);
}
printf("\n");
done:
goto repeat;
close(sockfd);
return ret;
}
Juniper Switch 제어를 위한 Python Script 예제 (Junos PyEX 패키지 사용하기) (0) | 2023.12.11 |
---|---|
CISCO TRex - Network Traffic Generator (네트워크 성능 계측기), 설치 및 테스트 (0) | 2023.11.12 |
IP 패킷 조작 툴 - Scapy (0) | 2023.09.25 |
PVLAN (Private VLAN) 개념 (스터디 자료 모음) (0) | 2023.09.23 |
netconf 사용 예제 코드(CISCO ISO, Juniper JunOS, Arista EOS 등) (0) | 2023.09.19 |
작성일: 2023년 9월 25일
파이썬으로 작성된 패킷 조작 라이브러리.
https://github.com/secdev/scapy
https://scapy.readthedocs.io/en/latest/usage.html#interactive-tutorial
https://github.com/secdev/scapy/blob/master/doc/notebooks/Scapy%20in%2015%20minutes.ipynb
https://github.com/secdev/scapy/blob/master/doc/notebooks/HTTP_2_Tuto.ipynb
https://scapy.readthedocs.io/en/latest/introduction.html#quick-demo
CISCO TRex - Network Traffic Generator (네트워크 성능 계측기), 설치 및 테스트 (0) | 2023.11.12 |
---|---|
Raw Ethernet Packet - Example Source Code (0) | 2023.10.06 |
PVLAN (Private VLAN) 개념 (스터디 자료 모음) (0) | 2023.09.23 |
netconf 사용 예제 코드(CISCO ISO, Juniper JunOS, Arista EOS 등) (0) | 2023.09.19 |
Open vSwitch(OVS) Use Case, 상황별 실습 (0) | 2023.09.15 |