Freesunny

EC2 - curl 명령으로 public IP 확인하는 방법

AWS

curl 명령으로 할당된 public ip를 확인할 수 있다.

# public ip 출력
curl http://169.254.169.254/latest/meta-data/public-ipv4

[awscli] s3 버킷 라이브사이클 설정

AWS

# 설정 확인

# aws s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME
{
    "Rules": [
        {
            "ID""Convert IA",
            "Filter": {
                "Prefix"""
            },
            "Status""Enabled",
            "Transitions": [
                {
                    "Days"30,
                    "StorageClass""STANDARD_IA"
                }
            ],
            "AbortIncompleteMultipartUpload": {
                "DaysAfterInitiation"7
            }
        }
    ]
}
 

 

# 설정 삭제

# aws s3api  delete-bucket-lifecycle --bucket BUCKET_NAME

 

# 설정 추가

# aws s3api put-bucket-lifecycle-configuration --bucket BUCKET_NAME --lifecycle-configuration file://LIFECYCLE_POLICY.JSON

 

kubernetes 노드 변경

Kubernetes

한대의 노드가 정상적이지 않은 것 같아서 새로운 노드를 추가하고 문제있는 노드를 제거 하였다.

 

AWS를 사용하고 있고, 오토스케일링 그룹에 속해있는 노드라서, 

오토스케일링 그룹에 신규 인스턴스가 추가 되도록 Desired Capacity 를 추가한다.

 

<추가된 인스턴스 상태 >

$ kubectl get nodes
ip-172-31-16-133.ap-northeast-2.compute.internal   Ready    <none>   16m   v1.12.7
ip-172-31-24-205.ap-northeast-2.compute.internal   Ready    <none>   82d   v1.12.7
ip-172-31-33-98.ap-northeast-2.compute.internal    Ready    <none>   27s   v1.12.7
ip-172-31-42-90.ap-northeast-2.compute.internal    Ready    <none>   82d   v1.12.7
ip-172-31-47-233.ap-northeast-2.compute.internal   Ready    <none>   16m   v1.12.7

 

 

문제 있는 노드(ip-172-31-42-90.ap-northeast-2.compute.internal)가 스케쥴링 되지 않도록 설정

$ kubectl cordon ip-172-31-42-90.ap-northeast-2.compute.internal
node/ip-172-31-42-90.ap-northeast-2.compute.internal cordoned

$ kubcectl get nodes                                           
NAME                                               STATUS                     ROLES    AGE     VERSION
ip-172-31-16-133.ap-northeast-2.compute.internal   Ready                      <none>   24m     v1.12.7
ip-172-31-24-205.ap-northeast-2.compute.internal   Ready                      <none>   82d     v1.12.7
ip-172-31-33-98.ap-northeast-2.compute.internal    Ready                      <none>   8m24s   v1.12.7
ip-172-31-42-90.ap-northeast-2.compute.internal    Ready,SchedulingDisabled   <none>   82d     v1.12.7
ip-172-31-47-233.ap-northeast-2.compute.internal   Ready                      <none>   24m     v1.12.7

 

 

문제 있는 노드 제거

$ kubectl drain ip-172-31-42-90.ap-northeast-2.compute.internal --ignore-daemonsets --delete-local-data
node/ip-172-31-42-90.ap-northeast-2.compute.internal already cordoned
WARNING: Ignoring DaemonSet-managed pods: aws-node-bjrrv, kube-proxy-stgz4, prometheus-node-exporter-lt9ls; 
Deleting pods with local storage: metrics-server-7fbd9b8589-qjkvg, monitoring-influxdb-5c5bf4949d-fshbn

 

오토스케링링 그룹에서 문제 있는 노드(인스턴스)를 제거 (인스턴스가 제거 되고, 새로운 인스턴스가 추가됨)

 

인스턴스 삭제

 

오토 스케일링 Desired Capacity 원래대로 축소

쿠버네티스 대시보드 편하게 접속하기(#1)

Kubernetes

EKS로 쿠버네티스 클러스터를 셋팅하였는데, kubeproxy 를 로컬에 띄어서 로컬로 접속하는 방식인데, 
서버를 통해서 접속하는 방식으로 바꿨다. 

<변경 사유>

  • 매번 명령을 실행시키기 번거롭다.
  • 여러 개의 클러스터를 관리해야 한다. (aws 계정도 여러 개 사용)
  • HTTPS를 사용하고 싶다.
  • 사내에 사용가능한 리눅스가 있다.
  • 사용빈도가 매우 높지 않다.
  • 비용을 쓰고 싶지 않다. (ELB로 접속하는 방식이 있으나...)

대시보드에 ELB를 붙여서 접속하는 방법도 있으나, 비용적인 부분과 사용빈도가 크지 않기 때문에,
사내에 있는 linux 를 x통해서, 접속하는 방식으로 변경해 보았다.

 

접속도

 

 

여러 개의 계정과 여러 개의 클러스터를 관리해야 하기 때문에, docker container 를 통해서 구축 하였다.

파일 : build/Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl ca-certificates python python-pip vim
RUN pip install awscli

RUN apt-get update && apt-get install -y apt-transport-https
RUN curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list
RUN apt-get update
RUN apt-get install -y kubectl

ARG SECRET_ID
ARG SECRET_KEY
ARG REGION
ARG CLUSTER

RUN mkdir -p /root/.aws
RUN echo "[default]" > /root/.aws/credentials
RUN echo "aws_access_key_id=$SECRET_ID" >> /root/.aws/credentials
RUN echo "aws_secret_access_key=$SECRET_KEY" >> /root/.aws/credentials
RUN echo "region=$REGION" >> /root/.aws/credentials
RUN aws eks update-kubeconfig --region $REGION --name $CLUSTER

패키지 업데이트, awscli, kubectl 설치

(변수로 받아서)credentials 파일 생성, (변수로 받아서) kubeconfig 생성

 

파일 : docker-compose.yaml

version: '3.5'
services:
 eks-kubeproxy:
  build:
   context: ./build
   dockerfile: Dockerfile
   args:
    SECRET_ID: "XXXXXXXXXXXXXXXXXXXX"
    SECRET_KEY: "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
    REGION: "ap-northeast-2"
    CLUSTER: "eks-cluster"
  image: eks-cluster
  restart: always
  ports:
   - "8080:8080"
  command: >
   bash -c "kubectl proxy --port=8080 --address=0.0.0.0 --disable-filter=true &"

 

 

docker-compose build & 실행

# docker-compose build
# docker-compose up -d

'Kubernetes' 카테고리의 다른 글

kubernetes 노드 변경  (0) 2019.08.05
nodeAffinity 를 이용하여 pod 를 원하는 노드에 배포하기  (0) 2019.07.31
Service 재시작 하기  (0) 2019.07.25
EKS 쿠버네티스 대시보드 접속  (0) 2019.07.23
Pod 재시작 하기  (0) 2019.07.15

EKS 쿠버네티스 대시보드 접속

Kubernetes

 

kube-proxy 실행

$ kubectl proxy --port=8080 --address=0.0.0.0 --disable-filter=true &



토큰 출력 (awscli + jq)

$ aws eks get-token --cluster-name dev-opgg-seoul | jq -r '.status.token'

 


토큰 출력 (kubtctl)

$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')

 

 

접속 URL ( 토큰 입력)

http://localhost:8080/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

[Python] credentials 파일 내에 profile 사용하는 방법

AWS

~/.aws/credentials 파일에 여러 개의 profile 이 있을 경우에 profile 을 선택하는 방법이다.

import boto3

def ListEc2InstanceId(profile, region):
	session = boto3.Session(profile_name=profile)
	ec2 = session.resource('ec2', region_name=region)

	for instance in ec2.instances.all():
		print(instance.id, instance.instance_type)

if __name__ == '__main__':
	ListEc2InstanceId('dev', 'ap-northeast-2')

함수 정의 및 인자 받기

Python

함수에서 인자 받는 방법

import boto3

def PrintPublicIp(region):
        ec2 = boto3.resource('ec2', region_name=region)

        instance = ec2.Instance('i-0044abbb3c982cbaa')
        for nia in instance.network_interfaces_attribute:
                publicip = nia.get('Association')
                print(publicip.get('PublicIp'), publicip.get('IpOwnerId'))


if __name__ == '__main__':
        PrintPublicIp('ap-northeast-2')

'Python' 카테고리의 다른 글

Slack으로 메시지 보내기  (0) 2019.07.17
파일을 읽어 줄 단위로 배열에 입력  (0) 2019.07.16

[Python] 미사용 Elastic IP 확인 및 릴리즈

AWS

미사용 Elastic IP 확인 및 릴리즈를 하는 방법

import boto3

client = boto3.client('ec2', region_name='ap-southeast-1')

addresses_dict = client.describe_addresses()
for eip_dict in addresses_dict['Addresses']:
    if "NetworkInterfaceId" not in eip_dict:
        print(eip_dict['PublicIp'])
        client.release_address(AllocationId=eip_dict['AllocationId'])