logo
logo
백엔드
Flask
파이썬으로 작성된 마이크로 웹 프레임워크의 하나로, 상대적으로 가볍고 빠르며 손 쉽게 사용 할 수 있다.
StackOverflow 질문 수: 55976
Github Stars : ★ 67956
사용 기업
소셜/컨텐츠
금융/보험
모빌리티
기타
푸드테크
직장
종합
인공지능
이커머스
교육
패션
techstack-logo
큐피스트
techstack-logo
파운트
techstack-logo
바로고
techstack-logo
디셈버앤컴퍼니
techstack-logo
버즈빌
techstack-logo
에이비일팔공
techstack-logo
위대한상상
techstack-logo
두나무
techstack-logo
원티드랩
techstack-logo
카카오
techstack-logo
스켈터랩스
techstack-logo
스포카
techstack-logo
쏘카
techstack-logo
번개장터
techstack-logo
링글
techstack-logo
네오사피엔스
techstack-logo
에이모
techstack-logo
두들린
더 보기
기술 블로그 글
SK텔레콤
On-premise에 Kubernetes 구축하기(with Netapp Storage)
최근 Kubernetes 을 이용하기 위해서는 Public Cloud 에서 제공하는 PaaS 상품을 이용하는게 일반적이지만,기존 On-premise 데이터센터에 여유있는 리소스를 활용 할 수 있는 경우와 또한 Private한 Kubernetes를 환경을 구축해야하는 경우는여전히 On-premise 환경에서의 Kubernetes 구성에 대한 요구가 존재 합니다.아래 작성된 내용은 현재 On-premise 환경에서 운영하고 있는 Kubernetes 구축 내용을 command (kubeadm 활용) 단위로 정리 하였습니다.안타깝게 최신버전이 아닌 Kubernetes 1.26 기반으로 작성되어 있으나, 1.26 버전 이후 부터는 구성 방법에 대한 큰 변화가 없기 때문에 최신 버전에서도 활용 가능합니다.또한 레포지토리 및 메뉴얼 링크, 주요 depolyment yaml 파일 링크는 최신 및 현재 활용 할 수 있는 버전으로 내용 업데이트 하였습니다.On-premise 환경 Kubernetes 운영에 있어 HA 측면 가장 고민스러운 PV (Physical Volume)과 서비스 LB (Load Balancer) 을 Netapp사의 trident를 이용하여Nettap NAS (ONTAP NAS) 와 Metal LB를 이용하였습니다. 인증은 자체 구축한 LDAP 서비스를 이용하였으며, Flask를 이용한 인증처리 서버를 간단히 구현한 내용을 포함하였습니다.K8s 내부 이중화를 위해서는 On-premise의 L4 스위치 장비를 이용하였습니다.from flask import Flask, request, jsonify import pprint import requests import ldap from requests.auth import HTTPBasicAuth app = Flask(__name__) @app.route('/', methods=['POST']) def auth(): # User가 kubernetes API Server에 인증 요청 # Kubernetes API Server 가 사전에 정의 된 Webhook Server로 REST 요청보낸것을 받아오는 코드 tokenReview = request.json print(" ") # Webhook Server에 연동되어있는 인증 서버에서 인증 결과 받아옴 tokenReview['status'] = external_auth_LDAP(tokenReview) pprint.pprint('---return result---') pprint.pprint(tokenReview) # Webhook Server에서 Kubernetes API Server로 인증결과 보냄 return jsonify(tokenReview) # 외부 인증 시스템 def external_auth_LDAP(tokenReview): try: user, pw = tokenReview['spec']['token'].split (':') # 예제에서 생성했던 도메인 정보 (/etc/hosts 에 localhost로 명시했음) ldap_address = "ldap://172.27.xxx.xxx:389" ldap_object = initialize_ldap(ldap_address) ldap_result = authenticate(ldap_object, ldap_address, user, pw) print('result: %s'%(ldap_result)) if ldap_result == True: status = {} status['authenticated'] = True status['user'] = { 'username': user, 'uid': user, 'groups': ['apollo'] } else : status = {} status['authenticated'] = False except: status = {} status['authenticated'] = False return status def authenticate(ldap_object, ldap_address, user_name, password): try: ldap_object.simple_bind_s(user_name, password) except ldap.INVALID_CREDENTIALS: ldap_object.unbind() return False except Exception as e: print(e) return False return True def initialize_ldap(ldap_address): ldap_object = ldap.initialize(ldap_address) return ldap_object if __name__ == '__main__': app.run() EOF systemctl ldap-webhook
flask
kubernetes
SK텔레콤
[네트워크] Flask는 어떻게 동작하는가 2편(with WSGI)
그동안 계속해서 네트워크 관련 Low Level을 알아 보았습니다.이번에는 Python에서 많이 사용되는 WebFrameWork인 에 대해서 알아보는 두번째 시간입니다!는 서버를 이용하고, 는 를 이용한다고 했습니다.하지만 이걸로만은 부족하죠?분명 Flask는 다양한 url_rule, EndPoint를 설정하고, 하나의 서버에서 이 EndPoint를 모두 다룰 수가 있습니다.그러면 어떻게 다양한 EndPoint를 다룰 수 있는지 이 부분에 대해서 알아보겠습니다.tutorial을 보면 의 를 Decorator로 사용해서EndPoint를 추가하는 것을 볼 수 있습니다.그럼 의 를 찾아가 볼까요?위 패턴은 Decorator 함수 이면서 매개변수를 받는 경우입니다.그렇기 때문에 rule = endpoint를 String으로받음 일것 같지만가 Decorator로 한번더 감싸진것을 볼 수 있습니다.이때 는 같은 파일에서 정의 되어 있습니다.: 를 통해서 받아들인 매개변수를 , 로 받아들임: 의 매개변수 f로 들어가서 에서 사용됨Decorator를 풀어서 보면, 아래처럼 실행 될겁니다.조금 복잡하게 구성되어있지만, 여튼 위와같은 순서로 작동하게 됩니다.결국 중간에 을 통과하면서 url 리스트와 상호작용 후함수 자기자신이 다시 나오게 되는 구조입니다.이제 을 볼 차례입니다.• None Decorator를 달아도 함수 자체는 변하지 않는다.• None 이 과정에서 을 통과한다• None Object를 만들어서 Object에 추가한다.• None Flask는 자체적으로 라는 dict에 를 저장한다결국 돌아가서 객체가 werkzeug Server에서 어떤 역할을 하는지를 알아야합니다,그래서 다시 로 돌아가 보겠습니다.이전 포스팅에서 werkzeug 서버는 Requests를 처리할 때 를 상속받은 를 사용한다고 했습니다.그리고 이때 에서 , 을 호출하면서 Requests 처리가 시작됩니다.(이 내용 역시 Python의 CGI에서 다뤘었죠)이때 지난 포스팅에서 넘어갔던 부분을 다시 살펴보겠습니다.에서 를 호출하고, 호출된 함수를 실행시키면서 Response를 보내게 되어 있습니다.그럼 이 를 좀더 세밀하게 살펴볼 시간 입니다.일단 먼저 함수 내부에서 정의한 함수를 통해서 requests 처리가 시작됩니다.이때 이라는 것을 넣어주게 되는데이 는 의 생성자에서 설정이 됩니다.그러면 최초로 라 Call된 시점으로 가 보겠습니다.여기서 를 통해서 시작이 되는데이때 인것을 알 수 있습니다.그래서 에는 가 들어가게 될겁니다.그리고 의 정체가 바로 가 되게 되죠.이제 좀더 나가볼까요?이때 application_iter를 통해서 작성해야할 HTTP Msg를 받아오게 됩니다.이제 다시 로 가보겠습니다.위에서 보면 (Dict로된 환경변수 모음)이 의 매개변수로 들어가고을 활용해서 를 생성합니다.여기서 를 통해서 단서가 잡히게 됩니다.근데 위에서 를 했던거 기억 나시나요?이부분을 다시 살펴보겠습니다.에서 사용하던 이 만들어지는 부분을 확인할 수 있습니다.그러면 를 통해서 url정
flask
SK텔레콤
[네트워크] Flask는 어떻게 동작하는가 1편 (with WSGI)
그동안 계속해서 네트워크 관련 Low Level을 알아 보았습니다.이번에는 Python에서 많이 사용되는 Web FrameWork인 Flask에 대해서 알아보겠습니다.대신, 어렵지않게 튜토리얼과 함께 말이죠!Flask는 Python의 대표적인 입니다.각 , 마다 동작할 함수를 미리 기술해두고이 기술된 함수에 맞춰 requests를 처리하는 패키지 입니다.이러한 방식은 나 도 동일한 구조를 갖고있죠.이러한 Flask가 어떻게 동작하는지 튜토리얼과 함께 알아 볼겁니다.그럼 Flask 공식 github에서 제공하는 Tutorial을 간단히 살펴보겠습니다.최초로 를 만들고여기에 decorator를 사용해서 routing을 추가합니다.그리고 마지막에 을 사용해서 웹서버가 동작하게 됩니다.일단 는 아래처럼 상속구조를 가지고 있습니다.이때 다행히도(?) 에서 을 바로 찾을 수 있습니다.Flask는 자체적으로 의 을 사용하는 것을 볼 수 있습니다.그럼 이제 잠깐 를 알아보러 가보겠습니다.는 를 wrapping한 패키지 입니다.Flask에 사용되는것으로 유명하지만, 자체적으로 webserver를 띄울 수가 있습니다.사용패턴을 보면 알 수 있지만, server에 application을 집어넣어주는 방식이여턴 werkzeug에서 사용되는 을 한번 봐보겠습니다.이때 이 정확이 어떤 type인지 알수가 없는 상태 입니다.코드상으로 보면 역시 에 포함됩니다.이때 소스코드에서 _typeshed라는것이 등장합니다.그래서 에서 이 정의되어 있고, type과 일치하는 것을 볼 수 있습니다.다시 돌아가보면, 내부에서 를 사용하는 상황 입니다.는 thread와 process정보에 따라 다른 ServerClass를 제공해 줍니다.이때 에 대한 코드를 봐 볼까요?이제 wsgiref를 어떻게 사용하는지 보이시나요?이전 WSGI포스팅 1편에서 보았듯WSGI는 를 실행하면서 를 이용해서 Client의 requests를 받아들이고받아들인 requests를 를 사용해서 처리합니다.werkzeug가 wsgiref와의 차이점은정도가 되겠습니다.이후에 requests를 처리할때는 와 유사하게 를 상속받아서 사용하기 됩니다.이때 을 처리할 때 내부의 를 사용합니다.여기까지 어떻게 Flask 서버가 동작하는지 알아 보았습니다.하지만 여기까지만 봐서는 와 차이점을 알기 어렵습니다.이때 decorator를 통해서 다수의 endpoint를 다룰 수 있게 됩니다.이 내용은 다음 시간에 이어서 다룹니다!
flask
네이버클라우드플랫폼
Kubernetes 클러스터에 애플리케이션 배포하기
Kubernetes 클러스터에 애플리케이션 배포하기 — 네이버 클라우드 플랫폼 Developer Tools (개발자 도구) 활용 실습DevOps의 중요도가 높아지면서 네이버 클라우드 플랫폼의 Developer Tools (개발자 도구)에 대한 관심이 높아지고 있습니다. 그러나 DevOps에 대한 체계적인 이해가 부족한 경우 환경을 구축할 때 서비스 간의 연관 관계와 특징을 파악하는 데 어려움을 겪을 수 있습니다.네이버 클라우드 플랫폼 사용자 분들의 서비스 사용 진입 장벽을 낮추고 편리함을 알리기 위해 간단한 실습을 준비하였습니다. 네이버 클라우드 플랫폼 Developer Tools를 활용한 실습 과정을 소개합니다.Developer Tools 소개네이버 클라우드 플랫폼은 소프트웨어 개발 환경을 신속하고 안전하게 구축 및 배포할 수 있도록 Developer Tools 서비스를 제공합니다. 사용자는 SourceCommit, SourceBuild, SourceDeploy, SourcePipeline 4종의 서비스를 통해 개발 편의성을 높일 수 있습니다. 각 서비스는 아래의 목적으로 사용되며 DevOps의 전 과정을 지원합니다.네이버 클라우드 플랫폼 Developer Tools (링크)SourceCommit : 개발에 필요한 모든 형태의 파일을 안전하게 저장하고 관리할 수 있는 프라이빗 Git 리포지토리SourceBuild : 다양한 언어의 소스 코드를 손쉽게 빌드하는 완전 관리형 병렬 빌드 서비스SourceDeploy : 새로 작성됐거나 업데이트된 소스를 서버에 자동으로 배포하고 적용하는 자동화 배포 서비스SourcePipeline : 리포지토리, 빌드, 배포 프로세스를 통합하여 소프트웨어 출시를 자동화하는 서비스실습 소개앞서 소개한 SourceCommit, SourceBuild, SourceDeploy, SourcePipeline 서비스를 이용한 실습을 진행합니다. (1) 예제 코드를 빌드하여 컨테이너 이미지를 생성하고 컨테이너 레지스트리에 저장하고 (2) 저장된 컨테이너 이미지를 Kubernetes 클러스터에 배포하고 애플리케이션이 올바르게 동작하는지 확인하면 (3) 해당 애플리케이션은 호출 시 파드의 IP 주소, 이름, 현재 시간, URI 정보를 반환하게 됩니다.실습 진행을 위해 아래 서비스 리소스가 준비되어 있어야 합니다.빌드를 위해 사용할 코드가 존재하는 프라이빗(퍼블릭) Github 리포지토리 — 예제 파일 (Dockerfile, app.py, requirements.txt, flask-deployment.yaml, flask-service.yaml)빌드 결과물이 직접 저장되는 Object Storage빌드 결과물인 컨테이너 이미지를 저장하고 관리하는 Container Registry빌드 결과물을 배포 할 Kubernetes ServiceSourceCommit을 이용하여 외부 리포지토리 복사 이후 커밋 진행하기외부 리포지토리 복사SourceCommit에서는 신규 리포지토리를 생성할 수도 있지만 기존의 리포지토리를 복사할 수도 있습니다
docker
flask
github
kubernetes
python
연관 기술 스택
techstack-logo
Django
techstack-logo
FastAPI
Copyright © 2024. Codenary All Rights Reserved.