Programming/책 요약
쿠버네티스를 활용한 클라우드 네이티브 데브옵스 #4
2020. 7. 27.도커 컨테이너에 문제가 발생하면 누군가 지켜보다 종료 후 재시작을 해줘야한다. → 쿠버네티스의 Deployment 디플로이먼트의 기본 정책은 컨테이너가 종료되면 (정상이든 비정상이든) *_항상 재시작. *_이건 설정을 바꿀 수 있음 디플로이먼트는 지정된 수만큼 컨테이너가 실행되고 있는지 확인하는 것. 기준보다 적으면 컨테이너를 늘리고 많으면 줄인다. 이게 기본 역할. Pod(파드)는 하나 이상의 컨테이너 그룹으로 구성된 쿠버네티스 오브젝트 kubectl run 을 하면 디플로이먼트 만들고 디플로이먼트가 파드를 실행한다. replicaset object(레플리카셋 오브젝트)는 동일한 파드 집합과 레플리카를 관리한다. 즉, 파드 관리는 레플리카셋이 한다. 사용자는 디플로이먼트를 다루며 레플리카셋을 (거의) ..
쿠버네티스를 활용한 클라우드 네이티브 데브옵스 #3
2020. 7. 17.클러스터 구축, 튜닝, 문제 해결 같은 내용은 "매니징 쿠버네티스" 읽기 쿠버네티스는 여러개의 클러스터로 연결됨 Control Plain(컨트롤 플레인)은 컨테이너 스케쥴링, 서비스 관리, API 처리 등을 한다 컨트로 플레인은 클러스터내 마스터 노드에서 실행된다. 워커 노드는 클러스터 안에서 사용자의 워크로드를 실행 클러스터 크기가 매우 작지 않으면 마스터 노드는 워크로드를 실행하지 않는다. 쿠버네티스는 고가용성을 지원한다. 고가용성(High Availability) : 시스템이 절대로 뻗지 않는다는 뜻. 시간대비 장애시간으로 측정하는데 (예로 100분 중에 1분 장애나면 99%) 1년중에 5분 15초내의 장애시간을 가지면 5 Nines (99.999%)로 고가용성의 기준점이다. 고가용성을 지원하기에 ..
쿠버네티스를 활용한 클라우드 네이티브 데브옵스 #2
2020. 7. 10.(도커) 컨테이너 이미지 빌드 # go가 설치된 OS를 빌드하기 위해 "가져만 온다" FROM golang:1.14-alpine AS build WORKDIR /src/ COPY main.go go.* /src/ # 가져온 OS에 설치된 go를 사용해 빌드한다. binary만 생성 RUN CGO_ENABLED=0 go build -o /bin/demo #빈 컨테이너 이미지 (scratch)에 binary를 넣어 docker image를 만든다 FROM scratch COPY --from=build /bin/demo /bin/demo ENTRYPOINT ["/bin/demo"] 이러면 6MB 정도의 컨테이너 이미지가 생성. GO로 해서 이정도고 공식 Ruby 컨테이너로 만들면 1.5GB정도 나온다고 한다...
쿠버네티스를 활용한 클라우드 네이티브 데브옵스 #1
2020. 7. 9.cloud native는 cloud devops container 로 구성된다. 이것을 운영하는 시스템 플랫폼 중 하나가 kubernetes (쿠버네티스) 다. 클라우드는 컴퓨터를 구매하지 않고 컴퓨터 리소스를 구매하는 것. 데브옵스 운동은 개발자와 운영자가 서로 협업하고 다양하고 복잡해진 시스템의 신뢰도와 정확성에 대한 책임을 공유하는 것을 뜻함. 여기서 운영은 서버운영을 뜻함 → 줄여서 개발자와 운영자가 협업하는 것 데브옵스란 Culture (문화) Automation (자동화) Measurement (측정) Sharing (공유) 이다 (줄여서 CAMS) - 브라이언 도슨 데브옵스 운동은 소프트웨어 개발 기술을 운영에 도입하는 것 Infrastructure as code(코드형 인프라) 개념에선 운..
Effective Python #10
2020. 4. 4.10. range보다는 enumerate를 사용하자 for문에서 list의 index를 다뤄야 할 때 enumerate를 쓴다. >>> flavor_list = ['a', 'b', 'c', 'd','e'] >>> for i, flavor in enumerate (flavor_list): ... print('%d, %s' %(i+1, flavor)) 1, a 2, b 3, c 4, d 5, e enumerate 함수의 두번째 옵션은 iterator의 시작값이다 2로 하면 i를 2부터 센다 >>> for i, flavor in enumerate (flavor_list, 2): ... print('%d, %s'..
Effective Python #9
2020. 4. 4.9. 컴프리헨션이 클 때는 제너레이터 표현식을 고려하자 리스트 컴프리헨션은 결과값이 새로운 리스트다. 따라서 결과를 얻을 때마다 메모리가 소모된다. 리스트 컴프리헨션이 아닌 제너레이터(generator) 표현식으로 표현하면 제너레이터 객체를 전달한다. 이 객체는 iterator를 가지고 있다. result = [len(x) for x in open('test.txt')] 리스트 컴프리헨션 result = (len(x) for x in open('test.txt')) print(next(result)) generator. iterator가 있어서 next로 접근된다. 새로운 list 생성 안한다 제네레이터 안에 다른 제네레이터를 넣어서 쓸 수 있다. 이렇게 복잡하게 할 일 이 ..
Effective Python #8
2020. 4. 4.8. 리스트 컴프리헨션에서 표현식을 두 개 넘게 쓰지 말자 같은 loop level에 여러 조건이 있으면 자동적으로 (암시적으로) and 표현이 된다 something = [...] b = [x for x in something if x > 3 if x % 2 == 0] 개인적으로 and 쓰는게 보기에 편한 것 같다. 줄어도 보기가 힘들다. 표현식이 두 개가 넘으면 리스트 컴프리헨션을 쓰지 말자 조건 두 개 loop 두 개 조건 한 개, loop 한 개 이렇게가 최대치다. 이것보다 복잡하면 if와 for를 사용하는 헬퍼 함수를 사용한다.
Effective Python #7
2020. 4. 4.7. map과 filter 대신 리스트 컴프리헨션을 사용하자 list comprehension 을 쓰면 새로운 리스트를 만들어낸다. map, filter 보다 간결하고 보기 좋아서 리스트 컴프리헨션의 사용을 추천한다. list, dict, set에서 사용할 수 있다.
Effective Python #6
2020. 4. 4.6. 한 슬라이스에 start, end, stride를 함께 쓰지 말자 이 장은 개인적으로 동의하지 않는다. 클린코드에서 말하는 "한 라인에 한 동작"에 확실히 stride가 반대되는 (slicing과 stride를 동시에 한 라인에서 한다) 함수이지만 그렇다고 굳이 할당을 한 뒤에 stride를 사용하는 것은 무의미하다고 생각한다. stride를 음수로 사용하지 않는 것도 음수를 사용하여 뒤집는 것보다 나은 방법이 떠오르지 않기에 동의하지 않는다. (물론, 아예 사용하지 말라고 쓰지 않았더라도) slicing 후 stride를 하면 얕은 복사가 발생하여 주의를 기울이라고 하였는데 그냥 주어진 함수에서 slicing과 stride를 동시에 처리를 하면 된다. start, end, stride를 동시에 사..
Effective Python #5
2020. 3. 29.5. 시퀀스를 슬라이스하는 방법을 알자 일단 시퀀스는 list, str, byte이다. 거기에 __getitem__이랑 __setitem__을 구현한 클래스 포함이다. somesequense[start:end] 형태로 자른다. 또한 start는 포함, end는 비포함된다. 다른 언어에서 잘 쓰는 0, len(list)는 쓰지않고 그냥 비워둔다. 리스트의 범위를 넘겨 잘라도 알아서 범위까지만 처리한다 슬라이스 크기와 할당하는 개수가 다르면 알아서 크기만큼 없애고 할당하는 개수만큼 넣는다. >>> a = [1,2,3,4,5,6,7,8,9] >>> a[2:7] = ['a', 'b', 'c'] >>> print(a) [1, 2, 'a', 'b..
Effective Python #4
2020. 3. 29.4. 복잡한 표현식 대신 헬퍼 함수를 작성하자 한 줄 또는 여러 줄로 복잡하고 읽기 어렵게 짜느니 편의를 위한 헬퍼 함수를 만들어서 가독성을 높인다. 이건 클린 코드에도 나오는 이야기다.
Effective Python #3
2020. 3. 29.3. bytes, str, unicode의 차이점을 알자 python 3은 str이 unicode(UTF-8), bytes가 raw 8bit python 2는 unicode가 unicode(UTF-8), str이 raw 8bit file stream을 다룰 때 'wb', 'rb'로 설정해야 올바르게 동작한다 with open('/test.txt', 'wb') as f: f.write(os.urandom(1))