0725[EKS,ECR]

망지·2022년 7월 25일
0

📌AWS - EKS

📙 docker(master client)인스턴스 생성

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

📙 route 53 레코드 생성

✔️레코드 이름 : docker,
값 : 앞서 생성한 인스턴스의 퍼블릭 IP

✔️ 웹브라우저 통해서 도메인 접속 확인

📙 리포지토리 생성

✔️ Amazon ECR > 리포지토리 > 리포지토리생성(public)

✔️ 리포지토리 이름 : web-site - 리포지토리 생성

📙 docker서버에서 aws 로그인

✔️ 이전에 사용자 생성시 만들어둔 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 클러스터 생성

일반사용자에서 진행

✔️ 이름: 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 액세스 구성 활성화 체크
키페어 : 만들어둔 키 선택
권한 허용 대상 : 모두

✔️ 생성

📙 EKS 서비스 CLI에서 이용하기 위한 설정 (docker server)

✔️ 자격증명 및 기초셋팅

[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

📙 volume ( pv,pvc)

워커노드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

📙 volume(pod-ebs)

[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

📙configmap(wordpress)

[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

✔️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. 리스너 설정

  1. 로드밸런서 - 보안 - 보안그룹 이름 클릭 - 인바운드 편집에서 https 추가

✔️ 워드프레스 도메인으로 진입해서 설치

📙✔️✏️📢⭐️📌

📌기타

⭐️ fargate

서버리스 시스템.
용량을 계산하지 않아도 됨.
다만 사용량이 계속 변할경우 비용 계산이 예측하기 어려움.

⭐️kubectl 권한

권한이 없으면 하얀색. 권한 부여해주고 정상 실행이 가능하면 초록색임.

⭐️ 서브넷과 ip

10.14.0 ~ 10.14.15 -> a

profile
꾸준히, 차근차근

0개의 댓글