개요 : EC2 에서 k8s 를 구성하여 사용중 pod 에서 AWS Network 대역대 DNS 를 찾지 못한 현상이 발생하여, k8s CoreDns 에 지정된 DNS 조회 주소를 변경

 


방법 : CoreDns ConfigMap 수정 후 pod 재실행


 

기본 설정된 내용은 아래와 같습니다.

  • 아래 yaml 파일중 forward . /etc/resolv.conf 부분을 forward . 169.254.169.253 로 변경
  • 169.254.169.253 IP 는 AWS Private Subnet 에서 사용하는 DNS 서버 IP 입니다.
k edit cm -n kube-system coredns
##기본 설정된 내용
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf  {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html

개요 : AWS EKS 에서 볼륨을 사용하기 위해서는 ebs-csi-driver / efs-csi-driver 가 필요합니다

ebs-csi-driver 의 경우 Add-on 형식으로 생성이 가능해져서 어렵지 않개 생성이 가능합니다.

다만, efs-csi-driver 의 경우 Add-on 형식으로 제공이 불가능 하기에 수동으로 설치를 해야 합니다.

 


설치방법

1. IAM 자격증명 공급자 생성

2. IAM Role / Policy 생성

3. EKS 에 install yaml 배포

 


1. IAM 자격 증명 공급자 생성

  • IAM -> 자격증명 공급자 -> 공급자 추가
  • 공급자 URL 에 EKS 개요 탭에 있는 'OpenID Connect 공급자 URL' 복사하여 입력 -> 지문 가져오기
  • 대상에 sts.amazonaws.com 입력 후 생성

2. IAM Role / Policy 생성

  • Policy 정책 생성 (정책 이름은 상관 없음)
  • Role 생성(아래 신뢰관계로 생성) 후 생성한 Policy 추가

Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticfilesystem:DescribeAccessPoints",
        "elasticfilesystem:DescribeFileSystems",
        "elasticfilesystem:DescribeMountTargets",
        "ec2:DescribeAvailabilityZones"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "elasticfilesystem:CreateAccessPoint"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:RequestTag/efs.csi.aws.com/cluster": "true"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "elasticfilesystem:TagResource"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:ResourceTag/efs.csi.aws.com/cluster": "true"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "elasticfilesystem:DeleteAccessPoint",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/efs.csi.aws.com/cluster": "true"
        }
      }
    }
  ]
}

Role 신뢰 관계

  • Statement.Federated 에서 OIDC 정보 수정(1번에서 생성한 OIDC 정보에 있음)
  • Conditon.StringEquals 에서 OIDC 정보 수정(1번에서 생성한 OIDC 정보에 있음)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
        }
      }
    }
  ]
}

 

3. EKS 에 install yaml 배포

---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/name: aws-efs-csi-driver
  name: efs-csi-controller-sa
  namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKS_EFS_CSI_DriverRole

https://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/deploy/kubernetes/base

 

GitHub - kubernetes-sigs/aws-efs-csi-driver: CSI Driver for Amazon EFS https://aws.amazon.com/efs/

CSI Driver for Amazon EFS https://aws.amazon.com/efs/ - GitHub - kubernetes-sigs/aws-efs-csi-driver: CSI Driver for Amazon EFS https://aws.amazon.com/efs/

github.com

 

참고 문서 : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/efs-csi.html

 

Amazon EFS CSI 드라이버 - Amazon EKS

spec.capacity는 Amazon EFS가 Elastic 파일 시스템이므로 Amazon EFS CSI 드라이버에서는 작동하지 않습니다. 영구 볼륨 및 영구 볼륨 클레임의 실제 스토리지 용량 값은 파일 시스템을 생성할 때는 사용되

docs.aws.amazon.com

 

'AWS' 카테고리의 다른 글

EKS Config Update  (0) 2023.07.08
Multi Region Endpoint Sharing  (0) 2023.06.15
AWS Multi Region Network 구성  (0) 2023.06.07
ECR Multi Region Replication  (0) 2023.06.04
EKS 최초 생성 권한 문제  (0) 2023.04.16

개요 : AWS Network 구성시 동일 리전에서만 사용 한다면 특별히 고려할 사항없이 구성 할 수 있다.

VPC 가 여러개인 경우 TGW 연결을 진행 할 수 있고, VPC 가 2개인경우 1:1로 VPC Peering 구성을 진행 할 수도 있다.

 

TGW 연결을 진행 할때 RAM 을 통해 TGW를 공유하여 TGW ATTECHMENT 를 사용하여 연결 이 가능하다.

단, Multi Region 을 구성 하고자 할때는 RAM 사용이 불가능하다. 사유로는 RAM 은 리전에 종속 되기 때문에 동일한 리전에서만 공유가 가능하다. 이때 고려해야할 부분이 TGW Peering 연결이다.

 

TGW Peering 방식은 TGW ATTECHMENT 를 Peering 방식으로 한개 생성 후 계정 두개와 공유를 진행 하고 VPC TGW ATTECHMENT 를 생성하여 라우팅을 잡아 주면 된다.

 

https://docs.aws.amazon.com/ko_kr/vpc/latest/tgw/tgw-peering.html

'AWS' 카테고리의 다른 글

Multi Region Endpoint Sharing  (0) 2023.06.15
AWS EKS efs-csi-driver install  (0) 2023.06.07
ECR Multi Region Replication  (0) 2023.06.04
EKS 최초 생성 권한 문제  (0) 2023.04.16
AWS LB Annotations  (0) 2023.01.23

개요 : ECR 멀리리전 이미지 복제를 위해서는 Private Registry 의 Permissions 설정과, Replication 설정이 필요 함

 

고려사항 : 복제 정책을 설정 한다고 해도, 기존에 있는 이미지는 복제가 되지 않는다. 새로 Push 되는 이미지에 대해서만 복제가 발생함

 

적용 시나리오 : A 계정의 서울리전 ECR 에서 A 계정의 도쿄리전의 ECR 로 이미지 복제 

1. 서울 리전 Permisstions 에서 명령문 생성을 클릭

  • 명령문 ID 는 아무 문자를 넣어도 상관 없음
  • 계정의 경우 현재 시나리오 에서는 동일 계정의 다른 리전을 대상으로 하므로, 테스트할 계정의 Account number 기재

2. Replication 생성 -> 규칙추가 -> 대상리전 선택 까지하고나면 아래와 같은화면이 나옴

  • 여기서 필터를 추가하지 않고 저장하게 되면, push 가 일어나는 모든 레포지 토리의 이미지가복제됨
  • 필터를 추가하게 되면 필터에 걸린 이미지만 복제가 생성됨

 

3. 받는쪽 리전의 Permissions 설정을 1번과 같이 설정하면 끝

 

'AWS' 카테고리의 다른 글

AWS EKS efs-csi-driver install  (0) 2023.06.07
AWS Multi Region Network 구성  (0) 2023.06.07
EKS 최초 생성 권한 문제  (0) 2023.04.16
AWS LB Annotations  (0) 2023.01.23
EventBridge 를 사용한 알람 발송  (0) 2023.01.20

Grafana를 사용 중 Grafana에 설정이 점점 많아져서 DB를 RDS로 옮겨야 할 필요성을 느꼈다.


Grafana는 grafana.ini 에 [database] 설정을 하지 않았을 경우 기본 DB 인 sqlite3을 사용하게 된다

데이터가 적을 때는 상관 없지만 많은 데이터소스, 대시보드, 알람등이 설정되다 보니 쿼리 속도가 늦어지고 pod restart 가 자주 발생 하게 되었다. pod의 cpu/ memory를 확인해 봤지만 설정해 놓은 limit까지 사용되지 않았고, DB 문제인 것으로 보여 AWS RDS mysql로 이관하기로 결졍 하였다.


준비사항 : sqlite3, mysql, RDS mysql - grafana database


개념 설명 : Grafana 에 Database를 설정하지 않으면 위에서 설명한 것과 같이 sqlite3을 사용하게 되고, /var/lib/grafana/grafana.db 안에 내용이 저장 되게 된다

  • Grafana 생성시 k8s pvc를 생성했으면 pvc 볼륨 안에 데이터가 저장된다(path는 동일)

grafana db

 


Migration Flow

  1. k8s grafana pod 안의 grafana.db 를 작업하기 편한 곳으로 이동
  2. mysql / sqlite3 명령어 설치
  3. git clone or shell script 복사
  4. grafana.db 덤프 생성
  5. RDS mysql 에 grafana DB 사용을 위한 초기 설정
  6. grafana pod 의 database를 RDS mysql과 연결
  7. 생성한 grafana 덤프를 RDS mysql 에 inport
  8. 결과 확인

상세 작업 설명

 

1. grafana.db 를 작업하기 편한 곳으로 이동

  • 필자의 경우 k8s 로 grafana를 사용 중이므로 k8s contrill vm에서 작업하였음
  • grafana pod의 db를 kubectl cp 명령어를 사용하여 VM으로 이동

2. mysql / sqlite3 설치

  • grafana.db 에서 덤프 생성을 위해서는 sqlite3 필요
  • RDS mysql에 import 하기 위해서는 mysql 명령어 필요
sudo apt-get install mysql-client
sudo apt-get install sqlite3

 

3. git clone or shell script 

  • grafana 덤프 생성을 위한 스크립트로 git에서 다운 / copy 가능
  • url : https://github.com/grafana/database-migrator
  • git clone을 해도 되고, 해당 git 안에 있는 sqlitedump.sh / escape.awk 만 복사해도 사용 가능
  • 생성 후 chmod 755로 실행 권한 부여
 

GitHub - grafana/database-migrator: Code to export grafana.db (sqlite) to MySQL-compatible SQL file, to assist in migration of G

Code to export grafana.db (sqlite) to MySQL-compatible SQL file, to assist in migration of Grafana data to MySQL-compatible DB. - GitHub - grafana/database-migrator: Code to export grafana.db (sqli...

github.com

4. grafana.db 덤프 생성

./sqlitedump.sh ./grafana.db > ./grafana.sql

★이 과정에서 에러가 발생하는 경우가 있는데 grafana.sql 이름을 변경해서 db_dumb.sql 등 다른 이름으로 시도 추천
무슨 차이인지는 모르겠으나 grafana.sql 로했을때 error 가 종종 발생함

5. RDS mysql에 grafana DB 사용을 위한 초기 설정

  • grafana 이름으로 database 생성
  • grafana database를 사용할 grafana 계정 생성
  • grafana 계정에 권한 부여

 

DB 접속 방법

mysql -u {username} -P {port} -h {endpoint/host 주소} -p

ex)
mysql -u abdc -P 3306 -h database001.ap-northeast-2.rds.amazonaws.com -p

 

접속 후 DB 설정

CREATE DATABASE grafana ;
CREATE USER 'grafana'@'%' IDENTIFIED BY 'grafana';
GRANT ALL PRIVILEGES ON grafana.* TO 'grafana'@'%';
FLUSH PRIVILEGES;

 

6. grafana pod의 database를 RDS mysql과 연결

  • grafana에서 RDS mysql - grafana database를 사용하기 위한 기본 틀을 잡는 과정
  • k8s comfigmap에서 grafana를 수정하면 됨

  • config 수정은 grafana pod를 삭제해야 적용되므로, grafana pod 삭제 후 log 확인
  • pod 가 정상적으로 running 되는지 확인 후 k logs {podname}으로 HTTP Listen까지 정상적으로 나왔는지 확인

 

7. 생성한 grafana 덤프를 RDS mysql에 import

  • mysql 명령어를 이용하여 생성해 놓았던 grafana.sql을 import 하면 됨

★ import 시 에러가 발생한다면 해당 에러메시지를 보고 구문을 수정하면 됨

★ grafana.sql 에서 몇 번째 줄에 syntax error인데 다른 줄과 비교해서 이상한 부분을 제거하고 다시 import 하면 됨

 

 

참고문서 : https://github.com/grafana/database-migrator

                 https://iceburn.medium.com/grafana-database-migration-from-sqlite3-to-mysql-301b6a01e249

 

Grafana — Database migration from Sqlite3 to MySQL

Shouldn’t it be Sqlite3?

iceburn.medium.com

 

GitHub - grafana/database-migrator: Code to export grafana.db (sqlite) to MySQL-compatible SQL file, to assist in migration of G

Code to export grafana.db (sqlite) to MySQL-compatible SQL file, to assist in migration of Grafana data to MySQL-compatible DB. - GitHub - grafana/database-migrator: Code to export grafana.db (sqli...

github.com

 

+ Recent posts