반응형

 

OKD는 기술 지원을 받기 어려우니까, 직접 Source Code를 열어봐야 하는 일이 생긴다.

이런 경우, 아래 GitHub Repository에서 Git Clone해서 분석해보면 좋다.

 

 

 

OpenShift

The developer and operations friendly Kubernetes distro - OpenShift

github.com

 

반응형

 

 

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

 

 

반응형

 

작성일: 2024년 2월 16일

 

프로그래밍을 하다보면, 시간 값으로 "1697180099.123" 이런 형태의 값을 많이 보게된다.

이런 형태의 시간 값을 unix time 또는 epoch time이라고 한다.

 

1970년 1월 1일 0시 0분 0초를 Unix epoch라고 정의한다.

그리고 이 Unix epoch 이후부터 흐른 시간(초)를 표현한 것이 unix time(epoch time)이다.

 

그런데 이 Unix time은 컴퓨터가 다루기 좋은 형태일 뿐, 사람은 이 숫자(unix time)를 봐도 몇월 며칠 몇시인지 알 수 없다.

이럴 때 편하게 unix time을 우리가 읽을 수 있는 날짜 형태로 바꾸어는 웹 페이지가 있다.

아래 웹 페이지에서 unix time을 입력하면 사람이 읽기 좋은 형태로 바꾸어준다. 그 반대의 경우가 제공한다.

 

 

Epoch Converter

Convert Unix Timestamps (and many other date formats) to regular dates.

www.epochconverter.com

 

또는 Linux 명령어 중에 date 명령으로도 쉽게 날짜 형태를 바꿀 수 있다.

 

$  date -d @1657180059
Thu 07 Jul 2022 04:47:39 PM KST

$  date --date=@0
Thu 01 Jan 1970 09:00:02 AM KST

 

반응형

 

Prometheus Query를 몇달만에 수행하면, 나의 기억력이 떨어져서 손이 멈짓하는데

자주 사용하는 PromQL 예제를 여기에 메모하고 참조해야겠다.

 

##
## Kubernetes, OCP(Openshift)의 ETCD Pods CPU 통계 데이터 조회
##

pod:container_cpu_usage:sum{namespace="openshift-etcd", pod=~"etcd.+"}


##
## Kubernetes, OCP(Openshift)의 DNS Pods CPU 통계 데이터 조회
##

pod:container_cpu_usage:sum{namespace="openshift-dns", pod=~"dns-.+"}


##
## Kubernetes, OCP(Openshift)의 API Server Pods CPU 통계 데이터 조회
##
pod:container_cpu_usage:sum{namespace="openshift-apiserver", pod=~"apiserver-.+"}

 

위 예제의 마지막 Query를 실행하면 아래와 같은 챠트가 출력된다.

 

 

 

반응형

Kubernetes, OCP(Openshift Container Platform)을 사용하다 보면, Resource에 대한 접근 권한 때문에 답답한 경우가 많다.

SCC(SecurityContext)를 잘 관리할 줄 알면, 제일 좋지만 급하게.. 그리고 간단하게 테스트만 하는 상황이라면,

아래와 같이 시스템의 모든 자원에 접근할 수 있도록 권한을 최고 수준(privileged)으로 올려주고 테스트하는 것이 정신 건강에 좋다.

(상용 서비스에서는 절대 이렇게 하면 안 된다.  Test bed 같은 곳에서 잠깐 Feasibility check만 하고 Pod를 종료시킨다는 가정하에 사용할 것)

 

apiVersion: v1
kind: Pod
metadata:
  name: my-example-pod
spec:
  hostNetwork: true    ## <-- 이 설정이 있으면, Pod 내부에서 Host Network이 보인다
                       ##     예를 들어, Host OS의 eno3 network port를 보기 위해
                       ##     ifconfit eno3  명령 실행이 가능해진다.
  containers:
    ...
    securityContext:
      privileged: true   ## <-- 이렇게 하면 모든 자원에 접근 가능해진다.
    ...
  securityContext: {}
  ...

 

 

만약, 극단적으로 Pod 내부에 있는 Process가 Host OS의 자원에 제약 없이 접근하고 싶다면 아래 예제 YAML처럼 권한 설정을 하면 된다.  이렇게 하면, Pod 내부에서 Pod 밖(즉 Host OS)의 IP network 자원, TCP Stack, IPC, ProcessID(PID) 등에 자유롭게 접근할 수 있다.

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: privileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
spec:
  privileged: true
  allowPrivilegeEscalation: true
  allowedCapabilities:
  - '*'
  volumes:
  - '*'
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  hostIPC: true
  hostPID: true
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  fsGroup:
    rule: 'RunAsAny'

 

위 YAML에 대해 자세히 알고 싶다면, 아래 kubernetes.io 문서를 참고하세요.

 

 

Pod Security Policies

FEATURE STATE: Kubernetes v1.21 [deprecated] Caution: PodSecurityPolicy is deprecated as of Kubernetes v1.21, and will be removed in v1.25. We recommend migrating to Pod Security Admission, or a 3rd party admission plugin. For a migration guide, see Migrat

kubernetes.io

 

 

 

 

다시 한번 강조하지만, 위와 같이 securityContext.privileged: true 설정된 Pod를 상용 서비스를 제공하는 클러스터에서 구동한 상태로 오래 방치하면 결국 해커의 먹이감이 된다.  꼭 10분~20분 정도 테스트만 하고 바로 Pod를 종료(삭제)해야 한다.

 

 

 


 

 

 


아래 내용은 참고용으로만 볼 것!!!

 

DaemonSet으로 구동하는 Pod들은 securityContext 값이 privileged 으로 설정된 경우가 많다.

왜냐하면 이런 DaemonSet으로 구동된 Pod들은 각 노드에서 Host 자원에 접근해야 하는 경우가 있기 때문이다.

아래 예시를 보면 바로 이해가 될것이다.

 

Multus 배포 예시

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: multus
  namespace: openshift-multus
  ... 중간 생략 ...
  
  spec:
    template:
    ... 중간 생략 ...
    
    spec:
      containers:
      ... 중간 생략 ...
      
        securityContext:
          privileged: true      ## <-- 이 부분
... 중간 생략 ...

 

 

Openshift SDN 배포 예시

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sdn
  ... 중간 생략 ...
spec:
  template:
  ... 중간 생략 ...
  
    spec:
      containers:
      ... 중간 생략 ...
      
        securityContext:
          privileged: true   ## <-- 이 부분
      ... 중간 생략 ...

 

 

게시물 작성자: sejong.jeonjo@gmail.com

 

반응형

 


 

Open Source Project(오픈 소스 프로젝트) 그 자체 또는 그것을 이용한 제품(Project)를 보면,

Upstream(업스트림), Downstream(다운스트림)이라는 표현이 자주 보인다.

 

예를 들어, 아래와 같은 표현을 보자.

OKD는 Upstream 활동으로 만들어진 Open Source Project이고
OCP는 OKD에 대한 Downstream 활동으로 만들어진 Project이다.

Fedora는 Upstream Project이다.
RHEL 8은 Fedora의 Downstream 활동으로 만들어진 OS이다.
RHEL 9은 CentOS Stream의 Downstream 활동으로 만들어진 OS이다.

 

 

Open Source  Project는 Upstream, Downstream으로 이루어진다.

(절대적으로 이렇다는 것은 아니고, 대부분 활성화된 Open Source Project가 이렇다는 뜻이다)

 

Upstream은 그 Project의 Open Source Code에 직접 Contribution하는 것이고,

Downstream은 Upstream 활동으로 만들어진 결과물(Artifact)를 사용해보면서(즉, 테스트하면서) Feedback을 주는 행위를 하거나 자기 사업에 적용하는 행동을 의미한다.

 

 

Upstream, Downstream 활동을 요약해보면, 아래와 같다.

  • Upstream Activity
    • 요구 사항 분석(Requirement Analysis)
    • 설계(Design)
    • 구현(Implementation)
    • 문서(Document) 작성
    • 번역
    • Bug Fix
  • Downstream Activiry
    • Upstream Project에서 배포된 PKG 설치, 사용
    • 사용 후 Feedback을 Upstream Project(Community)에 제공
    • 본인 사업에 적용하여 운영
    • 사례 공유

위 내용은 사전적 정의라기 보다는 나의 주관이 쬐~끔 반영된 것이니까, 너무 찰떡 같이 받아들이지 않기를~~~

 


 

반응형

 


최조 작성: 2022년 7월
내용 추가: 2023년 8월

 

 

2022년 여름, 현재 나의 IT 개발자로써의 밥벌이는 만 22년을 꽉 채우고, 23년차로 접어들고 있다. 

가끔 프로 축구 선수, 프로 야구 선수가 은퇴 후 10년 만에 인터뷰한 내용을 보면,

 


은퇴 이후 한번도 축구공을 차지 않았다.
은퇴 이후 한번도 야구공을 던져 보지 않았다.

 

이런 인터뷰 내용이 많다.

 

나도 23년 동안 한 분야에서만 일하다보니 모니터 화면의 코드를 보면서 키보드 타이핑하기가 점점 싫어진다.

23년간 일하는 사이에 개발 언어(Programming Language)도

 


C 언어 -> PHP -> JAVA -> Perl -> R -> Python -> Go

 

이 순서로 바꾸면서 개발해왔다.

이제는 소스 코드를 작성하다 보면, 여러 Programming 언어의 문법이나 흐름이 뒤죽박죽 섞여서 머릿속에 그려지다보니

Editor만 바라봐도 짜증이 확 밀려온다. 

그리고 여러 종류의 개발 언어를 쓰다보니, 구현의 깊이가 낮아지는 느낌이다.

 

 

22년간 어떤 일들이 있었나...

 

시간 순으로 있었던 굵직했던 이벤트를 보면,

  • 2000년 9월 W 회사 입사.
  • 2000년 11월 첫 프로젝트 개발 완료 - 한글.COM 도메인 등록 & 관리 시스템
  • 2002년 무선 숫자 도메인(WINC) 등록 시스템 개발
  • 2003년 9월 T 회사 입사 (이동통신시스템 개발 회사)
  • 2003년 10월 NPDB(011, 016, 017, 018, 019 등 이동통신 번호 이동 시스템) 개발
  • 2005년 HA 솔루션 개발 (서비스의 고가용성을 지원해주는 시스템을 개발)
  • 2010년 파자마5 모바일 App 개발

 

 

  • 2011년  Hetero-GW 개발
  • 2012년  MWC 2012  이종망 GW 출품 (아래 사진이 그때 개발해서 전시한 시스템)

 

[T월드 공지] ‘스마트 코리아’ 삼각편대, MWC 2012 참가 | SK텔레콤 뉴스룸

MWC는 전세계 약 220 국가의 1,000여 개 이동통신사, 휴대폰 제조사, 장비 제조사 등으로 구성된 연합기구인 GSMA(Global Systm for Mobile communicaion Association)가 주최하는 세계 최대의 정보통신 전시·컨퍼

news.sktelecom.com

 

  • 2013년   DPI(Deep Packet Inspection) 시스템 개발
  • 2015년   Machine Learning, Deep Learning 기술을 이용한 장애 예측 시스템 개발
  • 2017년   Linux Container를 이용한 Container Platform 설계 및 Demo 시스템 개발
  • 2018년   Data Center 가상화 관리 시스템 개발(일명, XOS) + Open Networking OS
  • 2019년   상반기 5G NRF 개발
  • 2019년   하반기 휴직 (건강 문제 발생, 반년 정도 병원 다니면서 요양)
  • 2020년   Kubernetes Cluster에 Deploy할 CNF 개발
  • 2021년   Container Platform 구축을 위한 TF 리딩
  • 2022년  Container Platform 도입 프로젝트 

 

이미 2018년에 정신 건상에 문제가 생겼고, 2019년 봄부터 정신건상의학과 병원을 다니기 시작했다.

제대로 병치레를 하고 보니 아플 때는 빨리 전문의를 찾아가서 상담하고 정밀하게 진단하고 치료하는 것이 제일 좋은 방법이다.

혹시 이 글을 읽는 직장인 중에서 눈에 보이지 않는 병 때문에 치료를 망설이는 직장인이 있다면, 빨리 병원부터 가기를 추천한다.

 


 

신입 사원이었을 때 마음가짐 vs. 지금의 마음가짐

신입이었을 때 나의 마음.

  • 내가 제일 잘 하는 것 같다.
  • 내가 제일 똑똑한 것 같다.
  • 내가 제일 열심히 하는 것 같다.
  • 이렇게 잘 하고, 똑똑한데 왜 연봉을 쪼금 주지...?

직장 생활 22년이 넘은 지금의 마음가짐

20년차가 넘었을 때부터 지금까지(23년차까지) 나의 마음은 

  • 나 빼고, 동료들은 다 잘하고 있는 것 같다.
      (내가 있는 회사는 대체로 농땡이 부리는 동료가 없이 평균적으로 근면하고 성실해서 더욱 이런 생각이 많이 드는 것 같다.)
  • "내가 프로젝트에서 도움이 되고 있는건 맞나?" 라는 스스로 의심하기 시작한다. (매일 자책하는 것이 일...)
  • 이미 출근하면서 하루동안 쓸 에너지 중에서 50% 정도는 소비하는 것 같다. (즉, 체력이 바닥이라는.... ㅠㅠ)
  • 출근해서 모니터를 보고 있는 것만해도 에너지가 고갈되는 느낌이다.
  • 1년만 더 버텨보자.  (이런 생각으로 3년째 버티는 중이다 ㅠㅠ) 
    진짜 올해가 IT 개발자로써 일하는 마지막 해일까...?

아무튼 23년차가 되니까 몸도 힘들고 마음가짐도 무겁다.

 

 

결혼 그리고 출산, 육아

나는 결혼을 일찍했다.

대학교 졸업 후 1년 뒤. 만 26세에 결혼했다.

아내와 나는 동갑이고 심지어 생일도 거의 비슷하다. (그래서 생일 파티도 한날 몰아서 한다.)

아내를 학생일 때 만나서, 졸업하고 1년 뒤에 결혼했기 때문에 제대로 준비된 것 없이 신혼 살림을 시작했다.

그리고 내 나이 만 27세일 때, 첫째 아기가 생겼다. 그리고 2년 뒤 둘째 아기, 그리고 또 3년 뒤에 세째 아기.

이렇게 나와 아내를 닮은 아들과 딸이 나에게 왔다.

 

지금 결혼한지 19년이 되었고, 되돌아 생각해보면 순간 순간에는 힘든 일이 많았던 것 같은데 

지금은 결혼한 것을 참 잘한 것이라 생각하고 있다.

그리고 나를 닮은 2세가 있다는 것은 더욱 기쁘다. 

결혼을 할지 말지 고민하는 사람이 나에게 결혼하는게 좋냐고 묻는다면, 나의 대답은 확실하다.

 


" 이 여자를 위해 내 모든 것을 바쳐 희생할 수 있고, 그 희생이 즐겁고 행복하다면 결혼하고 그런 생각이 없다면 하지 말라! "

 

내가 결혼할 때, 내 마음 속 다짐이 딱 위 문장과 같았다.

사랑하는 사람과 19년 동안 살아보니, 편한 것보다는 불편함이 많고 몸이 고단하거나 정신적으로 힘든 일도 많이 생긴다.

그런데 애초에 이 여자를 즐겁고 행복하게만 할 수 있다면 모든 것을 감내하리라 마음 먹어서 그런지, 힘든 순간이 딱 지나고 나면 행복은 몇배가 되는 느낌이다.

 

육아도 비슷한 것 같다.

아기 였을 때 한없이 귀엾고 예쁘다가, 아이가 점점 크면서 아이의 고집과 일탈로 아빠가 힘들어지는 경우가 있다.

아기에게 사회적 잣대(예를 들어, 학교성적 같은 것)를 들이밀고 보기 시작하면, 부모는 초조해지는 것 같다.

그래서 항상 마음속으로 다짐했었다.  건강과 웃음만 있다면, 나머지는 하늘이 주는 대로 받자 !!!

특히 학교 공부, 입시에 관해서는 입에 담지 않겠다고 다짐하고 또 다짐했다.

이것 때문에 친한 이웃들에게 "무심하고, 무책임한 부모"라는 소리도 몇번 들었다.

 


학원 안 다니는 중,고등학교 자녀가 어디있냐고?

 

아이가 싫어하는데, 굳이 학원에 보낼 필요가 있을까.

음악이 좋다고 하면, 악기 사주고

PC 게임이 좋다고 하면, PC 게임 사주고

놀러 가고 싶다면 놀러 가주고

사회적 책임이 덜한 나이일 때, 어디에 속박당하지 않고 자유를 느끼면서 놀게 해주고 싶었다.

 

 

 

2000년, 2010년, 2022년의 직장 생활. 무엇이 다를까?

 

나는 2000년에 가장 Hot했던 IT 회사에 입사했기에 분위기 자유롭게, 적당히 급여 괜찮았고, 상하/위계 질서가 없는 회사에서 일을 시작했다. 그래서 내 개인적으로는 2022년보다는 2000년의 내가 다녔던 W회사가 더 분위기가 자유롭고 출/퇴근 및 업무 시간도 내 마음대로 할 수 있었다. (심지어 내가 입사 1년차인 신입사원이었는데도 눈치주는 사람이 없었다)

다만 사회 전반적인 분위기로 보았을 때, 아래와 같이 차이가 있었던 것 같다.

 

주6일 근무 ㅠㅠ

이거 실화냐? 어떻게 주 6일을 출근할 수 있냐?

(근데 나는 주 1~2일 정도만 출근하고, 나머지는 집에서 근무했기 때문에 주6일이 크게 와닿지 않았다)

 

 

IT는 3D 중에서 극한 직업군 ㅠㅠ

2000년은 아직 IT 개발 인프라, 플랫폼이 별로 없고, 심지어 협업에서 참고할 도서, 웹 검색기도 변변치 않았다.

그런 반면, 중공업 경공업 같은 공장 시스템에 익숙한 경영자가 IT 회사를 경영하면서 업무량으로 압박하는 분위기도 있었다.

이렇다보니 IT 개발자들은 과중한 업무량에 치이고, 밤 11시~새벽 3시 까지 일하는 야근은 일상이었다.

새벽까지 일하다보니, 늦잠을 자게 되고  지각이 잦아지고, 선배와 보스 한테 지각했다고 잔소리 듣고,

애초에 기한내에 할 수 없는 업무량, 업무 난이도 였기 때문에 결국에 프로젝트 완료일에 일을 못 끝내서 또 잔소리 듣고... ㅠㅠ

나쁜 상황이 돌고 돌게 된다.

 

이런 근무 환경이 사회 전반적으로 알려지면서 IT 관련 전공을 하려는 학생이 줄어들고, 대학 입시에서도 홀대 받는 것 같았다.
(참고로, 1990년 초/중반에는 대학교 전공에서 "전자" "컴퓨터" 이런 문구만 들어가도 대입 성적 상위 1~2%의 학생이 몰리는 현상이 있었다. 지금은 입시생들이 이런 과거의 분위기를 못 믿겠지만...ㅠㅠ)

 

 

Stock Option은 유행어처럼 난무했지만, 실제 Stock Option을 행사해서 돈 번 사람은 못 본.... ㅠㅠ

 


회사 생활과 가정 생활의 균형점을 찾기

회사 생활과 가정 생활의 균형점(흔히 말하는 워라밸)을 찾기 위해 노력하지만, 지나온 20년을 뒤돌아보면

직장 생활, 경제 활동(돈 버는 일)에 더 에너지를 많이 쓴 것 같다.

동년배들보다 일찍 진급하고, 연봉 조정을 위한 평가도 매년 꾸준하게 최고 등급(Special Grade)을 받고, 이런 저런 회사의 포상도 대부분 다 받고...  그런데 이렇게 회사 생활, 경제 활동에 집중하면서 가정 구성원에 대해 소홀하지 않았나하는 후회감이 든다.

 

 

 

... 이하, 작성 중 ...

 

 

 

반응형

 


 

내가 자주 사용하는 형태는 아래와 예제와 같고, find 명령에 대한 자세한 내용은 아래 Web Docs를 참고할 것 !!!

 

$ find /proc -maxdepth 2 -name "comm" -print

$ find /proc -maxdepth 2 -name "comm" -exec cat {} \;

$ find . -maxdepth 2 -name "comm" -type f -mmin +1 -print | xargs grep kubelet
./4305/comm:kubelet
$

 

 

find 명령과 xargs 명령을 조합해서 사용하려면 많은 내용을 길게 입력해야 하는데, 아래와 같이 미리 .bashrc 파일에 function으로 등록하면 쉽게 이용할 수 있다.

 

$ cat .bashrc

... 중간 생략 ...

##
## .c 또는 .h 파일에서 특정 문자열을 찾는 함수
##
function find_xargs() {
    find . -name "*\.[ch]" -type f  -print | xargs grep $1
}

... 중간 생략 ...


##
## 위에서 .bashrc 파일에 추가한 내용을 현재 shell 환경에 적용하기
##

$ . .bashrc


## --------------------------------------------------------------

##
## 위에서 작성한 find_xargs 명령을 이용하여 Source code file에서 ip_hdr 함수를 찾는 예제
##

$ find_xargs  ip_hdr

./net/dccp/ipv6.c:		newnp->mcast_hops  = ip_hdr(skb)->ttl;
./net/dccp/ipv4.c:	return secure_dccp_sequence_number(ip_hdr(skb)->daddr,
./net/dccp/ipv4.c:					   ip_hdr(skb)->saddr,
./net/dccp/ipv4.c:	newinet->mc_ttl	   = ip_hdr(skb)->ttl;
./net/dccp/ipv4.c:	const struct iphdr *iph = ip_hdr(skb);
./net/dccp/ipv4.c:	rxiph = ip_hdr(rxskb);
./net/dccp/ipv4.c:	sk_rcv_saddr_set(req_to_sk(req), ip_hdr(skb)->daddr);
./net/dccp/ipv4.c:	sk_daddr_set(req_to_sk(req), ip_hdr(skb)->saddr);
./net/dccp/ipv4.c:	iph = ip_hdr(skb);
./net/sched/act_ipt.c:	iph = ip_hdr(skb);
./net/sched/act_ctinfo.c:		dscp = ipv4_get_dsfield(ip_hdr(skb)) & ~INET_ECN_MASK;
./net/sched/act_ctinfo.c:				ipv4_change_dsfield(ip_hdr(skb),
./net/sched/act_nat.c:	iph = ip_hdr(skb);
./net/sched/act_nat.c:		iph = ip_hdr(skb);
./net/sched/act_ct.c:	iph = ip_hdr(skb);

... 중간 생략 ...

$

 


 

아래 Web docs에 아주 자세한 설명과 예제가 있다.

 

How to Use the Linux xargs Command

 

+ Recent posts