https://velog.io/@mng_jn/0722
-> 이전 게시물과 동일하게 만들기.
사용자 데이터에 아래 명령어만 추가.
timedatectl set-timezone Asia/Seoul
최종 사용자 데이터 ;
#!/bin/bash
timedatectl set-timezone Asia/Seoul
cd /tmp
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site mj030kk/web-site:v2.0
✔️레코드 이름 : docker,
값 : 앞서 생성한 인스턴스의 퍼블릭 IP
✔️ 웹브라우저 통해서 도메인 접속 확인
✔️ Amazon ECR > 리포지토리 > 리포지토리생성(public)
✔️ 리포지토리 이름 : web-site - 리포지토리 생성
✔️ 이전에 사용자 생성시 만들어둔 credential 엑셀파일 이용
[ec2-user@ip-10-14-11-244 ~]$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-2
Default output format [None]: json
✔️ 로그인 확인
[ec2-user@ip-10-14-11-244 ~]$ aws s3 ls
[ec2-user@ip-10-14-11-244 ~]$
✔️1. 인증 토큰을 검색하고 레지스트리에 대해 Docker 클라이언트를 인증
[ec2-user@ip-10-14-11-244 ~]$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/
✔️ 2. 사용자 데이터에서 가져왔었던 이미지 확인
[ec2-user@ip-10-14-11-244 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mj030kk/web-site v2.0 cde791130344 11 days ago 172MB
✔️ 3. 태그
[ec2-user@ip-10-14-11-244 ~]$ docker tag mj030kk/web-site:v2.0 public.ecr.aws/-/web-site:blue
✔️ 4. 푸시
[ec2-user@ip-10-14-11-244 ~]$ docker push public.ecr.aws/n3l5a9n9/web-site:blue
✔️ 푸시된 이미지 확인
일반사용자에서 진행
✔️ 이름: EKS-CLUSTER
버전: 1.22
역할: eksClusterRole
✔️VPC: MY-VPC
서브넷: public 2a, 2c
✔️ 보안그룹 : MY-SG-WEB
엔드포인트 엑세스 : 퍼블릭
네트워킹 추가기능 : default
✔️ 제어 플레인 로깅 전부 활성화.
✔️ 생성
일반사용자에서 진행
EKS > 클러스터 > EKS-CLUSTER > 노드 그룹 추가
✔️ 이름 : NODEGROUP
IAM역할 : nodeGroupRole
✔️ AMI 유형 : 아마존리눅스2
용량 유형 : On-Demand
인스턴스 유형 : t2.micro
디스크 크기 : 20GiB
노드그룹 조정 구성 : 5, 5, 10
최대 사용 불가 : 수 ; 1
✔️ 서브넷 : public 2a,2c
노드에 대한 SSH 액세스 구성 활성화 체크
키페어 : 만들어둔 키 선택
권한 허용 대상 : 모두
✔️ 생성
✔️ 자격증명 및 기초셋팅
[ec2-user@ip-10-14-11-244 ~]$ aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER
[ec2-user@ip-10-14-11-244 ~]$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectl
[ec2-user@ip-10-14-11-244 ~]$ chmod +x ./kubectl
[ec2-user@ip-10-14-11-244 ~]$ sudo mv ./kubectl /usr/local/bin ## 어느 디렉토리에서든 실행 가능하게 mv.
[ec2-user@ip-10-14-11-244 ~]$ source <(kubectl completion bash) ## 자동완성기능 활성화.
✔️ alias 추가
[ec2-user@ip-10-14-11-244 ~]$ vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
alias k=kubectl
complete -F __start_kubectl k
export PATH
워커노드1개에 pv,pvc,pod생성해서 연결
# mkdir volume && cd $_
#aws ec2 create-volume --availability-zone=ap-northeast-2a --size=1 --volume-type=gp2
{
"AvailabilityZone": "ap-northeast-2a",
"CreateTime": "2022-07-25T02:22:14+00:00",
"Encrypted": false,
"Size": 1,
"SnapshotId": "",
"State": "creating",
"VolumeId": "vol-0b791600d3e2e4c89",
"Iops": 100,
"Tags": [],
"VolumeType": "gp2",
"MultiAttachEnabled": false
}
[ec2-user@ip-10-14-11-244 volume]$ vi aws-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gp2
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
[ec2-user@ip-10-14-11-244 volume]$ k apply -f aws-sc.yaml
vi aws-vol.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-aws
spec:
storageClassName: gp2
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
accessModes:
- ReadWriteOnce
awsElasticBlockStore:
fsType: ext4
volumeID: vol-0b791600d3e2e4c89
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-aws
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: pod-aws
namespace: default
labels:
app: pod-aws
spec:
containers:
- name: test
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pvc
nodeName: ip-10-14-10-254.ap-northeast-2.compute.internal
volumes:
- name: pvc
persistentVolumeClaim:
claimName: pvc-aws
---
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-pod
spec:
type: NodePort
selector:
app: pod-aws
ports:
- protocol: TCP
port: 80
targetPort: 80 # 컨테이너 포트가 맞다.
nodePort: 30080
[ec2-user@ip-10-14-11-244 volume]$ k apply -f aws-vol.yaml
[ec2-user@ip-10-14-11-244 volume]$ k get pv,pvc
✔️ 보안그룹 설정
pod 설치한 인스턴스 접근 - 퍼블릭 ip 통해서 mobaxterm으로 진입
[ec2-user@ip-10-14-10-254 ~]$ curl 10.14.10.254:30080
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.23.1</center>
</body>
</html>
마스터 노드에서 접근 할 수 있도록 포트 열기
[ec2-user@ip-10-14-11-244 volume]$ curl 10.14.10.254:30080
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.23.1</center>
</body>
</html>
✔️ forbidden 없애기 위해 경로 확인
or
[ec2-user@ip-10-14-10-254 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 20G 0 disk
└─xvda1 202:1 0 20G 0 part /
xvdcg 202:21504 0 1G 0 disk /var/lib/kubelet/pods/0831a914-afc3-42bb-a8d6-c67195aea811/volumes/kubernetes.io~aws-ebs/pvc-514
[ec2-user@ip-10-14-10-254 ~]$
✔️ 마운트 후 인덱스파일 넣기
[ec2-user@ip-10-14-10-254 ~]$ sudo mount /dev/xvdcg /mnt
[ec2-user@ip-10-14-10-254 ~]$ sudo vi /mnt/index.html
Hello World
✔️ 확인 워커노드 퍼블릭 IP(웹브라우저), 내부 IP (CLI)
[ec2-user@ip-10-14-10-254 ~]$ curl 10.14.10.254:30080
Hello World
[ec2-user@ip-10-14-11-244 volume]$ vi test-ebs.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-ebs
labels:
app: test-ebs
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: test-volume
nodeName: ip-10-14-34-50.ap-northeast-2.compute.internal
volumes:
- name: test-volume
# This AWS EBS volume must already exist.
awsElasticBlockStore:
volumeID: "vol-01e83fdaa98a33e1a"
fsType: ext4
---
apiVersion: v1
kind: Service
metadata:
name: test-ebs-svc
spec:
type: NodePort
selector:
app: test-ebs
ports:
- protocol: TCP
port: 80
targetPort: 80 # 컨테이너 포트가 맞다.
nodePort: 30088
[ec2-user@ip-10-14-11-244 volume]$ k apply -f test-ebs.yaml
✔️ 보안그룹 설정 (eks-remoteaccess)
✔️ 10.14.31.50에 해당하는 인스턴스 퍼블릭 IP로 mobaxterm 진입.
✔️ 정상적으로 연결된 것 확인(mount X, attatch O)
✔️ mount 진행
[ec2-user@ip-10-14-34-50 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 20G 0 disk
└─xvda1 202:1 0 20G 0 part /
xvdbv 202:18688 0 1G 0 disk /var/lib/kubelet/pods/64a5d484-5501-41a5-9adb-143f1d0e2aa2/volumes/kubernetes.io~aws-ebs/test-v
[ec2-user@ip-10-14-34-50 ~]$ sudo mount /dev/xvdbv /mnt
[ec2-user@ip-10-14-34-50 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 479M 0 479M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 740K 487M 1% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/xvda1 20G 3.3G 17G 17% /
/dev/xvdbv 974M 24K 958M 1% /mnt
tmpfs 98M 0 98M 0% /run/user/1000
[ec2-user@ip-10-14-34-50 ~]$ sudo vi /mnt/index.html
ALOHA
[ec2-user@ip-10-14-11-244 wokdpress]$ vi confingmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-wordpress
namespace: default
data:
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: mode1752
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
[ec2-user@ip-10-14-11-244 wokdpress]$ vi mysql-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql-pod
spec:
containers:
- name: mysql-container
image: mysql:5.7
envFrom:
- configMapRef:
name: config-wordpress
ports:
- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
type: ClusterIP
selector:
app: mysql-pod
ports:
- protocol: TCP
port: 3306
targetPort: 3306
[ec2-user@ip-10-14-11-244 wokdpress]$ vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
name: wordpress-pod
labels:
app: wordpress-pod
spec:
containers:
- name: wordpress-container
image: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql-svc:3306
- name: WORDPRESS_DB_USER
valueFrom:
configMapKeyRef:
name: config-wordpress
key: MYSQL_USER
- name: WORDPRESS_DB_PASSWORD
valueFrom:
configMapKeyRef:
name: config-wordpress
key: MYSQL_PASSWORD
- name: WORDPRESS_DB_NAME
valueFrom:
configMapKeyRef:
name: config-wordpress
key: MYSQL_DATABASE
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
type: LoadBalancer
# externalIPs:
# - 192.168.2.0
selector:
app: wordpress-pod
ports:
- protocol: TCP
port: 80
targetPort: 80
[ec2-user@ip-10-14-11-244 wokdpress]$ k apply -f wordpress-pod-svc.yaml
[ec2-user@ip-10-14-11-244 wokdpress]$ k get all
NAME READY STATUS RESTARTS AGE
pod/mysql-pod 1/1 Running 0 6m43s
pod/wordpress-pod 1/1 Running 0 38s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 105m
service/mysql-svc ClusterIP 172.20.238.123 <none> 3306/TCP 6m43s
service/wordpress-svc LoadBalancer 172.20.213.161 a719e5c37700144298260442e368755c-740478662.ap-northeast-2.elb.amazonaws.com 80:30318/TCP 37s
✔️ https 설정
aws - ec2 - 로드밸런서 - 생성된 clb클릭 - 리스너 - 편집 - SSL(보안 TCP), 인스턴스 포트 30318- SSL인증서 ACM 추가 후 저장.
✔️ 보안그룹 설정
소스 보안그룹 클릭, 인바운드 규칙에 HTTPS 추가.
✔️ route53 도메인 설정 (레코드 생성)
레코드 이름 : blog
트래픽 라우팅 대상 별칭으로, CLI manifest로 생성한 clb 선택
✔️https 설정
워드프레스 설치 후 플러그인 - 새로추가 - https 검색 - Really Simple SSL - 지금 설치 - 활성화 - Activate SSL
완료!
✔️RDS- 데이터베이스 생성 - MYSQL(5.7.22)-프리티어
✔️DB인스턴스 식별자 : database-1
마스터사용자이름: mj
마스터 암호 기입
✔️인스턴스 클래스 : db.t2.micro
✔️ 스토리지 유형 : gp2, 자동조정 (default
✔️ VPC:MY-VPC
서브넷 그룹 : default
퍼블릭 액세스 : 아니오
✔️ 보안그룹 새로생성
이름 : MY-SG-RDS
가용영역 : 2b
✔️ 데이터베이스 인증 : 암호 인증
✔️ 추가구성 :
초기데이터베이스 이름 : wordpress
로그내보내기 다 체크
✔️데이터 베이스 - 보안 - 보안그룹 진입(MY-SG-RDS) - 인바운드 규칙 편집 - 소스 부분 IP:10.14.0.0/16 - 규칙저장
vi confingmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-wordpress
namespace: default
data:
WORDPRESS_DB_HOST: database-1.crfklihww3gw.ap-northeast-2.rds.amazonaws.com:3306
WORDPRESS_DB_USER: mj
WORDPRESS_DB_PASSWORD: kosa0401
WORDPRESS_DB_NAME: wordpress
[ec2-user@ip-10-14-11-244 wokdpress]$ k apply -f confingmap-wordpress.yaml
vi wordpress-deployment-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deploy
labels:
app: wordpress-deploy
spec:
replicas: 3
selector:
matchLabels:
app: wordpress-deploy
template:
metadata:
labels:
app: wordpress-deploy
spec:
containers:
- name: wordpress-container
image: wordpress
envFrom:
- configMapRef:
name: config-wordpress
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
type: LoadBalancer
# externalIPs:
# - 192.168.2.0
selector:
app: wordpress-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
[ec2-user@ip-10-14-11-244 wokdpress]$ k apply -f wordpress-deployment-svc.yaml
[ec2-user@ip-10-14-11-244 wokdpress]$ k describe configmaps config-wordpress
[ec2-user@ip-10-14-11-244 wokdpress]$ k get all
접속 확인
✔️ route53 도메인 설정
✔️ https 설정
1. 리스너 설정
✔️ 워드프레스 도메인으로 진입해서 설치
📙✔️✏️📢⭐️📌
서버리스 시스템.
용량을 계산하지 않아도 됨.
다만 사용량이 계속 변할경우 비용 계산이 예측하기 어려움.
권한이 없으면 하얀색. 권한 부여해주고 정상 실행이 가능하면 초록색임.
10.14.0 ~ 10.14.15 -> a