1) Replica Set의 DESIRED 카운트가 1인 경우, Pod가 삭제되면 어떻게 되는가?

  •   : Replica Set 컨트롤러에서 DESIRED 카운트가 1이기 때문에 pod가 삭제 되어도 다시 생성을 한다.

2) 컨트롤러가 없는 pod는 바로 지워진다.

 

3) 상위에 컨트롤러가 있는 pod의 경우 삭제가 안되므로, 상위객체를 삭제해 버린다.

4) 하위 리소스 자동제거 하지 않기 (--cascade 사용)

  • 상위 deployments 컨트롤러만 삭제되고 하위 pod는 남아 있는 것을 확인
  • 여기까지는 객체 단위로 삭제하는 방법

5) 배포 단위로 삭제하는 방법

1)kubectl delete -f sample demo.yaml
  : 등록한 yaml 파일 기반 삭제
2)kubectl delete ns test-ns
  : 네임스페이스 기반 삭제
3)Kubectl delete po | deploy | rs --all
  : 디폴트 네임스페이스의 po | deploy | rs 모두 삭제
4)helm remove release-name
  : k8s 어플리케이션을 helm을 이용하여 설치 가능
  : 리소스 그룹을 release 라고 부른다.

 

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Static Pod  (0) 2020.12.01
Namespace  (0) 2020.12.01
pod 에 내부 명령 실행과 connect  (0) 2020.12.01
pod 확장 (scale out)  (0) 2020.12.01
Service  (0) 2020.12.01

1) pod 안의 환경변수 확인 명령어

root@ip-172-31-4-27:~# kubectl exec -it hwk-66fdbfb65d-gdwcj -- env 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
HOSTNAME=hwk-66fdbfb65d-gdwcj 
TERM=xterm 
WEB_HWK_SERVICE_HOST=10.107.229.55 
WEB_HWK_SERVICE_PORT=80 
WEB_HWK_PORT=tcp://10.107.229.55:80 

 

2) pod에 바로 연결 명령어 -it

root@ip-172-31-4-27:~# kubectl exec -it hwk-66fdbfb65d-gdwcj -it -- /bin/bash 
root@hwk-66fdbfb65d-gdwcj:/# cd /usr/share/nginx/html/ 
root@hwk-66fdbfb65d-gdwcj:/usr/share/nginx/html# ls 

 

 

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Namespace  (0) 2020.12.01
pod 삭제  (0) 2020.12.01
pod 확장 (scale out)  (0) 2020.12.01
Service  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01

- stateless 한 서비스 : 실제 pod가 배포된 시스템에 정보를 저장해서 사용하지 않는 웹 (예:web)

 

kubectl scale --replicas=3 rs/foo

  • rs의 name이 foo를 3개로 증가

kubectl scale --replicas=3 -f foo.yaml

  • foo.yaml 명세서를 이용하여 3개를 생성

kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

  • 현재 2개이면 3개로 증가

--replicas=0 를 하면 3개 모두 종료된다.
- 서비스를 일시적으로 종료하고 싶을때 사용한다

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

pod 삭제  (0) 2020.12.01
pod 에 내부 명령 실행과 connect  (0) 2020.12.01
Service  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
Deployment  (0) 2020.12.01
  • 외부에서 내부 Pod로의 연결 가능 (targetPort)
  • Pod의 Label과 Service의 Selector 맵핑으로 연결
  • 내부 DNS 에 자동 등록

  • Pod는 2.x.x.x 대역
  • Service는 1.x.x.x.x 의 고정아이피
  • Client -> Service -> [Load Balancer(L4 스위치 기능수행)] -> pod
  • 하위 객체에 Lable을 달아서 상위객체(service)에서 Selector로 연결
  • DNS 또한 Pod 형태로 띄워져 있음
  • Service 객체를 만들면 DNS쪽에 객체가 생성

service의 yaml 명세서 확인

apiVersion: v1 
kind: Service 
metadata: 
name: test-svc 
spec: 
ports: 
-port: 80 (서비스 포트 80) 
targetPort: 8080 (pod 안에 expose가 8080 포트 : Service 객체는 80으로 요청오면 8080으로 전달해 줌) 
selector: 
run:test

Endpoint Controller

  • 서비스 객체를 만들면 LB 기능을 한다.
  • 그러려면 pod 안에 컨테이너 포트/타겟 포트의 조합을 알아야 한다.
  • 즉 엔드포인트 라는 하위 리소스가 자동으로 만들어 짐

Service Types

- 4가지의 서비스타입이 존재
1.ClusterIP

  • 사설IP 내부통신만 가능
  • 하나의 노드에 부하될 수 있는 문제점이 있음 

2.NodePort

  • ClusterIP + HostPort  서비스 객체를 생성하면 내부적인 iptables 룰셋, DNS 룰셋 등등 [내부 - 외부]간 통신 가능하도록 설정. 누가? Kube-proxy가 한다.
  • 외부에서 내부 pod를 접근하려면 HostPort가 필요
  • 1,2는 온프레미스 환경에서 k8s 구축시 사용
  • 서비스의 iptables를 바탕으로 End Point 를 갖고 노드에 분산시킴
  • 인바운드 리퀘스트를 분산시킴 

3.LoadBalancer

  • NodePort + LB 연동 추가
  • 클라우드 환경에서 k8s 구축시 사용 

4.ExternalName

  • CNAME 레코드
  • 1, 2, 3은 외부 -> 내부pod 접근하기 위한 방법
  • 4은 내부pod -> 외부 서비스를 접근하기 위한 방법

서비스 객체 생성하기

- kubectl expose deployment nginx --port=80 --target-port=8000 : deployment 의 service 객체 생성 

1) --port=80 : 서비스 객체 포트 명시
2) --target-port=8000 : pod안의 Container 포트 명시

 

- 1번째로 ClustIP 타입의 svc 생성 후 확인

root@ip-172-31-4-27:~# kubectl get svc 
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE 
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5h2m 
root@ip-172-31-4-27:~# kubectl get ep 
NAME         ENDPOINTS          AGE 
kubernetes   172.31.4.27:6443   5h3m 

1) pod IP : 172.31.4.27
2) api-server port :  6443

 

- 2번째로 NodePort 타입으로 Service 실행

root@ip-172-31-4-27:~# kubectl expose deployment hwk --port 80 --name web-hwk --type NodePort 
service/web-hwk exposed 
root@ip-172-31-4-27:~# kubectl get svc 
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE 
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        5h16m 
web-hwk      NodePort    10.107.229.55   <none>        80:32472/TCP   4s 해당 IP:PORT로 로 접근한다는 것은 SVC로 접근 한다는 뜻 
root@ip-172-31-4-27:~# kubectl get ep 
NAME         ENDPOINTS          AGE 
kubernetes   172.31.4.27:6443   5h16m 
web-hwk      192.168.82.6:80    13s 해당 IP:PORT로 접근하는것은 pod로 직접 접근한다는 뜻 
root@ip-172-31-4-27:~# kubectl get po hwk-66fdbfb65d-smrz5 -o wide 
NAME                   READY   STATUS    RESTARTS   AGE    IP             NODE               NOMINATED NODE   READINESS GATES 
hwk-66fdbfb65d-smrz5   1/1     Running   0          103m   192.168.82.6   ip-172-31-13-180   <none>           <none> 

- 실제 AWS EC2 public IP : 32472 로 접근이 가능하다.
- 순서 : 
1) 10.107.229.55:32472 요청
2) SVC는 -> 192.168.82.6:80 의 pod로 접근

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

pod 에 내부 명령 실행과 connect  (0) 2020.12.01
pod 확장 (scale out)  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
Deployment  (0) 2020.12.01
ReplicaSet  (0) 2020.12.01

실행은 안되고 -> yaml 명세서만 얻기위해서 --dry-run을 사용

디플로이먼트 특징 -> 리플리카셋 생성 -> 파드생성 -> 컨테이너 생성 (nginx 도커 이미지를 활용하여 nginx 실행)

 

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

pod 확장 (scale out)  (0) 2020.12.01
Service  (0) 2020.12.01
Deployment  (0) 2020.12.01
ReplicaSet  (0) 2020.12.01
Kubectl를 이용한 기본 제어  (0) 2020.12.01

deployment create

  • deployment 는 rs를 사용하여 pod를 생성
  • pod 안에 컨테이너를 갖고 있음
  • DESIRED : 1 -> 1개를 띄워야 한다
  • CURRENT : 1 -> 현재 1개 띄워져 있다

각 컨트롤러 간 상하위 구조

deployment (최상위 컨트롤러)
  ㄴreplicaSet (하위 컨트롤러)
    ㄴpod
       ㄴcontatiner

- 상위 컨트롤러 -> 하위컨트롤러는 matchLabels를 갖고 연결
- template :

  • 복제하기 위한 정보
  • RS에서는 DESIRED에 맞게 복제를 수행
  • 이때 template 정보를 갖고 수행
  • 그안에 containers 정보도 있음

pod의 lable 값을 확인 명령어

root@ip-172-31-4-27:~# kubectl get po nginx-6799fc88d8-v9m2z --show-labels  
NAME                     READY   STATUS    RESTARTS   AGE     LABELS 
nginx-6799fc88d8-v9m2z   1/1     Running   0          7m46s   app=nginx,pod-template-hash=6799fc88d8 

-o wide 옵션 주면 selector 정보 확인

root@ip-172-31-4-27:~# kubectl get rs nginx-6799fc88d8 -o wide 
NAME               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR 
nginx-6799fc88d8   1         1         1       8m25s   nginx        nginx    app=nginx,pod-template-hash=6799fc88d8 
  • RS에서 pod를 컨텍하기 위해서 SELECTOR -> LABELS가 매치되어 있는것을 확인 할 수 있다.
  • 두 값이 일치하는것은 매우 중요한 내용이다.

상위객체와 하위객체간에 LABLES와 SELECTOR를 통해 연결되어 있는 것을 확인

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Service  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
ReplicaSet  (0) 2020.12.01
Kubectl를 이용한 기본 제어  (0) 2020.12.01
k8s 구성요소와 Deployment Controller  (0) 2020.12.01
  • Pod 유지 관리하는 컨트롤러
  • 정해진 수만큼 Pod 실행되도록 제어
  • Node 장애시 다른 Node에서 Pod를 다시 실행
  • matchExpression 기반 라벨 셀렉터를 사용할 수 있음

rs 조회
rs describe 조회
deployments, replica set, pod 조회

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Service  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
Deployment  (0) 2020.12.01
Kubectl를 이용한 기본 제어  (0) 2020.12.01
k8s 구성요소와 Deployment Controller  (0) 2020.12.01

k8s 디버깅 3단계

  • kubectl get po
  • kubectl describe po {pod name}
  • kubectl get events

Yaml 명세서 기본

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - image: nginx
    name: hwk
  nodeSelector:
    disktype: ssd

주의사항 :

  • : 다음에는 무조건 공백 문자
  • 들여쓰기가 매우 중요하며 tab 을 사용해서는 안됨

create pod 수행 결과 

kubectl get event

root@master1:~# kubectl get event
LAST SEEN   TYPE     REASON      OBJECT      MESSAGE
2m30s       Normal   Scheduled   pod/mypod   Successfully assigned default/mypod to ip-172-31-4-27
2m30s       Normal   Pulling     pod/mypod   Pulling image "nginx"
2m26s       Normal   Pulled      pod/mypod   Successfully pulled image "nginx" in 3.59835338s
2m26s       Normal   Created     pod/mypod   Created container hwk
2m26s       Normal   Started     pod/mypod   Started container hwk

kubectl describe pod {pod name}

root@master1:~# kubectl describe pod mypod 
Name:         mypod
Namespace:    default
Priority:     0
Node:         ip-172-31-4-27/172.31.4.27
Start Time:   Tue, 01 Dec 2020 12:48:27 +0000
Labels:       <none>
Status:       Running
IP:           192.168.51.203
IPs:
  IP:  192.168.51.203
Containers:

bash 자동 완성기능 설정

root@ip-172-31-4-27:~# source <(kubectl completion bash)
                              # kubectl api-탭치면 자동완성이 되는것을 확인 할 수 있다

bashrc와 bash_profile에 적용하면 재 접속 후에도 사용할 수 있다
root@ip-172-31-4-27:~# echo "source <(kubectl completion bash)" >> ~/.bashrc
root@ip-172-31-4-27:~# echo "source <(kubectl completion bash)" >> ~/.bash_profile
root@ip-172-31-4-27:~# echo "source <(kubectl completion bash)" >> ~ubuntu/.bash_profile
root@ip-172-31-4-27:~# echo "source <(kubectl completion bash)" >> ~ubuntu/.bashrc
root@ip-172-31-4-27:~# echo "source <(kubeadm completion bash)" >> ~/.bash_profile
root@ip-172-31-4-27:~# echo "source <(kubeadm completion bash)" >> ~/.bashrc

 

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Service  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
Deployment  (0) 2020.12.01
ReplicaSet  (0) 2020.12.01
k8s 구성요소와 Deployment Controller  (0) 2020.12.01

Master node(k8s 4인방) 와 Worker node

Cluster 구성요소 (참조 : kubernetes in action)
k8s 설치 이후 구성요소 확인

 

Deployment Controller 기반

Deployment 기반 배포란?
- 가장 범용으로 사용 
- Deployment 라는 상위 기반을 생성
- 하위 컨트롤러를 하나 더 소유 (Replica Set 컨트롤러) 
- Replica Set 은 Pod를 버전 별로 관리
- 예를 들어 Node에 문제가 발생한 경우, Pod를 재배포 하면 된다

 

 

'클라우드 컴퓨팅 & NoSQL > k8s' 카테고리의 다른 글

Service  (0) 2020.12.01
Object Template (--dry run 사용하기)  (0) 2020.12.01
Deployment  (0) 2020.12.01
ReplicaSet  (0) 2020.12.01
Kubectl를 이용한 기본 제어  (0) 2020.12.01
절차
1. EC2 생성
2. IAM Role 생성
3. EC2에 IAM Role 연결
4. Cloudwatch-agent 설치
5. Cloudwatch-agent config.json 생성/설정
6. Cloudwatch-agent 시작
7. 로그그룹 생성
8. 로그스트림 생성
9. 로그 확인
10. SSM을 통한 Run command 수행

 

1. EC2 생성 후 IAM Role 연결

EC2 생성 후 IAM Role 연결/바꾸기 선택
새 IAM 역할 생성 클릭

 

IAM Role 생성시 정책 두가지 연결 (CloudWatchAgentServerPolicy, AmazonSSMFullAccess)

 

EC2에 적용한 IAM Role 확인

 

4. Cloudwatch-agent 설치
$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm

$ sudo rpm -U ./amazon-cloudwatch-agent.rpm

 

5. Cloudwatch-agent config.json 생성/설정

amazon-cloudwatch-agent-config-wizard를 실행하여 기본설정을 시작한다.

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

$ sudo vi /opt/aws/amazon-cloudwatch-agent/bin/config.json

file_path, log_group_name, log_stream_name을 셋팅해준다.

{
        "agent": {
                "metrics_collection_interval": 10,
                "run_as_user": "root",
                "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/home/ubuntu/logs/spring-boot-logging.log",
                                                "log_group_name": "spring-boot-logging",
                                                "log_stream_name": "{instance_id}"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}

 

6. Cloudwatch-agent 시작

 

Cloudwatch-agent 중지

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

 

위에서 수정한 config.json을 사용해 설정 파일 업데이트 후 시작 

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

 

에러발생 시 /usr/share/collectd/types.db 파일이 없다는 에러발생시 types.db 파일생성

$ mkdir /usr/share/collectd
$ cd /usr/share/collectd
$ touch types.db

 

/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log 로그 확인하여 정상기동되었음을 확인

2020/03/18 13:30:23 I! I! Detected the instance is EC2
2020/03/18 13:30:23 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json ...
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it.
2020/03/18 13:30:23 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json ...
Valid Json input schema.
I! Detecting runasuser...
No csm configuration found.
Configuration validation first phase succeeded
 
2020/03/18 13:30:23 I! Config has been translated into TOML /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml 
2020/03/18 13:30:23 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json ...
2020/03/18 13:30:23 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json ...
2020/03/18 13:30:23 I! Detected runAsUser: root
2020/03/18 13:30:23 I! Change ownership to root:root
2020-03-18T13:30:23Z I! cloudwatch: get unique roll up list []
2020-03-18T13:30:23Z I! Starting AmazonCloudWatchAgent (version 1.237768.0)
2020-03-18T13:30:23Z I! Loaded outputs: cloudwatch cloudwatchlogs
2020-03-18T13:30:23Z I! Loaded inputs: disk mem socket_listener statsd tail
2020-03-18T13:30:23Z I! Tags enabled: host=ip-172-31-41-190
2020-03-18T13:30:23Z I! Agent Config: Interval:10s, Quiet:false, Hostname:"ip-172-31-41-190", Flush Interval:1s 
2020-03-18T13:30:23Z I! Started the statsd service on :8125
2020-03-18T13:30:23Z I! cloudwatch: publish with ForceFlushInterval: 1m0s, Publish Jitter: 37s
2020-03-18T13:30:23Z I! Statsd listener listening on:  [::]:8125
2020-03-18T13:30:24Z I! Reading from offset 9083 in /home/ubuntu/logs/spring-boot-logging.log

 

7. 로그그룹 생성

config.json 설정한 로그 그룹 생성

 

8. 로그스트림 생성

config.json 설정한 로그 스트림 생성

 

9. 로그 확인

Cloudwatch-logs에서 출력되는 로그를 확인

 

ssm-user로 로그인하여 cloudwatch logs 관련 설정정보확인.txt
0.01MB

10. SSM을 통한 Run command 수행

 

Optional Configuraion Location 지정을 위해 파라미터 확인

 

명령 문서 : AmazonCloudWatch-ManageAgent, Optional Configuraion Location 지정 : parameter store에 저장되어 있는 값

 

Run Command 성공 확인

 

Client(sftp) -> Tunneling -> Jumphost_Server -> Main_Server
                  (Port:12022)       (Port:2022)          (Port:2022)

1.Tunneling 구성

1) Jumphost_Server의 Public Key, Public IP 확인 후 설정

Jumphost Server의 Public IP 확인

2)확인된 IP와 Port 설정

jumphost의 public ip 설정

3)포트:12022로 수신대기 설정 (이후 대상으로 전송)

Tunneling 설정 (대상은 Main_Server)

4)연결 이후 Listening 확인

Tunneling이 정상인지 확인

2.Client(sftp) 설정

프로토콜, 호스트, 로그온 유형 설정

1.PID 확인

$ jps 
29435 data-collector.jar

 

2.Heapdump 생성 (프로세스가 생성 -> PID확인 -> 명령어 입력)

jcmd 29435 GC.heap_dump /home/hwkang/heapdump_202003041021.hprof

 

링크 : https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

 


3.Eclipse Memory Analyzer(MAT)로 확인

1) Heampdump 파일 열기

Open Heap Dump

2) Overview

Open 성공 후 Overvicw 확인. 문제로 의심되는 1건 확인

Overview

3) dominator_tree

dominator_tree에서 Class Name 검색 가능

CacheManager로 검색

 

4)MAT - Dominator Tree를 이용해 릭 찾기

with outgoing references

참고링크 : https://m.blog.naver.com/PostView.nhn?blogId=2feelus&logNo=220782142633&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

5)cache에 저장된 값도 확인 가능

참고링크 : https://m.blog.naver.com/PostView.nhn?blogId=2feelus&logNo=220782142633&proxyReferer=https%3A%2F%2Fwww.google.com%2F

'성능과 튜닝 > JVM' 카테고리의 다른 글

JVM DNS cache TTL code 적용  (0) 2020.01.30

ELB 에 접근한 Public IP 주소는 해당 어플리케이션에서 x-forwarded-for 값을 이용하여 조회가 가능.

코드 예제 :

getHeader 확인

AWS 에서도 제공하는 가이드 문서 링크 :

https://aws.amazon.com/ko/premiumsupport/knowledge-center/elb-capture-client-ip-addresses/

 

ELB 액세스 로그에서 클라이언트 IP 주소 캡처

웹 서버에 대해 Elastic Load Balancing을 사용하고 있으며 액세스 로그에서 로드 밸런서의 IP 주소를 볼 수 있습니다. 대신 클라이언트 IP 주소를 캡처하려면 어떻게 해야 합니까? 로드 밸런서가 인스턴스에 대한 연결을 설정하므로 액세스 로그가 로드 밸런서의 IP 주소를 캡처합니다. 액세스 로그에서 클라이언트의 IP 주소를 캡처하려면 추가적으로 구성해야 합니다. HTTP/HTTPS 리스너가 있는 Application Load Balancer

aws.amazon.com

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html

 

POC 이유 : 기존 Zookeeper에서 AWS redis로 전환 예정.

               로컬에서 Jedis를 이용해 AWS redis를 테스트 할 수 있도록 환경 구성

 

Tunneling 설정 이유 : 로컬에서 직접 AWS redis 서버에 접근 불가하여 아래와 같이 구성

                             1.Client 로컬 서버 -> 2.터널링 -> 3.EC2 -> 4.AWS Redis 

https://forums.aws.amazon.com/thread.jspa?threadID=130704

 

1.EC2 생성 후 보안그룹 적용

EC2 터널링을 위한 보안그룹

 

2.EC2 -> AWS Redis로 접근 가능 하도록 보안그룹 생성 (EC2의 보안그룹과 맵핑)

6379는 Redis의 포트이고 소스 적용시 EC2의 보안그룹과 맵핑

3.AWS Redis 생성

Redis 생성 후 보안 그룹적용

 

4.XShell에 터널링 설정시 redis의 기본 엔드포인트 사설 주소를 입력

nslookup을 통해 redis의 기본 엔드포인트 사설 주소를 획득한다.

 

XShell 터널링 설정

 

5.로컬에서 jedis 테스트 완료

데모로 환경 구현 후 테스트

1. 모듈의 .gitlab-ci.yml 설정

gitlab-ci.yaml 설정

2. Maven pom.xml 설정

pom.xml에 build.version 설정

3. Gitlab Pipeline 실행 시 결과 확인

• stage MR 이후 pipeline 자동 실행

Job 실행 시작

• 빌드 버전 생성 확인

빌드버전 확인

• Maven 빌드 결과물 확인

jar를 통한 버전 확인

Dynamo DB Retry 횟수 설정

- AS-IS : default 10회
- TO-BE : 8회 설정 예정 (사유 : default 설정인 경우 최대 51~60초에 delay 발생으로 response time이 길어지는 악순환이 되기 때문에 재시도 횟수를 줄여서 빠른 response 처리로 서버 부하 감소하기 위함)

[Dynamo DB Retry 정책 참고]

 • DynamoDB 읽기/쓰기 재시도 정책

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff 

• 요약 : 요청은 최대 1분이니 1분내에서 retry를 해라

 예를 들어 첫 번째 재시도 전에는 최대 50밀리초, 두 번째 재시도 전에는 최대 100밀리초, 그리고 세 번째 전에는 최대 200밀리초를 기다리는 방식입니다.
 하지만 1분 후에도 요청이 실패하면 요청량이 아니라 할당 처리량을 초과하는 요청 크기가 원인일 수도 있습니다.
 따라서 약 1분 정도에서 멈추도록 최대 재시도 횟수를 설정하십시오.

[총 재시도 횟수 별 시간 참고]

[설정 방법]

/**
 * 처음 설정할 때 대기 시간 (밀리 초)
 * */
private static final int CONNECTION_TIMEOUT = 60 * 1000;

/**
 * 클라이언트가 실행을 완료 할 수있는 시간 (밀리 초)
 * */
private static final int CLIENT_EXECUTION_TIMEOUT = 60 * 1000;

/**
 * 요청이 완료되기까지 대기하는 시간 (밀리 초)
 * */
private static final int REQUEST_TIMEOUT = 60 * 1000;

/**
 * 데이터가 전송 될 때까지 기다리는 시간 (밀리 초)
 * */
private static final int SOCKET_TIMEOUT = 60 * 1000;

/**
 * 요청 실패시 재시도 카운트
 * */
private static final int RETRY_COUNT = 8;

private AWSCredentialsProvider awsCredentialsProvider() {
   final BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
   final AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
   return credentialsProvider;
}

private ClientConfiguration createDynamoDBClientConfiguration() {
ClientConfiguration clientConfiguration = new ClientConfiguration()
   .withConnectionTimeout(CONNECTION_TIMEOUT)
   .withClientExecutionTimeout(CLIENT_EXECUTION_TIMEOUT)
   .withRequestTimeout(REQUEST_TIMEOUT)
   .withSocketTimeout(SOCKET_TIMEOUT)
   .withRetryPolicy(PredefinedRetryPolicies.getDynamoDBDefaultRetryPolicyWithCustomMaxRetries(RETRY_COUNT));

return clientConfiguration;
}

@Bean
public DynamoDBMapper dynamoDBMapper() {
Regions region = Regions.fromName(regionName);
AmazonDynamoDBClientBuilder builder = AmazonDynamoDBClientBuilder.standard()
   .withCredentials(awsCredentialsProvider())
   .withClientConfiguration(createDynamoDBClientConfiguration())
   .withRegion(region);
if (!StringUtils.isEmpty(serviceEndpoint)) {
   System.out.println(String.format("serviceEndpoint: '%s'", serviceEndpoint));
   EndpointConfiguration configuration = new EndpointConfiguration(serviceEndpoint, regionName);
   builder.withEndpointConfiguration(configuration);
}
AmazonDynamoDB dynamoDB = builder.build();

DynamoDBMapper mapper = new DynamoDBMapper(dynamoDB);
   return mapper;
}

AWS EU Region -> CN Region RestAPI 호출시.. 간헐적으로 Request가 증가하면 java.net.UnknownHostException 발생

 

CN "Name or service not known" Error 관련 JVM Cache TTL 코드

결론 : Security.setProperty("networkaddress.cache.ttl", "30") 적용

 

참고 :

https://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html#nct

'성능과 튜닝 > JVM' 카테고리의 다른 글

Heapdump를 이용한 디버그  (0) 2020.03.04

+ Recent posts