반응형

 

 

Kubernetes 또는 OCP 클러스터에 내가 만든 App을 Deploy하고, 이 App이 Prometheus에서 Scraping하도록 설정하고 싶을 때가 있다.

그럴 때 아래 문서를 따라하면 Metric Exporting, Scraping이 잘 된다.

(단, ServiceMonitor 리소스 설정은 아래 문서에서 살짝 놓친 부분이 있으니까, 이 블로그 페이지의 마지막에 있는 예제를 따를 것)

 

 

모니터링 OpenShift Container Platform 4.10 | Red Hat Customer Portal

이 문서에서는 OpenShift Container Platform에서 Prometheus를 구성 및 사용하는 방법에 대한 지침을 설명합니다.

access.redhat.com

 

위 문서에서 7.2 사용자 정의 프로젝트에 대한 메트릭 컬렉션 설정 부분을 보면 된다.

 

 

 


 

 

또는 같은 내용이지만, Page 단위로 분리된 문서를 보고 싶다면 아래 Web Page를 보는 것도 추천 !!!

(다시 말하지만, 위 문서랑 완전히 똑같은 내용이고 Chapter 별로 Page를 분리한 문서 Form이다)

 

 

7.2. 사용자 정의 프로젝트에 대한 메트릭 컬렉션 설정 OpenShift Container Platform 4.10 | Red Hat Customer Por

Access Red Hat’s knowledge, guidance, and support through your subscription.

access.redhat.com

 

 


 

 

 

주의:
  위 문서가 대체로 절차를 잘 설명하고 있지만, ServiceMonitor 리소스에 대한 설정이 이상하다.
  그래서 ServiceMonitor 리소스는 내가 별도로 만들었다.

 

 

웹 문서의 설명과 다른 부분만 아래와 같이 Comment를 추가했다. 

Comment가 붙어 있는 라인만 잘 수정하면, 잘 동작한다.

 

##
## File name: servicemonitor.yaml
##

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: almighty
  name: almighty
  namespace: openshift-monitoring  ## Note: 반드시 이 namespace로 설정해야 한다.
spec:
  endpoints:
  - interval: 15s
    port: web
    scheme: http
    path: /metrics       ## 이 설정을 꼭 넣자.
  selector:
    matchLabels:
      app: almighty      ## 이 부분이 Pod, Service의 label 값과 같은지 꼭 확인해야 한다.
  namespaceSelector: 
    matchNames:
      - almighty         ## Service 리소스의 값과 같은지 확인해야 한다.

 

servicemonitor.yaml 파일을 작성하면, 아래와 같이 kubectl 명령으로 kubernetes cluster에 적용한다.

$ kubectl apply -f servicemonitor.yaml

 


그런데 여기서 생각해볼 것이 있다.
만약, Service에 포함된 Pod가 2개 이상일 때는 위 ServiceMonitor처럼 Scrapping을 시도하면
2개의 Pod 중에서 1개의 Pod만 Scrapping에 응답하기 때문에 반쪽 짜리 Scrapping이 되는 문제가 있다.
Pod가 10개라면, 1개 Pod 입장에서 본다면 Scrapping 인터벌(주기)는 10배로 더 길어진다.

따라서  Service에 포함되는 Pod가 2개 이상일 때는 ServiceMonitor 보다 PodMonitor 조건을 사용하는 것이 좋다.
PodMonitor를 사용하면, Prometheus가 각 Pod마다 접근해서 Scrapping한다.

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: almighty
  labels:
    app: almighty
## FIXME
  namespace: openshift-monitoring
spec:
  selector:
    matchLabels:
## FIXME
      app: almighty
  podMetricsEndpoints:
## FIXME
  - port: web
    path: /metrics
    interval: 7s   ## 테스트를 해보면, 1s 로 설정해도 잘 동작한다.
    scheme: http
  namespaceSelector:
    matchNames:
## FIXME
      - almighty

 

 

 

 

 

Prometheus Web UI를 열고, 아래와 같이 Qeury(PromQL)을 입력한다.

## Example 1
http_request_duration_seconds_bucket{code="200",handler="found"}

## Example 2
irate(http_requests_total{namespace="almighty", code="200"}[5m])

 

 

irate 함수를 사용한 PromQL

 

 

 

위와 같이 챠트가 잘 그려지면, Prometheus의 Scraper가 사용자 App의 Metrics을 잘 Scraping하고 있는 것이다.

 

 

 

참고:  Prometheus Metrics 테스트를 위한 Example App

아래 Go Source Code를 이용하는 것이 제일 테스트하기 편하다. (적극 추천)

 

 

GitHub - brancz/prometheus-example-app: Go app that exposes metrics about its HTTP handlers.

Go app that exposes metrics about its HTTP handlers. - GitHub - brancz/prometheus-example-app: Go app that exposes metrics about its HTTP handlers.

github.com

 

 

 

 

 

 

 


 

 

 

 

Troubleshooting (문제 해결)

 

 

위 예시대로 사용하려 했는데 잘 동작하지 않는다면, 아래 설정 작업을 따라해볼 것 !!!

 

Prometheus의 Cluster Role Binding 설정 작업

만약, Kubernetes 또는 OCP를 초기 구축하고 나서 User App에 대한 Metrics을 Scrapping할 수 있는 Role을 Prometheus ServiceAccount에 부여하지 않았다면, 꼭 Cluster Role과 ClusterRoleBinding을 설정해줘야 한다.

Cluster Role Binding 작업이 안 되어 있으면, 위에서 예제로 설명했던 ServiceMonitoring, PodMonitoring을 모두 

"endpoints is forbidden" 에러가 발생할 것이다. (아래 Error Log을 참고)

 

Prometheus Error Log 예시

$ kubectl logs -f -n openshift-monitoring prometheus-k8s-0

ts=2022-08-10T03:29:51.795Z caller=log.go:168 level=error component=k8s_client_runtime func=ErrorDepth msg="github.com/prometheus/prometheus/discovery/kubernetes/kubernetes.go:471: Failed to watch *v1.Pod: failed to list *v1.Pod: pods is forbidden: User \"system:serviceaccount:openshift-monitoring:prometheus-k8s\" cannot list resource \"pods\" in API group \"\" in the namespace \"almighty\""

 

위 에러를 없애기 위해 아래와 같이 ClusterRole, ClusterRoleBinding 리소스를 만들어야 한다.

##
## Cluster Role 생성을 위한 YAML 파일 작성
##

$ cat prometheus-cluster-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: my-prometheus
rules:
- apiGroups: [""]
  resources:
  - pods
  - services
  - endpoints
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]


##
## Cluster Role Binding 생성을 위한 YAML 파일 작성
##

$ cat prometheus-cluster-role-binding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: clusterlogging-collector-metrics
subjects:
- kind: ServiceAccount
  name: prometheus-k8s
  namespace: openshift-monitoring

##
##
##

$ kubectl apply -f prometheus-cluster-role.yaml

$ kubectl apply -f prometheus-cluster-role-binding.yaml

 

위 설명에 대한 자세한 정보는 아래 GitHub의 Prometheus RBAC 챕터를 참고.

 

 

GitHub - prometheus-operator/prometheus-operator: Prometheus Operator creates/configures/manages Prometheus clusters atop Kubern

Prometheus Operator creates/configures/manages Prometheus clusters atop Kubernetes - GitHub - prometheus-operator/prometheus-operator: Prometheus Operator creates/configures/manages Prometheus clus...

github.com

위readme.md 내용을 화면 캡처한 것!

 

 

참고: 다른 블로거의 글

Red Hat 문서에 오류가 있어서 한참 헤메고 있을 때, 아래 블로그 글에서 해법을 찾았다 ^^

쉽게 예제를 만들어서 설명하고 있어서, 이해하기 좋다.

 

 

 

prometheus-operator | loliot

prometheus-operator

wiki.loliot.net

 

 

반응형

아래의 순서로 .gitignore를 설정하고, 적용한다.

 

##
## 아래와 같이 .gitignore 파일에 무시하고 싶은 파일을 추가한다.
##

$ cat .gitignore
go.mod
go.sum
my_app
.gitignore

##
## 반드시 cached file을 삭제한 후에 git commit을 해야 한다.
## 대부분 이 명령을 수행하지 않아서 .gitignore가 동작하지 않는 문제가 있다.
##

$ git rm -r --cached .
$ git add .
$ git commit -m ".gitignore is now working"

'Git' 카테고리의 다른 글

Git 개요 그리고 Git 브랜치 전략 (Branch Strategy)  (0) 2021.06.30
반응형

아래 문서를 따라 하면 SRIOV가 잘 동작한다.

 

 

 

 

16장. 하드웨어 네트워크 OpenShift Container Platform 4.10 | Red Hat Customer Portal

Access Red Hat’s knowledge, guidance, and support through your subscription.

access.redhat.com

 

위 Document는 app-netutil 라이브러리를 이용하여 DPDK, SRIOV를 사용하는 App 개발 및 확인하는 방법도 소개하고 있다.

따라서 SRIOV 관련 설정, App 테스트까지 모든 절차를 알고 싶다면, 위 문서를 읽는 것을 추천한다.

 

 

반응형

 

아래와 같이 `oc edit` 명령으로 insecureRegistries 항목에 Container Image Registry 주소를 추가한다.

 

$  oc edit image.config.openshift.io/cluster

... 중간 생략 ...

spec:
  registrySources:
    insecureRegistries:
    - aaa.cloud.net:8080
    - bbb.cloud.net:5000

... 중간 생략 ...

$

 

그리고 kubernetes node에서 사람이 podman 명령어를 직접 사용하는 경우도 있기 때문에 아래와 같이 /etc/containers/registres.conf 파일에도 registry 주소를 추가한다.

 

##
## File Path:  /etc/containers/registries.conf
##

$  cat  /etc/containers/registries.conf

... 중간 생략 ...

[registries.insecure]
registries = ['aaa.registry.net:8080', 'bbb.registry.net:8080']

... 중간 생략 ...

$
반응형

 

Intel CPU 칩을 사용하는 Mac은 웬만한 프린터 드라이버가 다 잘 동작하는데, M1 CPU 칩을 장착한 Mac (맥)은 프린터 드라이버를 설치하다가 실패하거나 설치가 되더라도 프린트 결과물이 엉망인 경우가 있다.

 

나는 집에서는 삼성 레이저 컬러 프린터를 사용하는데, 이 경우는 프린터 드라이버 설치도 잘 되고 인쇄 결과물도 좋았다.

반면에, 회사에서 사용하는 신도리코 (Sindoh Rico) 프린터와 HP 프린터는 드라이버 설치 단계부터 삐그덕거리고 겨우 설치를 해도 프린터 결과물이 엉망이다.

 

내가 사용하고 있는 Mac 환경을 보면,

Mac M1 + Parallels(패러렐즈) + Windows 11 (M1)

 

그리고 주로 Windows 11에서 프린트한다.

 

본인이 사용하는 프린터가 신도리코, HP 프린터라면 스트레스 받으면서 Windows 11 M1에 프린터 드라이버를 설치하지 말고,

아래처럼 하는 것이 좋다.

 

  1.  Mac M1에 프린터 드라이버를 설치하고,
  2.  Windows 11 (M1)에서 프린트할 때 PDF 파일로 출력한 다음에
  3.  이 PDF 파일을 Mac M1에서 출력한다.  

 

참고로, HP 프린터는 Mac M1에서 잘 설치된다.

(별도의 프린터 드라이버 파일이 없어도  Mac OS 자체적으로 가지고 있는 기본 프린터 드라이버로 잘 동작한다)

 

그러니까, 그냥 잘 동작하는 조합으로 사용하는 것이  스트레스 안 받고 프린터를 사용하는 길일듯...

 

(아니면 삼성 프린터를 사용하길 추천~   M1 Mac과 아주 찰떡 궁합이다)

 

반응형

.

 

Mac에서 Parallels (패러렐즈)를 사용하다보면, Excel(엑셀) 또는 PPT(파워포인트) 파일을 Mac OS에서 더블 클릭으로 열고 싶을 때가 있다. 즉, 기본 앱을 Mac OS에 있는 App에서 MS Windows(윈도우즈)의 MS Office(Excel, PowerPoint)앱으로  변경해야 하는데, 아래와 같이 그림을 따라서 설정하면 된다.

 

반응형

 

vi 또는 vim editor를 사용하다보면, 한글이 아래와 같이 이상하게 나오는 경우가 있다.

 

vim editor 한글 깨짐 현상

 

 

이럴 때는 .vimrc 파일에 아래와 같이 2줄을 추가해준다.

 

set encoding=utf-8
set fileencodings=utf-8,euc-kr,cp949

 

 

.vimrc 파일을 저장하고 닫은 다음에 다시 vi 편집기로 한글을 작성해보면, 아래처럼 한글이 깨지지 않고 잘 보인다.

 

vim editor 한글 깨짐 해결

 

반응형

 


작성일: 2024년 1월 9일

 

Macbook에 USB Keyboard나 Bluetooth Keyboard를 연결해서 사용하다보면, 

Home과 End Key가 MS Windows와 달라서 불편하다.

 

Karabiner-Elements App을 설치하면 원하는대로 Key를 변경할 수 있지만, 나는 Macbook에 이것저것 App 설치하는 것이 싫어서 설정 파일을 직접 작성해서 Home, End Key 설정을 변경했다.

 

나중에 까먹고, 또 검색하느라 시간을 허비할 것 같아서 여기에 메모해둔다.

 

##  아래의 순서로 명령을 실행한다.

$ cd ~/Library
$ mkdir KeyBindings
$ cd KeyBindings
$ cat << EOF >> DefaultKeyBinding.dict
{
/* Remap Home / End */
"\UF729" = "moveToBeginningOfLine:"; /* Home */
"\UF72B" = "moveToEndOfLine:"; /* End */
"$\UF729" = "moveToBeginningOfLineAndModifySelection:"; /* Shift + Home */
"$\UF72B" = "moveToEndOfLineAndModifySelection:"; /* Shift + End */
}
EOF
$

위와 같인 .dict 파일을 생성했으면, Log Out하고 다시 Log In 한다. 

그러면 Home Key와 End Key의 설정이 바뀌어 있을 것이다.

 

더 자세한 내용은 아래 Git 문서를 참고하기.

https://gist.github.com/trusktr/1e5e516df4e8032cbc3d

 

My DefaultKeyBinding.dict for Mac OS X

My DefaultKeyBinding.dict for Mac OS X. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

위 Git 문서에서 중요한 부분만 발췌했다.

/* ~/Library/KeyBindings/DefaultKeyBinding.Dict

This file remaps the key bindings of a single user on Mac OS X 10.5 to more
closely match default behavior on Windows systems. This makes the Command key
behave like Windows Control key. To use Control instead of Command, either swap
Control and Command in Apple->System Preferences->Keyboard->Modifier Keys...
or replace @ with ^ in this file.

Here is a rough cheatsheet for syntax.
Key Modifiers
^ : Ctrl
$ : Shift
~ : Option (Alt)
@ : Command (Apple)
# : Numeric Keypad

Non-Printable Key Codes

Standard
Up Arrow:     \UF700        Backspace:    \U0008        F1:           \UF704
Down Arrow:   \UF701        Tab:          \U0009        F2:           \UF705
Left Arrow:   \UF702        Escape:       \U001B        F3:           \UF706
Right Arrow:  \UF703        Enter:        \U000A        ...
Insert:       \UF727        Page Up:      \UF72C
Delete:       \UF728        Page Down:    \UF72D
Home:         \UF729        Print Screen: \UF72E
End:          \UF72B        Scroll Lock:  \UF72F
Break:        \UF732        Pause:        \UF730
SysReq:       \UF731        Menu:         \UF735
Help:         \UF746

OS X
delete:       \U007F

For a good reference see http://osxnotes.net/keybindings.html.

NOTE: typically the Windows 'Insert' key is mapped to what Macs call 'Help'.
Regular Mac keyboards don't even have the Insert key, but provide 'Fn' instead,
which is completely different.
*/

{
    "@\UF72B"  = "moveToEndOfDocument:";                         /* Cmd  + End   */
    "~@\UF703" = "moveToEndOfDocument:";                         /* Cmd + Option + Right Arrow */

    "@$\UF72B" = "moveToEndOfDocumentAndModifySelection:";       /* Shift + Cmd  + End */

    "@\UF729"  = "moveToBeginningOfDocument:";                   /* Cmd  + Home  */
    "~@\UF702" = "moveToBeginningOfDocument:";                   /* Cmd + Option + Left Arrow */

    "@$\UF729" = "moveToBeginningOfDocumentAndModifySelection:"; /* Shift + Cmd  + Home */

    "\UF729"   = "moveToBeginningOfLine:";                       /* Home         */
    "~\UF702"  = "moveToBeginningOfLine:";                       /* Option + Left Arrow */

    "$\UF729"  = "moveToBeginningOfLineAndModifySelection:";     /* Shift + Home */
    "$~\UF702" = "moveToBeginningOfLineAndModifySelection:";     /* Shift + Option + Right Arrow */

    "\UF72B"   = "moveToEndOfLine:";                             /* End          */
    "~\UF703"  = "moveToEndOfLine:";                             /* Option + Right Arrow */

    "$\UF72B"  = "moveToEndOfLineAndModifySelection:";           /* Shift + End  */
    "$~\UF703" = "moveToEndOfLineAndModifySelection:";           /* Shift + Option + Left Arrow  */

    "\UF72C"   = "pageUp:";                                      /* PageUp       */
    "\UF72D"   = "pageDown:";                                    /* PageDown     */
    "$\UF728"  = "cut:";                                         /* Shift + Del  */
    "$\UF727"  = "paste:";                                       /* Shift + Ins */
    "@\UF727"  = "copy:";                                        /* Cmd  + Ins  */
    "$\UF746"  = "paste:";                                       /* Shift + Help */
    "@\UF746"  = "copy:";                                        /* Cmd  + Help (Ins) */

    "~j"       = "moveBackward:";                                /* Option + j */
    "~l"       = "moveForward:";                                 /* Option + l */
    "~i"       = "moveUp:";                                      /* Option + i */
    "~k"       = "moveDown:";                                    /* Option + k */

    "@~i"      = ("moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:",);                            /* Cmd + Option + j */
    "@~k"      = ("moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:",);                            /* Cmd + Option + j */

    "@\UF702"  = "moveWordBackward:";                            /* Cmd  + LeftArrow */
    "@~j"      = "moveWordBackward:";                            /* Cmd + Option + j */
    "@\U007F"  = "deleteWordBackward:";                          /* Cmd  + Backspace */

    "@\UF703"  = "moveWordForward:";                             /* Cmd  + RightArrow */
    "@~l"      = "moveWordForward:";                             /* Cmd + Option + l */
    "@\UF728"  = "deleteWordForward:";                           /* Cmd  + Delete */

    "@$\UF702" = "moveWordBackwardAndModifySelection:";          /* Shift + Cmd  + Leftarrow */
    "@$\UF703" = "moveWordForwardAndModifySelection:";           /* Shift + Cmd  + Rightarrow */
}

 


 

+ Recent posts