728x90
반응형

개요 

도커 빌드 이미지 생성 시 이미지에 대한 Label을 생성할 수 있다.

필요에 따라 해당 Label을 가지고 이미지에 대해 확인 하는 등 처리 할 수 있는 프로세스가 이것저것 생기게 된다.

 

1. FROM 추가

FROM node:10-alpine as build-stage

2. ARG 추가

ARG BUILD_ID
728x90

3. Label 추가

LABEL build=builder_$BUILD_ID

해당 부분을 추가 해줌으로 써 Build에 대한 Label을 지정 해 줄 수 있다.

나머지 구문에 대해서는 생략 하도록 하겠다.

 

728x90
300x250

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

Docker cgroupfs에서 systemd로 변경 방법  (0) 2021.09.10
WSL2에서 Docker 설치하기  (0) 2021.09.10
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

+ Recent posts