컨트롤 플레인 -> 명령어를 받아서, 데이터 플레인 어떤 EC2를 배포할지 작업함
다시 말해 컨테이너 호스팅은 크게 EC2와 Fargate로 나눠볼 수 있고 Fargate는 완전관리형 컨테이너 호스팅 서비스이며 컨테이너 Serverless 라고도 말합니다.
AWS는 독립적인 서비스라 다른 서비스를 접근할 때 권한을 줘야한다.
IAM에서 admin롤 주고(test용), ec2 - instance선택 - 작업 - 보안 - IAM역할수정
80, 2000 port를 사용예정이기에 Ec2 보안으로 이동해서 port를 열어준다
EKS를 설치 하고 EKS에 명령을 날리기 위한 유틸리티 kubectl
를 설치 하자.
# kubectl 다운로드
sudo curl -o /usr/local/bin/kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.23.13/2022-10-31/bin/linux/amd64/kubectl
# 실행권한 주기
sudo chmod +x /usr/local/bin/kubectl
# 버전확인
kubectl version --client=true --short=true
# eksctl 다운로드, 압축풀기
curl --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
# eksctl을 /usr/local/bin 디렉터리로 이동
sudo mv -v /tmp/eksctl /usr/local/bin
# 설치확인
eksctl version
#현재 리전의 정보를 환경변수에 저장
export AWS_REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/region) && echo $AWS_REGION
# eks 배표 -> 이 명령어를 통해 vpc, ec2 배포 등을 자동화함
eksctl create cluster --name myeks --version 1.23 --region ${AWS_REGION}
# 노드의 리스트 확인
kubectl get nodes
#아래처럼 노드의 리스트가 나와야함
ip-192-168-51-108.ap-northeast-2.compute.internal Ready <none> 115s v1.23.17-eks-0a21954
ip-192-168-69-32.ap-northeast-2.compute.internal Ready <none> 100s v1.23.17-eks-0a21954
# 안되면 리소스 삭제하고, eks 배포 다시해줌
설치 완료!
이미 CLoud9에는 Docker가 설치되어 있음
docker search nginx
을 검색해 이미지를 확인하고 스타가 많은 nginx
를 설치한다
docker pull nginx
이미지 확인 docker images
이 이미지를 기반해서 container 만들기 docker run --name apple -d -p 80:80 nginx
—-name
: 컨테이너의 이름을 지정(생략하면 랜덤하게 만듭니다)-d
: 백그라운드에서 실행-p 80:80
: 앞에 80번 포트로 접근하면 컨테이너의 80번 포트로 연결하라는 포트 매핑하는 옵션nginx
: 풀(다운)받을 이미지 이름그럼 이제 cloud9이 돌아가고 있는 EC2엔 nginx가 돌아가고 있을 것!
-> EC2인스턴스 이동 후 퍼블릭 IPv4로 이동
첫번째 인스턴스 배포 완료! (pull 하지 않아도 docker run을 사용하면 돌아감)
docker ps
실행되고 있는 컨테이너 확인!
docker stop apple
컨테이너 정지
docker ps -a
하면 상태가 Exited가 된 것을 확인 할 수 있음docker start apple
다시 실행시키기하나의 인스턴스로 많은 컨테이너 연결?
docker run --name orange -d -p 2000:80 nginx
: 2000 번 port를 받아서 80번 포트로 넘김!
:2000
으로 들어가도 nginx의 화면이 잘보이는 것을 알 수 있다.docker stop apple
: 도커 다시 스톱 (삭제 전 stop을 해야 삭제가 가능하다)
rm으로 삭제시켜준다!
git clone https://github.com/gabrielecirulli/2048
으로 2048게임을 클론cd ~/environment/2048
디렉토리 이동cat <<EOF > Dockerfile # EOF라는 단어 나올 때 까지 중간 내용을 Dockerfile로 저장
FROM nginx:latest
COPY . /usr/share/nginx/html # 현재 디렉토리 모든 파일을 ~~html 디렉토리로 옮김(nginx의 홈 디렉토리)
EXPOSE 80
EOF
docker build -t web2048 .
: 도커파일을 읽어서 web2048이라는 이름의 이미지를 만들자
docker images
로 잘 만들어졌는지 확인!
docker run --name web2048 -dp 80:80 web2048
다음 명령어로 nginx 이미지를 기반으로 컨테이너를 실행! 그리고 브라우저에 Cloud9 인스턴스의 Public IP 주소를 입력하여 2048 게임 화면이 제대로 나오는지 확인해본다
다음 실습을 위해 컨테이너 지우기! `docker rm -f $(docker ps -aq)'
이미지 지우기 docker rmi -f $(docker images -q)
푸시명령어 보기
를 눌러서 순서대로 작성해준다docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -q)
docker run --name 2048 -dp 80:80 [본인 이미지]
를 입력해주면 잘 설치가 되는 것이 보인다!!! wow
오ㅐ 내 ECR 주소는 길까...? -> 레지스토리 주소를 전체 입력해 레포로 들어가는게 맞음! 하지만 dockerhub는 이미 docker설치할 때, 긴 주소가 저장되어 있기 때문에 자동으로 입력되는 거였음!!!ㅋㅋㅋㅋㅋ fake다 요놈
이제 이 하나의 컨테이너로는 많은 서비스의 유저 input을 감당할 수 없음! 그래서 kuber로 관리해주는거
`kubectl run nginx-apple --image=nginx
kubectl get pods
이제 선언형(yaml)을 만들어서 pod을 제작해보자
cat <<EOF > nginx-orange.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-orange
labels:
run: nginx-orange
spec:
containers:
- name: orange
image: nginx
EOF
kubectl apply -f nginx-orange.yaml
-f
파일에서 apply 하겠다는 것kubectl get pods -o wide
: 어느 노드에 배포되었는지 확인 (-wide
를 붙이면 node의 정보도 길게 볼 수 있다)kubectl get pods --show-labels
: 레이블 확인kubectl delete pods nginx-apple
kubectl delete pods -l run=nginx-orange
cat <<EOF > replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: nginx-replicaset
template:
metadata:
labels:
app: nginx-replicaset
spec:
containers:
- name: nginx-container
image: nginx
EOF