728x90
반응형

개요

Zabbix + VMware의 모니터링 설정하여

호스트에서 나타나는 얼럿과 VM들의 얼럿에 대해 모니터링 하고자 하였다.

728x90

 

1. zabbix_server.conf 설정

### Option: StartVMwareCollectors
#       Number of pre-forked vmware collector instances.
StartVMwareCollectors=5
### Option: VMwareFrequency
#       How often Zabbix will connect to VMware service to obtain a new data.
VMwareFrequency=60
### Option: VMwarePerfFrequency
#       How often Zabbix will connect to VMware service to obtain performance data.
VMwarePerfFrequency=60
### Option: VMwareCacheSize
#       Size of VMware cache, in bytes.
#       Shared memory size for storing VMware data.
#       Only used if VMware collectors are started.
VMwareCacheSize=8M
### Option: VMwareTimeout
#       Specifies how many seconds vmware collector waits for response from VMware service.
VMwareTimeout=10

2. Create Host

Zabbix WebUI에서 호스트 생성

Group은 Hypervisors로 등록. 해당 그룹안에 Template VM VMware라는 템플릿이 Linked 되어 있다.

그러므로 해당 템플릿으로 Discovery 하여 VM들에 대한 것 까지 긁어서 모니터링 할 수 있다.

 

3. Host 생성 과정 중 Macros 탭에서 설정

vCenter 서버 나 ESXi 서버에 대한 정보를 넣는다.

url 뒤에는 /sdk 를 붙인다.

 

4. Zabbix 서버와 VMware 서버 간 방화벽 포트 오픈

10050, 10051, 443 포트에 대해 양방향 오픈 필요

 

5. zabbix server 서비스 리스타트

systemctl restart zabbix-server.service

 

6. 확인

위 처럼 Host와 VM까지 다 긁어오는 것을 확인 해 볼 수 있다.

불러오는 시간이 길어 질 수 있음 (넉넉히 1~2시간 잡아라)

728x90
300x250

'IT > Zabbix' 카테고리의 다른 글

MySQL ibdata1 용량 클리어 작업 (with Zabbix)  (0) 2022.02.18
(최신) Amazon Linux 2 Zabbix Server 5.0 설치  (0) 2022.01.17
Zabbix agent on Windows Server  (0) 2021.08.17
Zabbix 감시 설정  (0) 2021.07.29
Zabbix Template 설정  (0) 2021.07.29
728x90
반응형

개요

Jenkins로 빌드 할 때 Checkout 스테이지에서 실패 날 때 아래 처럼 에러가 났다.

git commit의 sha 값으로 나타낼 때 파싱하는 과정에서 "Tag must follow the pattern" 으로 나타나는 에러이다.

그러면서 빌드에 실패한다.

Jenkins Output Log

ERROR: Tag must follow the pattern '^:[a-zA-Z0-9_]([a-zA-Z0-9_.-]){0,127}'
	at hudson.util.FormValidation._errorWithMarkup(FormValidation.java:268)
	at hudson.util.FormValidation.errorWithMarkup(FormValidation.java:254)
	at hudson.util.FormValidation.error(FormValidation.java:145)
	at hudson.util.FormValidation.error(FormValidation.java:170)
	at org.jenkinsci.plugins.docker.commons.credentials.ImageNameValidator.validateTag(ImageNameValidator.java:244)
	at org.jenkinsci.plugins.docker.commons.credentials.ImageNameValidator.validateUserAndRepo(ImageNameValidator.java:116)
	at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryEndpoint.imageName(DockerRegistryEndpoint.java:317)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1225)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
	at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
	at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.toQualifiedImageName(Docker.groovy:106)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.tag(Docker.groovy:158)
	at org.jenkinsci.plugins.docker.workflow.Docker.node(Docker.groovy:66)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.tag(Docker.groovy:157)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.push(Docker.groovy:168)
	at org.jenkinsci.plugins.docker.workflow.Docker.node(Docker.groovy:66)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.push(Docker.groovy:165)
	at org.jenkinsci.plugins.docker.workflow.Docker$Image.push(Docker.groovy)
	at WorkflowScript.run(WorkflowScript:68)
	at org.jenkinsci.plugins.docker.workflow.Docker.withRegistry(Docker.groovy:41)
	at ___cps.transform___(Native Method)
	at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:86)
	at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
	at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
	at jdk.internal.reflect.GeneratedMethodAccessor277.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
	at com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.get(LocalVariableBlock.java:39)
	at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
	at com.cloudbees.groovy.cps.impl.LocalVariableBlock.evalLValue(LocalVariableBlock.java:28)
	at com.cloudbees.groovy.cps.LValueBlock$BlockImpl.eval(LValueBlock.java:55)
	at com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16)
	at com.cloudbees.groovy.cps.Next.step(Next.java:83)
	at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
	at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
	at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:136)
	at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:275)
	at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
	at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:185)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:403)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$400(CpsThreadGroup.java:97)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:315)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:279)
	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:67)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:139)
	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
	at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Finished: FAILURE

 

Before Code

git rev-parse --short=8 HEAD
728x90

After Code

git rev-parse --short HEAD | tr -d \'\\n\'

 

실제 처보면 아래와 같은 차이가 있음

 

Before

git rev-parse --short=8 HEAD
5a4c3acc

After

git rev-parse --short HEAD | tr -d \'\\n\'
5a4c3acroot:/

자동으로 줄바꿈이 되는 것을 제거 해주는 식으로 처리 하여 해결 하였다.

728x90
300x250
728x90
반응형

개요

갑자기 작업 이후에는 괜찮았는데, 그 다음 날에 aws-node-xxx 파트가 살아나지 못하고 계속 ContainerCreating에서 무한 루프 되는 현상이 나타났다. 쿠버네티스에서 확인 가능한 로그를 살펴 보았다.

 

 

1.

Network plugin cni failed to set up pod network: add cmd: failed to assign an IP address to container

 

2.

Error response from daemon: failed to start shim: fork/exec /usr/bin/containerd-shim: resource temporarily unavailable: unknown

Warning FailedCreatePodSandBox 23m (x2203 over 113m) kubelet, ip-xx-xx-xx-xx.xx-xxxxx-x.compute.internal (combined from similar events): Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" network for pod "provisioning-XXXXXXXXXXXXXXX": networkPlugin cni failed to set up pod "provisioning-XXXXXXXXXXXXXXX" network: add cmd: failed to assign an IP address to container

 

3.

Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused

Warning  FailedCreatePodSandBox  51s  kubelet, ip-xx-xx-xx-xx.ec2.internal  Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" network for pod "example_pod": NetworkPlugin cni failed to set up pod "example_pod" network: add cmd: Error received from AddNetwork gRPC call: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused", failed to clean up sandbox container

 

4. 

Getting running pod sandboxes from \"unix:///var/run/dockershim.sock\

위 와 같은 로그가 떨어진 것을 확인 할 수 있을 것이다.

그랬을 때 해결 방법은 3가지 정도가 있다

728x90
1. aws-node 포드를 다시 시작합니다. 다시 시작하면 포드가 마운트 지점을 다시 매핑하는 데 도움이 될 수 있습니다.
2. 그래도 문제가 해결되지 않으면 노드를 코든(cordon)하고 노드 그룹에서 노드를 확장합니다.
3. Virtual Private Cloud(VPC) CNI를 지원되는 최신 버전의 클러스터로 업그레이드해 보세요.

 

해당 해결 방법으로 처리 해 보도록 한다.

관련하여 AWS의 CNI의 특정 버전으로 인해 발생되는 버그로 확인 된다.

본인 환경의 CNI 버전에 대해 확인 해보자

kubectl -n kube-system describe ds aws-node
728x90
300x250
728x90
반응형

개요

AWS 이용시 Lifecycle 사용 전에 스냅샷 백업을 람다로 걸어놓은 적이 있을 수 있다.

람다로 제대로 처리를 안 했을 경우 스냅샷이 어마무시하게 쌓여있는 경우가 있다.

스냅샷도 쌓이면 매달 돈이 몇백 달러씩 나간다..

해당 스냅샷을 조회해서 긁어온다음 삭제하는 방식으로 가야 한다.

 

1. 스냅샷 조회

aws ec2 describe-snapshots --owner self \
    --output text \
    --query 'Snapshots[?StartTime<=`2021-12-11`].{Id:SnapshotId}' \
	  --profile cdk \
	  --region ap-northeast-2

특정 날짜를 기준으로 조회하는 구문이다.

 

또는

728x90
aws ec2 describe-instances \
      --query "Reservations[*].Instances[*].InstanceId" \
	 --region ap-northeast-2 \
	 --profile cdk \
      --output text

해당 방식으로도 조회 가능하다.

 

2. 스냅샷 삭제

aws ec2 delete-snapshot --snapshot-id snap-1234567890abcdef0

해당 스냅샷에 ID값을 넣어서 삭제 하는 방법이다.

 

아니면

 

aws ec2 delete-tags \
    --resources i-1234567890abcdef0 \
    --tags Key=Backup \
	  --region ap-northeast-2 \
	  --profile cdk

태그 명으로해서 삭제 하는 방식이다.

728x90
300x250
728x90
반응형

1. PowerShell을 이용하여 오프라인으로 설치 방법

 Save-Module -Name VMware.PowerCLI -Path C:\Users\test\Downloads\

2. 본인 PC의 PowerShell 버전이 5.1.1 이상 이어야 함

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.19041.1320
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1320
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
728x90

3. 다운로드한 모듈을 VMware CLI 모듈을 아래 경로로 복사

C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

4. 관리자 권한으로 Power Shell 실행하여 초기 세팅

# Powershell ExecutionPolicy
Set-ExecutionPolicy RemoteSigned

#Set the participation to false and ignore invalid certificates for all users
Set-PowerCLIConfiguration -Scope AllUsers -ParticipateInCeip $false -InvalidCertificateAction Ignore

5. PowerShell을 통해 VMware PowerCLI가 잘 작동하는지 확인

Connect-VIServer vmware.test.co.kr
Name                           Port  User
----                           ----  ----
vmware.test.co.kr            443   VSPHERE.LOCAL\Administrator

6. VM 리스트 확인

Get-VM
Name                 PowerState Num CPUs MemoryGB
----                 ---------- -------- --------
VCSA                 PoweredOn  2        10.000
728x90
300x250
728x90
반응형

1. Secrets 객체로 저장된 리포지토리 정보를 확인합니다. 

~/environment $ kubectl get secrets -n argocd
NAME                                        TYPE                                  DATA   AGE
argocd-application-controller-token-8mtfb   kubernetes.io/service-account-token   3      80d
argocd-dex-server-token-jzh8d               kubernetes.io/service-account-token   3      80d
argocd-initial-admin-secret                 Opaque                                1      80d
argocd-redis-token-htq4s                    kubernetes.io/service-account-token   3      80d
argocd-secret                               Opaque                                15     80d
argocd-server-token-6ljsp                   kubernetes.io/service-account-token   3      80d
default-token-7xkxf                         kubernetes.io/service-account-token   3      80d
repo-1467931201                             Opaque                                4      80d
repo-18701496                               Opaque                                4      37d
repo-2029740161                             Opaque                                4      2d16h
repo-2449069583                             Opaque                                4      80d
repo-2756299077                             Opaque                                4      27d
repo-3116005398                             Opaque                                4      39d
repo-3767823961                             Opaque                                4      39d
repo-4219629764                             Opaque                                4      37d
~/environment $

2. repo-xxxxx로 된 Secrets의 내용을 확인합니다.

8021:~/environment $ kubectl get secret repo-1467931201 -n argocd -o yaml
apiVersion: v1
data:
  password: d2pzdGtzdGxmMTI=
  type: Z2l0
  url: aHR0cHM6Ly9naXRsYWIubW5nLnJlZmluZWh1Yi5jb20vZGV2b3BzL3JlZmluZS13b3JrL2xzci1ncm50LWFwaS5naXQ=
  username: amVua2lucw==
kind: Secret
metadata:
  annotations:
    managed-by: argocd.argoproj.io
  creationTimestamp: "2021-09-16T15:33:44Z"
  labels:
    argocd.argoproj.io/secret-type: repository
  name: repo-1467931201
  namespace: argocd
  resourceVersion: "28308"
  uid: 731edae6-f2cf-46c7-9150-49ef0ebdabbe
type: Opaque
~/environment $

3. url에 나온 값을 base64로 디코딩해서 git 주소를 확인합니다.

~/environment $ echo aHR0cHM6Ly9naXRsYWIubW5nLnJlZmluZWh1Yi5jb20vZGV2b3BzL3JlZmluZS13b3JrL2xzci1ncm50LWFwaS5naXQ= | base64 -d
https://gitlab.test.com/devops/test.git

 

4. 3번을 방법은 통해서 비밀번호를 변경하고자 리포지토리를 찾고 해당 ConfigMap에 명시된 password 값을 업데이트 합니다. (base64로 인코딩한 값으로 넣어줍니다)

e.g. 비밀번호를 asdf1234로 변경할 경우 password 값에 YXNkZjEyMzQK를 넣어줍니다.

~/environment $ echo asdf1234 | base64
YXNkZjEyMzQK
~/environment $
728x90
300x250
728x90
반응형

1. Python 가상 환경 생성

 

# 현재 경로의 . 숨은 폴더로 생성

~ $ python3 -m venv .venv

# 가상환경 접속 (절대경로로 수행)

~/environment/cdk (main) $ source ~/.venv/bin/activate

 

2. Kubernetes SDK for Python 설치

(.venv) ~/environment/cdk (main) $ pip install kubernetes

3. requirements.txt 파일 존재 확인

728x90
(.venv) ~/environment/cdk (main) $ ls
app.py  cdk  cdk.context.json  cdk.json  cdk.out  kubernetes  README.md  requirements.txt
(.venv) ~/environment/cdk (main) $ cat requirements.txt
aws_cdk.core==1.119.0
aws_cdk.aws-ec2==1.119.0
aws_cdk.aws-eks==1.119.0
aws_cdk.aws-efs==1.119.0
PyYAML==5.4.1

4. requirements.txt 포함 설치

# 별도 사용하는 특정 패키지가 있을 경우 requirements.txt 파일에 정의
# 설치
(.venv) ~/environment/cdk (main) $ python3 -m pip install -r requirements.txt
728x90
300x250
728x90
반응형

1. DBeaver 사이트로 접속하여 Tool 다운로드

https://dbeaver.io/download/

 

2. PostgreSQL 사이트에서 JDBC 다운로드

https://jdbc.postgresql.org/download.html

3. DBeaver 접속하여 요구하는 Driver 확인

데이터베이스 -> 드라이버 관리자로 들어간다.

 

PostgreSQL 선택 후 Edit 눌러준다.

 

Libraries 탭에서 요구하는 드라이버를 확인한다.

 

 

4. 메이븐 레포에서 관련 드라이버를 다운로드 한다.

아래 클릭 하여 이동한다. ↓

728x90

 

https://mvnrepository.com/artifact/net.postgis

DBeaver에서 요구하는 드라이버 버전을 찾아서 다운로드 한다.

 

5. DBeaver에서 다운로드한 Jar 파일을 등록 해준다.

아까 요구 라이브러리를 확인 했던 창에서 'Classpath'를 클릭한다.

Global libraries에 다운로들한 jar파일을 모두 등록한다.

그런 다음 Find Class를 눌러줬었나? 암튼 해본다.

위와 같이 파란색으로 색이 변경 되었으면 완료다.

728x90
300x250

+ Recent posts