분류 전체보기

💻 CSP/GCP

[GKE] Some backend services are in UNHEALTHY state

[GKE] Some backend services are in UNHEALTHY state Ingress를 구성하는 중, 자꾸 백엔드에서 UNHEALTHY state가 발생하며 서버에 접근이 안됐다. NLB, Nodeport 다 접근이 되는데 Ingress만 UNHEALTHY라고 하니까 아주 미칠 노릇 🙄🙄 서버의 오류 메시지도 404,504 같은게 상태 코드를 보여주는게 아니라 그냥 30초있다가 재시도해보라는 이상한 솔루션만 제시 🤬 원인은 백엔드 서비스 즉 nodeport의 상태가 비정상이라서 그렇다고하는데 아무리봐도 노드포트의 상태가 비정상이면 노드포트로 접속이 안될것같은데 노드포트로는 잘 접속이 되니 .... 대체 뭐가 문제지하면서 머리를 싸맸다😂 아무래도 국내에는 gcp에 대한 자료가 얼마 없다..

💻 CSP/GCP

[GCP] Artifact Registry

[GCP] Artifact Registry 도커 이미지를 GCP의 이미지 저장소에 Push 하려고 알아보니, 기존 구글의 Container Registry는 지원이 중단 되었고, 2024년 5월 15일 이후에는 Artifact Registry만 지원한다고 한다. 내가 못찾은 건지는 모르겠는데 Container Registry는 신규 저장소 생성이 안되는 것 같음 Artifact Registry Docker 컨테이너 이미지를 저장하고 관리하기 위한 저장소 Cloud Build를 이용해 Google Cloud Cl/CD 서비스 또는 기존 CI/CD 도구와 통합할 수 있음 또한 컨테이너 분석을 사용하여 컨테이너 메타 데이터를 관리하고 컨테이너 취약점을 스캔 저장소 생성 나는 Google Cloud의 CI/CD..

🐳 Container/K8S

[K8s] NodePort VS LoadBalancer VS Ingress

[K8s] NodePort VS LoadBalancer VS Ingress 너무 헷갈려서 정리..😢 ClusterIP 클러스터 내의 다른 앱이 접근할 수 있게 해준다. 외부 접근이 되지 않는다. 쿠버네티스 proxy를 통해선 접근이 가능하다. 외부로 노출되지 않고 클러스터 내에서만 접근 가능한 서비스에 적합하다. ExternalName 외부서비스를 쿠버네티스 내부에서 호출하고자 할 때 사용한다. Selector가 아닌 DNS 이름을 사용하는 특수한 서비스다. NodePort 서비스에 외부 트래픽을 직접 보낼 수 있는 방법이다. 모든 Node에 특정 포트를 열어두고, 이 포드로 보내지는 모든 트래픽을 서비스로 포워딩한다. 개발 및 테스트 환경에서 주로 사용된다. LoadBalancer Load Balanc..

👩‍💻 Develope/Python

[Pymysql] 파라미터 전달

[Pymysql] 파라미터 전달 사용자의 입력값을 받아서 select 절이나 where 절에 사용하고 싶을 때, pymysql에선 %s를 이용하여 파라미터를 전달한다. 나같은 경우엔 로그인 정보가 맞는지 대조하기위해 사용 플라스크에서 request.form 이용해 클라이언트의 입력값를 서버로 받아온다. if request.method == 'POST': username = request.form['id'] password = request.form['pwd'] 그 후 db를 연결 한후 cursor로 값을 조회 cursor.execute에서 query와 변수를 넣는다 with db.cursor() as cursor: sql = """ SELECT idx, userid, userpwd, usermail FR..

👩‍💻 Develope/Python

[Flask] 메시지 플래싱 (Message Flashing)

[Flask] 메시지 플래싱 (Message Flashing) 플라스크는 플래싱 시스템을 가지고 사용자에게 피드백을 주는 간단한 방법을 제공한다. 즉, 플래싱이란 서버에서 처리하며 생긴 오류사항/처리사항을 HTML에 넘겨 줄 수 있는 기능을 말한다. 만약 사용자가 로그인 정보를 입력하지 않았을 때, 피드백을 보내고싶다고하면 다음과 같이 작성할 수 있다. 입력받은 정보의 길이가 0이라면 flash 메시지를 보내도록 한다. if len(username) == 0 or len(password) == 0: flash("ID 또는 PASSWORD를 입력하세요") return redirect('/login') HTML에선 다음과 같이 작성해준다. body 태그 안에 넣어주면 된다. {% with messages =..

👩‍💻 Develope/Python

[Flask] form 값 받기 (request)

[Flask] form 값 받기 (request) 페이지의 form을 주고 받기 위해 GET, POST 방식을 사용한다. 🔎 GET 클라이언트에서 서버로 정보를 요청하기 위해 사용되는 메서드 🔎 POST 클라이언트에서 서버로 데이터를 보낼 때 사용되는 메서드 Flask는 templates라는 폴더를 통해 Html과 연동하여 동작한다. HTML 코드를 아래와 같이 작성하면 Flask에서는 사용자의 Input 값을 다음과 같이 받아온다. @app.route('/login_proc', methods=['GET', 'POST']) def login_proc(): if request.method == 'POST': username = request.form['id'] password = request.form['..

🐳 Container/K8S

[K8s] helm chart를 이용하여 GKE에 jenkins 설치

[K8s] helm을 이용하여 GKE에 jenkins 배포 1. GKE 클러스터 생성 클러스터 생성은 GGP의 Cloud Shell에서 진행 1-1. Region 설정 gcloud config set compute/zone us-central1-f 1-2. cluster 배포 node 개수는 2개, type은 standard로 생성해줌 gcloud container clusters create jenkins-cluster \ --num-nodes 2 \ --machine-type n1-standard-2 \ --scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform" 2. Helm repo 추가 helm repo add jenki..

💽 CICD/Git

[Git] 체리픽 (Cherry-Pick)

[Git] Cherry-Pick 다른 브랜치에 적용된 커밋을 가져와서 특정 브랜치에 적용하고 싶은 경우에 다른 브랜치에 새로운 커밋이 추가된 경우엔 rebase를 사용하고 그게 아니라면 cherry-pick 명령을 사용해서 다른 브랜치의 커밋을 가져올 수 있음 사용법은 다음과 같음 git cherry-pick [커밋 해시] 예를 들어, feature 브랜치의 커밋을 master 브랜치로 가져오고싶다면 아래와 같이 진행 git checkout master git log --pretty-oneline --graph --all git cherry-pick [feature 브랜치의 커밋 해시] cherry-pick 작업 시 충돌이 발생할 수도 있음, 이땐 충돌 해결 후 cherry-pick을 계속 진행 1. 충..

💾 Data/etc

[Superset] 차트에 HyperLink 걸기

[Superset] 차트에 HyperLink 걸기 Superset에서 차트 구성을 할 때 컬럼에 하이퍼링크를 걸고싶은데, 아쉽게도 Superset에서 따로 지원을 하지 않는 기능인 것 같다. 대신 HTML의 href 속성을 사용해서 Chart에서 링크를 걸 수 있는 것 같다. Dataset에서 데이터 가공이 필요함 아래와 같은 SQL문을 사용하면 된다. +) target 옵션이 _blank일 경우 새탭에서 창이 열린다. _self 일 경우 현재탭에서 오픈한다, default 값으로 생략이 가능하다. CONCAT('',url,'') AS url concat안의 url은 각자의 컬럼명으로 변경해서 사용하면 될 듯 대신 위와 같은 방법을 사용하기 위해선 컬럼의 데이터가 올바른 링크여야 함 아래는 테스트용으로 ..

🌏 OS/Linux

[Shell Script] 파일의 변경 시간에 따라 조건 설정하기

[Shell Script] 파일의 변경 시간에 따라 조건 설정하기 https://heywantodo.tistory.com/137 위 포스팅에서 토큰 파일에 내용이 있으면 로그인 명령을 실행하는 스크립트를 구성했는데, 토큰 파일이 만료되면 파일이 사라지는게 아닌 그대로 있고 토큰 코드만 만료되는 것이었다 😱 😱 생각해보면 당연한건데 😢 그래서 토큰 코드는 1시간 주기로 새로 받아야하니, 토큰 파일의 변경시간을 확인하고 1시간 이상 변경이 없다면 로그인을 수행하는 스크립트로 새로 구성했다. 새롭게 구성한 스크립트는 다음과 같다. #!/bin/bash file_path="/path/to/file.txt" # 파일의 변경 시간을 가져옴 file_modified=$(stat -c %Y "$file_path") #..

💾 Data/Airflow

[Airlfow] Sensor

[Airlfow] Sensor Airflow의 Sensor는 워크플로우 내에서 특정 이벤트 또는 조건이 발생할 때까지 작업을 지연시키는 데 사용 즉, Sensor는 다른 작업이 실행되기 전 특정 상태가 충족될 때까지 기다리는 역할을 함 예를 들어, 특정 파일이 생성되거나 특정 시간에 도달하거나 외부 시스템의 상태가 변경될 때까지 작업을 일시 중지 시키는 데 사용할 수 있음 Airflow에는 다양한 종류의 Sensor가 있으며 일반적으로 사용되는 몇 가지 예는 다음과 같음 1. FileSensor 파일이 특정 디렉토리에 존재하는지 여부를 확인한다. from airflow.sensors.filesystem import FileSensor from airflow import DAG dag = DAG("file..

🌏 OS/Linux

[Shell Script] 명령어 실패 시 재시도하기

[Shell Script] 명령어 실패 시 재시도하기 로그인을 성공을 하면 다음 스크립트로 넘어가야하는데, 로그인에 실패를 하는 경우에도 다음 스크립트로 넘어가는 경우가 발생했다. 로그인에 실패를 하는 경우엔 Error가 포함된 메시지가 출력되기 때문에, 아래와 같이 로그인 명령어를 실행했을 때, "Error" 라는 단어가 포함 될 경우 명령어를 재시도하는 코드를 작성했다. while true; do output=$(eval $command_to_run 2>&1) if [[ $output == *"Error"* ]]; then echo "Login failed. Retrying..." echo "Enter Password : " else echo "Login successfully." break fi d..

heywantodo
'분류 전체보기' 카테고리의 글 목록 (25 Page)