Argo CD에서 OSS 배포 프로세스

17194 단어 OSSArgo CDidea

이거 뭐야?


Argo CD라는 Kubernetes와 관련된 CD 도구로 OSS 편집을 진행했기 때문에 절차를 정리한 것을 기념하기 위해서입니다.
https://github.com/argoproj/argo-cd

날과 씨


Argo CD를 구성하는 Argocd-repo-server에서 JSON logFormt가 지정되어 있음에도 일부 로그가 TEXT로 출력된 이유를 알 수 없습니다.
$ kubectl logs -n argocd argocd-repo-server-6b8f4449bb-cn8tb
{"level":"info","msg":"Generating self-signed gRPC TLS certificate for this session","time":"2021-05-29T00:50:34Z"}
{"level":"info","msg":"Initializing GnuPG keyring at /app/config/gpg/keys","time":"2021-05-29T00:50:34Z"}
{"dir":"","execID":"ZaGQl","level":"info","msg":"gpg --no-permission-warning --logger-fd 1 --batch --generate-key /tmp/gpg-key-recipe337068804","time":"2021-05-29T00:50:34Z"}
time="2021-05-29T00:50:34Z" level=info msg=Trace args="[gpg --no-permission-warning --logger-fd 1 --batch --generate-key /tmp/gpg-key-recipe337068804]" dir= operation_name="exec gpg" time_ms=215.4307
{"level":"info","msg":"Populating GnuPG keyring with keys from /app/config/gpg/source","time":"2021-05-29T00:50:34Z"}
...
Argo CD는 Argo proj/argo-helm을 사용하여 다음 설정을 통해 지정되었습니다.
https://github.com/argoproj/argo-helm/tree/master/charts/argo-cd
# Chart.yaml
apiVersion: v2
name: sample-argocd
description: sample argocd
type: application
version: 0.1.0
dependencies:
  - name: argo-cd
    version: 3.2.4
    repository: https://argoproj.github.io/argo-helm

---
# values.yaml
argo-cd:
  controller:
    logFormat: json
  server:
    logFormat: json
  repoServer:
    logFormat: json
github 코드를 보고도 "logFormat: json로 지정하면 JSON이 출력된다"고만 써서 고장난 것 같아요.

물줄기


나는 약간의 문제가 있는 것 같아서 절차는 다음과 같다.

1. ISSUE가 나타날지 확인


다른 사람들이 같은 문제를 겪는 경우가 많기 때문에 ISSUE가 나왔는지 먼저 확인했다.
확인해 봤는데 클로즈드지만 그거 같은 ISSUE를 발견했어요.안에서 보면 같은 증상이긴 하지만 현재 버전도 발생하기 때문에 아직 수정되지 않은 채 완성됐다.
https://github.com/argoproj/argo-cd/issues/5641

2. ISSUE 보내기


현재 같은 증상으로 ISSUE가 나타나지 않은 것 같아 ISSUE가 나왔다.
갑작스럽게 조사해 봤자 원인을 전혀 알 수 없다(해당 로그만으로는 설치원으로 거슬러 올라가기 어렵다...)그러니 Argo Project 관계자에게 먼저 보고하면 됩니다.
https://github.com/argoproj/argo-cd/issues/6234
ISSUE를 쓸 때 Contribution guide와 ISSUE의 템플릿에 여러 가지 규칙이 있어서 검사하면서 썼습니다.
또 과거에 등장했던 ISSUE 등도 참고했다.
https://argo-cd.readthedocs.io/en/latest/developer-guide/contributing/

이유를 알려주세요.


Argo Project 관계자가 원인과 발생한 이유를 알려주었습니다(감사합니다!)
외부 프로그램 라이브러리를 사용할 때 logger를 매개 변수로 설정해서 전달해야 하지만 사용자가 지정한 설정값을 사용하지 않고 logger init만 전달합니다.

4. 대처법을 생각하라


원인을 알았기 때문에 처리 방법을 고려했다.
우선,logger가 현재 설정된 값을 가져오는 방법이 있는지 확인했습니다.저는 logger 측에서 방법이 있다면 사용하기만 하면 해결할 수 있다고 생각해요. 그래서 간단해요.
logger는 Logurus를 사용하기 때문에 원본 코드를 포크한 후 내부를 배회합니다.
https://github.com/sirupsen/logrus
logLevelGetLevel에 관해서는 이런 방법이 있어서 쉽게 얻을 수 있는데 logFormt에 관해서는 방법이 없는 것 같아요...
이를 위해 로고루스에 현재 설정된 로고포맷을 얻을 수 있는 방법을 만들어 PR을 낼 계획이다.
그러나 로구루스는 새로운 기능 등을 받아들이지 않는 등 유지보수 모드에 들어갔다.
Logrus is in maintenance-mode. We will not be introducing new features. It's simply too hard to do in a way that won't break many people's projects, which is the last thing you want from your Logging library (again...).
아고프로젝트 관계자는 "로저러스가 유지보수 모드에 들어간 것으로 알고 있어 기능 확장에 대한 홍보는 받아들일 수 없을 것 같다"며 "하지만 아고 CD 내부에서 스스로 로거 설정 정보를 얻을 수 있는 기관을 준비할 수 있을 것 같다"고 말했다.이런 조언을 받았습니다(감사합니다v2!).
logger의 설정은 프로그램 라이브러리의 방법에서 얻을 수 없기 때문에 다음과 같은 것을 선택할 수 있다고 생각합니다.
  • 사용자가 최초로 교부한 설정값을 매개 변수에 혼합하여 매개 변수로 상응하는 처리
  • 에 힘껏 전달한다.
  • 어떤 방식으로 전역에 값을 얻기
  • 먼저 사용자를 자신의 설정값에 매개 변수에 섞은 다음에 매개 변수로 상응하는 처리에 자꾸 맡긴다
    기존 코드를 보면 기존 매개 변수에 사용된 값을 곱하기가 어려울 것 같아서 순수하게 매개 변수를 추가했다.
    불합격한 곳은 아고 CD 내 여러 곳에 흩어져 있고, 단순히 매개 변수를 추가하면 수정된 곳이 엄청나게 많아진다.수정하고 싶은 내용에 대한 영향 범위가 너무 넓어서 좋은 수정이라고 할 수 없기 때문에 채택하지 않았다.
    어떤 방식으로 전역에 값을 얻다
    Argo CD를 시작할 때 사용자가 logger의 설정 정보를 보내기 때문에 주로 사용하는 logger 초기화 처리에서 현재 설정값을 전역값으로 설정하면 필요한 곳에서 자유롭게 얻을 수 있습니다.
    이른바 전역 변수처럼 준비하는 것은 번거롭다. 골랑 특유의 기능을 찾지 못하기 때문에 환경 변수로 준비하기로 했다.

    5. 수정 코드 쓰기


    Argo CD를 시작할 때 사용자가 제공한 logger의 설정 정보를 환경 변수로 설정하는 것이 수정되었습니다.
    기존 코드는 SetLogFormatSetLogLevel가 있는데 여기에 응용 프로그램의 기초로 하는logger를 설정했다.
    이러한 방법은 서버가 시작될 때만 사용하기 때문에 기본적으로 안전하게 값을 설정할 수 있으며 환경 변수에logger를 설정하는 처리를 추가합니다.
    func SetLogFormat(logFormat string) {
    	switch strings.ToLower(logFormat) {
    	case utillog.JsonFormat:
    		os.Setenv(common.EnvLogFormat, utillog.JsonFormat)
    	case utillog.TextFormat:
    		os.Setenv(common.EnvLogFormat, utillog.TextFormat)
    	default:
    		log.Fatalf("Unknown log format '%s'", logFormat)
    	}
    
    	log.SetFormatter(utillog.CreateFormatter(logFormat))
    }
    
    func SetLogLevel(logLevel string) {
    	level, err := log.ParseLevel(logLevel)
    	errors.CheckError(err)
    	os.Setenv(common.EnvLogLevel, level.String())
    }
    
    설정된logger 설정 측면을 참조하는 코드는 다음과 같다.
    환경 변수에서 logger 설정을 가져와 새 logger를 만듭니다.이 항목을 호출하면 사용자가 첫 번째로 지정한 설정 값을 계승할 수 있습니다.
    const (
        JsonFormat = "json"
        TextFormat = "text"
    )
    
    func NewWithCurrentConfig() *logrus.Logger {
    	l := logrus.New()
    	l.SetFormatter(CreateFormatter(os.Getenv(common.EnvLogFormat)))
    	l.SetLevel(createLogLevel())
    	return l
    }
    
    func CreateFormatter(logFormat string) logrus.Formatter {
    	var formatType logrus.Formatter
    	switch strings.ToLower(logFormat) {
    	case JsonFormat:
    		formatType = &logrus.JSONFormatter{}
    	case TextFormat:
    		if os.Getenv("FORCE_LOG_COLORS") == "1" {
    			formatType = &logrus.TextFormatter{ForceColors: true}
    		} else {
    			formatType = &logrus.TextFormatter{}
    		}
    	default:
    		formatType = &logrus.TextFormatter{}
    	}
    
    	return formatType
    }
    
    func createLogLevel() logrus.Level {
    	level, err := logrus.ParseLevel(os.Getenv(common.EnvLogLevel))
    	if err != nil {
    		level = logrus.InfoLevel
    	}
    	return level
    }
    

    6. PR 보내기


    코드Contribution guide를 수정했기 때문에 과거 통합된 PR을 참고해 PR을 제안했다.
    기존의 상하문에 대한 이해가 매우 얕기 때문에 나는 자신의 견해를 썼다.
    https://github.com/argoproj/argo-cd/pull/6301#event-4815213597

    7. 리뷰 & 앱러브 받기


    리뷰 하세요, 무사히 앱러브!

    잡감


    OSS에 오른 질문으로 ISSUE를 보내고 수정 PR을 보내면 앱러브를 받을 때까지 소중한 경험을 할 수 있다.
    이를 계기로 OSS 주최자 활동을 계속해 주시기 바랍니다!

    좋은 웹페이지 즐겨찾기