-
kubernetes mysql replication
mysql을 쿠버네티스에 배포 연습 다음 방식이 있다. statefulset 을 이용한 자동 배포 수동으로 master slave를 설정하는 배포 statefulset을 사용해서 배포를 하면 다음처럼 하면 된다. Run a Replicated Stateful Application https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/ pv가 dynamic provision이 되면 아주 잘 된다. pv는 ceph를 설치해서 해결햇음. 잘 된다. 스토리지가 좋으면 되는데 네트워크로 묶어서 사용하는 ceph다 보니 해보니 퍼포먼스가 로컬 하드디스크를 쓰는것보다 잘 안나오는듯 보인다. 수동 배포 kubernetes 노드가 4대가 있고 mysql을 각각 노드에 띄우고 모든 pod는 자신의 하드디스크를 스토리지로 사용한다....
-
kubernetes Rook Ceph
node 4개가 있다. 그런데 노드에 하드가 4개씩 달려있다. Name sda sdb sdc sdd node01 1T 1T 1T 1T node02 1T 1T 1T 1T node03 1T 1T 1T 1T node04 1T 1T 1T 1T sda는 os드라이브라 사용하지 않고 나머지 3개 하드 디스크를 ceph로 묵어서 스토리지로 쓰고 싶다. 네트워크라 퍼포먼스 이슈가 있을수 있으니 잘 확인하고 쓴다. 디비등은 문제가 잇을듯 보이고 파일서버나 image등을 http로 주는 서비스등은 잘 쓸수 있을듯 싶다. 백업 용도로도 사용이...
-
Git Ignore
.gitignore 무시하고 싶은 파일은 .gitignore파일에 작성하면 된다. 그런데 거기 잇는데도 계속 변경되어서 커밋이 되는 경우가 있다. 기존 커밋에 포함이 되잇기 때문 git rm --cached .DS_Store 이렇게 지우면 된다.
-
Git Branch Push Force
git 문제 해결 현재 dev브랜치가 있고 new-dev 브랜치가 있다. new-dev브랜치를 dev에 덮어 써야하는 상황이 발생 git checkout new-dev git branch -D dev # dev를 삭제 git checkout -b dev # dev를 생성 git push --set-upstream origin dev --force # 서버에 있는 dev에 강제로 이 버전을 푸시. force는 쓰지 말아야하는데 어쩔수 없었음.. 참고로 로컬에 머지를 해버린 경우 아직 push는 안한경우. 이러면 일단 로컬에 dev를 지운다음 서버에서 가져오면 된다. git checkout dev git branch -D dev2 git...
-
Macosx Terminal Setting
맥 터미널 설정 homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" vscode 설치 brew cask install visual-studio-code 실행후 command shift p » path (옵션에 나오면 선택한다. code 명령어를 path에 등록한다는 이야기) zsh mac이 가지고 있지만 (/bin/zsh) 다시 설치하자. brew install zsh which zsh > /usr/local/bin/zsh # standard shell로 추가 code /etc/shells > /usr/local/bin/zsh # 추가 # 기본쉘로 등록 chsh -s /usr/local/bin/zsh reboot echo $SHELL > /usr/local/bin/zsh # check version zsh --version oh my zsh sh -c "$(curl -fsSL...
-
kubernetes file upload
kubernetes 에서 file upload api를 만들고 난후 문제 dotnet core 로 file upload api를 애저에 쓰게 해서 만들었다. 로컬에서는 잘되었다. 그런데 kube에 올리니 잘되는것처럼 보엿으니 1메가 이상(정확하지는 않음)부터 에러(413)가 나기 시작했다. 처리 해보자. azure가 1메가 이상을 기본으로 안받아주는가.=> 로컬에서 azure로 바로 붙여서 하면 잘된다. 심지어 애저로 안하고 하드디스크에 저장하게 해서 테스트 로컬은 잘됨 서버에서는 에러 azure문제가 아님 dotnet core가 안받아주는가? kestrel이 잘 안해주는가? => 로컬에서는 잘됨 틀림 kestrel문제가 아닌거같은데. kubernetes ingress를 의심해서 에러 메세지(413)와 함게...
-
Angular DatePicker with Momentjs
angular datepicker with momentjs 자바스크립트 date를 다루기가 참 불편했다. 이걸 한방에 해결해주는 momentjs를 사용해봤다. material date picker를 사용하면 날짜를 선택해서 서버로 보내면 브라우저의 타임존을 같이 보내준다. 한국고객과 미국 서버의 경우 하루가 차이가 나게 된다. 분명 10일을 선택햇는데 디비에는 9일로 저장이 된다. 한국 시간을 pst로 바꿔서 저장을 하다보니 그런듯 보임 이걸 해결하기 위해 고민해 보았다. 타임존을 고려해서 디비에 저장후 브라우저에서 다시 바꿔서 보여주기 타임존을 무시하고 날짜를 브라우저에서 짤라서 yyyy/MM/DD만 보내주기 서버에서는 이걸로 date 를 만들어서 처리하기...
-
Angular Control Value Accessor
Angular Control Value Accessor 커스텀 컴포넌트를 폼에서 사용하려면 여러가지 문제에 도달하게 된다. 컴포넌트가 기본 컴포넌트 input select 등과 다르게 움직이기때문이다. Control Access Value를 구현하면 커스텀 컴포넌트도 인풋을 기본 컴포넌트처럼 사용할수 있게 된다. (validation, disable, etc ) Control Access Value를 구현 4가지 기본 함수를 구현해야한다. public writeValue(obj: T) //=> 값을 html에 넣는다. public registerOnChange(fn: any) //=> 컴포넌트 값이 바뀌면 실행 public registerOnTouched(fn: any) //=>컴포넌트가 터치가 되면 public setDisabledState?(isDisabled: boolean) //=> 컴포넌트가 disable이 될때 대부분 비슷하므로 base...
-
webapi file up/download with Azure Storage
Web API File up/download with Azure Storage webapi로 파일을 업로드 다운로드 해볼 일이 있어서 정리해본다. 업로드는 다음 두가지 시나리오를 생각해 봤다. api에서 받아서 로컬 또는 pod에 파일을 업로드/다운로드 하는 경우 api에서 받아서 azure blob storage나 s3로 업로드하는 경우 다운로드의 경우 1번은 실제 파일을 다운로드 시켜주는건 문제가 없어보이지만 2번의 경우는 다른 시나리오가 생긴다. api에서 azure blob storage나 s3에서 받아서 메모리 스트림으로 다시 요청자에게 보내는 방법 api에서 azure를 이용해서 임시 토큰을 발급해서 그 주소를 리다이렉트로 요청자에게 보내면...
-
Angular Form Array
Angular Form Array 폼에서 Array를 써서 동적으로 컴포넌트를 ADD/DELETE 해야 할 경우가 생겼다. 그런데 잘 안되서 정리 Ts에서 다음처럼 코딩햇다. export class NestedFormArray { form = new FormGroup({ cities: new FormArray([ new FormControl('SF'), new FormControl('NY'), ]), }); get cities() { return this.form.get('cities') as FormArray; } addCity() { this.cities.push(new FormControl()); } Html에서는 다음처럼 <form [formGroup]="form" (ngSubmit)="onSubmit()"> <div formArrayName="cities"> <div *ngFor="let city of cities.controls; index as i"> <input formControlName="" placeholder="City"> </div> </div> <button>Submit</button> </form> <button (click)="addCity()">Add City</button>...