인스턴스 생성
- 이름: eks-server
- AMI: Amazon Linux
- t2.micro
- 키페어 설정
- 2c 가용영역
- 보안그룹 설정 (기존에 있던 dev-SG)
- 사용자데이터
#!/bin/bash timedatectl set-timezone Asia/Seoul #시간 세팅 hostnamectl set-hostname eks-server # hostname세팅 cd /tmp #tml폴더에서 작업한다. curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" # awscliv2 다운로드 unzip awscliv2.zip ./aws/install # awscli 설치 curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl chmod +x ./kubectl # kubectl 설치 및 실행권한 추가 mv ./kubectl /usr/local/bin # bin폴더에 추가해서 명령어처럼 사용 echo "source <(kubectl completion bash)" >> /home/ec2-user/.bashrc curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp mv /tmp/eksctl /usr/local/bin # eks ctl도 설치한다.
aws --version
kubectl version
eksctl version
- 세가지가 모두 잘 설치됬는지 version을 출력해본다.
PasswordAuthrntication 설정
sudo passwd ec2-user
sudo vi /etc/ssh/sshd_config
- 키 방식에서 비밀번호입력 방식을 추가해준다.
PasswordAuthentication yes #PermitEmptyPasswords no #PasswordAuthentication no
sudo systemctl restart sshd
- sshd를 재시작해준다.
- eks에서 클러스터 생성 및 노드그룹을 생성하는데 시간이 어느정도 걸리게된다.
- 넣어줄 권한 4가지를 체크해서 만들어준다.
AmazonEC2FullAccess IAMFullAccess AdministratorAccess AWSCloudFormationFullAccess
- 잘 생성되었다.
- eks-server에 작업 -> 보안 -> IAM역할 수정으로 IAM역할을 부여한다.
eksctl create cluster --name EKS-CLUSTER --region ap-northeast-2 --version 1.21 --vpc-public-subnets subnet-0e52f60ee610df2ec,subnet-041b9223c2dd2b490
,
로 구분하고 띄어쓰기없다.)eksctl create nodegroup \
--cluster EKS-CLUSTER \
--region ap-northeast-2 \
--name NODEGROUP \
--node-type t2.micro \
--nodes 4 \
--nodes-min 4 \
--nodes-max 8 \
--ssh-access \
--ssh-public-key Docker-key
- ansible-server로 이동
인벤토리 확인
sudo vi /etc/ansible/hosts
[docker-host] 192.168.8.114 [ansible-server] 192.168.10.42 [eks-server] 192.168.39.195
- 다행히 docker-server, ansible-server내부 IP는 바뀌지 않았다.
- 여기서 eks-server의 내부 IP를 추가해준다.
ssh-copy-id 192.168.39.195
- eks-server도 ssh 접속할 수 있도록 키를 보내준다.
- ansible all -m ping
- 연결확인
- EKS-server, ansible-server는 잘 연결되었다.
- 현재 docker-server는 인스턴스 중지상태라 에러가 나오는 것이 맞다.
vi build.yaml
- hosts: ansible-server tasks: - name: remove docker image command: docker rmi -f jo1132/mytomcat:latest - name: create docker image command: docker build -t jo1132/mytomcat:latest . args: chdir: /opt/docker - name: push docker image command: docker push jo1132/mytomcat:latest
ansible-playbook build.yaml
- build.yaml을 실행한다.
mkdir test && cd $_
- 작업공간 만들기
- 먼저 node들이 잘 생성되었는지 확인
vi deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: web-site-deployment spec: replicas: 2 selector: matchLabels: app: web-site-deployment template: metadata: name: web-site-deployment labels: app: web-site-deployment spec: containers: - name: web-site-deployment-container image: jo1132/mytomcat:latest # jenkins에서 이미지를 Pull할 떄, 항상 image를 pull하도록 Always옵션을 넣는다. 이때, 항상 최신버전을 가져오기 위해 이미지는 latest버전을 가지고 있어야한다. imagePullPolicy: Always
vi svc.yaml
apiVersion: v1 kind: Service metadata: name: loadbalancer-service-deployment spec: type: LoadBalancer selector: app: web-site-deployment ports: - protocol: TCP port: 8080 targetPort: 8080
eks-server에서 실행
kubectl apply -f deployment.yaml
- deployment.yaml을 실행해서, jo1132/mytomcat을 가져와 tomcar을 실행해준다.
- 로드밸런서 서비스도 생성되었다.
- 로드밸런서 도메인주소:8080 주소로 접속하면 잘 접속된다.
vi kube-deploy-svc.yaml
- hosts: eks-server tasks: - name: remove deploy command: kubectl delete -f /home/ec2-user/test/deployment.yaml # 만약 deployment가 이미 있다면 에러가 나지만, ignore_errors옵션으로 에러를 무시한다. ignore_errors: yes - name: kube deploy # deployment를 다시 실행한다. command: kubectl apply -f /home/ec2-user/test/deployment.yaml - name: kube svc # svc를 다시 생성한다. 그러나, 이미 생성되어있다면 무시하게 된다. command: kubectl apply -f /home/ec2-user/test/svc.yaml - name: update # 업데이트 방식 (rollout)을 한번에 다바꾼다. command: kubectl rollout restart deployment/web-site-deployment
ansible-playbook kube-deploy-svc.yaml
- kube-deploy-svc를 실행
새로운 프로젝트 생성
- Item name: Deploy_On_Kube_Ansible
- Copy from: Copy_Atifacts_onto_Ansible
General
소스코드 관리
빌드 유발
Build
빌드 후 조치
- Exec command
cd /opt/docker; ansible-playbook build.yaml; sleep 10; ansible-playbook kube-deploy-svc.yaml;
지금 빌드
- 빌드 성공!
Route53
- 위와 같이 www.cocudeny.shop으로 도메인을 만들어준다.
- 도메인 주소로 잘 접속되었다.
빌드 유발 테스트
Github Update
- index.jsp를 수정해준다.
cd ~
rm -rf hello-world/
git clone https://github.com/jo1132/hello-world.git
cd hello-world
vi webapp/src/main/webapp/index.jsp
git add webapp/src/main/webapp/index.jsp
git commit -m "title changed with anounce EKS test"
git push origin master
Jenkins
- 자동 빌드 중이다.
- 위 title이 EKS-server로 수정되었다.
eks-server 정리
kubectl delete all --all
- 노드그룹 삭제 속도를 올리기위해 pod, svc등 모두 지워준다.
eksctl delete cluster EKS-CLUSTER --region ap-northeast-2
- eksctl을 이용해 cluster를 삭제한다.
- CloudFormation을 이용해 모두 지워주는 것이다.
- 생성할 때, CloudFormation으로 생성하여 노드그룹, Cluster를 한번에 생성했으니, 삭제할때도 한번에 삭제한다.
- 클러스터가 잘 삭제되었다.
- 노드그룹도 잘 종료된것으로 보인다
- 엔드포인트, 엔드포인트 서비스 이 두개는 뭘까
CloudTrail
- 일반 사용자들의 Cloud 서비스 사용 기록
CloudConfig
- 리소스 사용 로그
S3
- S3는 언제나, 어느곳이든 인터넷을 통과한다.
- S3를 생성할 떄, 리전을 설정하지만, 글로벌 서비스로 정의되어있다.
정적 웹 사이트 호스팅
- 간단하게 S3를 생성했다.
- 정적 웹 사이트 호스팅을 생성해준다.
- 위와 같이 설정해주고 편집해준다.
- Route53에서 도메인 레코드를 생성해준다.
- 도메인 주소로 ping이 잘 나간다.
Private EC2로 접속해보기
- 현재 S3를 같은 리전에 생성했으니, Private EC2로 접속이 가능해야 한다.
- Private Subnet에서 EC2를 생성한다.
- Ansible-server에 Docker-key를 올린다.
- chmode 400 Docker-key 로 바꿔준다.
- ssh명령어로 Private ec2에 접속한다.
- ping s3.cocudeny.shop 하면 ping이 나가지 않는다.
aws s3 ls s3://s3.cocudeny.shop
- aws명령어를 입력하면 permission에러가 나온다.
- EC2에 IAM을 부여해서 접속을 시도한다.
엔드포인트
- 도메인주소로 접속하면 결국 아웃바운드, 엔드유저(일반사용자, 외부에서 오는 사용자)의 접속과 같다.
- 결국 인터넷을 통해 내용물을 가져오는 것이다.
- 그래서 아웃바운드, 데이터트랜스퍼 비용이 발생한다.
- 그러나 엔드포인트는 데이터트랜스퍼 비용이 발생하지 않는다.
- 내부 사용자에서 사용하는 방법이다.
- 인터넷을 통과하지 않는 방법이다.
- 데이터 트랜스퍼 비용이 나가지 않아 저렴하다.
- 또, 내부 망을 사용하기 때문에 외부의 접근을 차단하여 안전하게 사용할 수 있다.
- 물론 엔드포인트 자체 비용이 존재하지만, 막대한 데이터트랜스퍼 비용만큼은 아니다.
- 이 S3의 경우는 DynamoDB도 같다.
엔드포인트 생성
- Gateway를 선택해준다.
- Gateway를 통해 내부망에 연결된다.
- 사용할 VPC를 선택해준다.
- 엔드포인트 생성
엔드포인드 연결
- subnet에서 라우팅 테이블을 확인한다.
- Private 서브넷은 local을 대상으로하는 테이블밖에 없었는데, 엔드포인트 테이블이 새로 생겼다.
- 또 ping이 나가기 시작했다.
- 엔드포인트 삭제
- S3삭제
- EC2 중지