Docker Host 대신 EKS를 이용해 배포해 본다.
jenkins, ansible 서버를 켜고, 새로운 eks-server를 만든다.
v
#!/bin/bash
timedatectl set-timezone Asia/Seoul
hostnamectl set-hostname eks-server
cd /tmp
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
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
mv ./kubectl /usr/local/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
사용자 데이터
sudo vi /etc/ssh/sshd_config
yes.로 바꾼 후 sudo systemctl restart sshd 한다.
IAM에서 역할 생성한다.
AmazonEC2FullAccess
IAMFullAccess
AdministratorAccess
AWSCloudFormationFullAccess
4 개를 체크한다.
만든 역할을 인스턴스에적용한다.
2a, 2c 퍼블릭 세브넷을 조사해서 첨부한다.
클러스터를 만든다.
eksctl create cluster --name EKS-CLUSTER --region ap-northeast-2 --version 1.21 --vpc-public-subnets subnet-05ccd1b1e205bae9f,subnet-064d5bd3269f87c1f --without-nodegroup
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 aws_key
cluster와 노드그룹을 만든다.
콘솔에 들어가보면 생겨 있다.
ansible-server의 Docker 디렉터리로 간다
vi build.yml
- hosts: ansible-server
tasks:
- name: remove docker image
command: docker rmi -f hyun141/mytomcat:latest
- name: create docker image
command: docker build -t hyun141/mytomcat:latest .
args:
chdir: /opt/docker
- name: push docker image
command: docker push hyun141/mytomcat:latest
sudo vi /etc/ansible/hosts
[eks-server]
10.29.15.94
[docker-host]
10.33.46.187
[ansible-server]
10.29.3.91
각각의 private ip 입력한다.
ssh-copy-id [eks-server의 ip]
ping했을 때 docker 빼고 다 되는게 정상
ansible-playbook build.yml
만약 안되면 docker login
eks-server에서 작성한다.
mkdir test && cd $_
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: hyun141/mytomcat: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
kubectl apply -f deployment.yaml
kubectl apply -f svc.yaml
이러고 해당 loadbalancer 사이트에 들어가면 tomcat이 나오고, /webapp을 붙이면 부트스트랩 사이트가 나온다.
kubectl delete -f .
ansible-server에서 작업한다.
vi kube-deploy-svc.yml
- hosts: eks-server
tasks:
- name: remove deploy
command: kubectl delete -f /home/ec2-user/test/deployment.yaml
ignore_errors: yes
- name: kube deploy
command: kubectl apply -f /home/ec2-user/test/deployment.yaml
- name: kube svc
command: kubectl apply -f /home/ec2-user/test/svc.yaml
- name: update
command: kubectl rollout restart deployment/web-site-deployment
kubenetes에서 deploy와 svc를 작동하게 하는 yml파일.
기존에 있는 것들을 삭제하고 - 다시 deploy.yml과 svc.yml을 apply하는 작업
ignore_error : yes를 해서 error를 해도 중단되지 않도록 한다. => 삭제할 게 없어도 그냥 진행하도록 한다.
ansible-playbook kube-deploy-svc.yml
한 후 kubectl get svc 한다.
이러고 해당 loadbalancer 사이트에 들어가면 tomcat이 나오고, /webapp을 붙이면 부트스트랩 사이트가 나온다.
Jenkins에 로그인해서 새로운 Item을 만든다.
ansible-server의 opt/docker에 webapp/target/의 war파일을 넘기는데, 경로는 제외하고 war파일만 넘기도록 한다.
deploy와 달리 service는 다시 만들어지지 않으므로 end-point는 바뀌지 않는다
즉, 경로(주소)는 바뀌지 않아야 한다.
빌드한 뒤, eks-server에서 확인해본다.
수초 전에 생성된 것을 볼 수 있다
엔드 포인트가 고정되었으므로 레코드를 생성한다.
www.~로 접속해 본다.
기존에 클론했던 저장소를 지우고 새로 클론한다.
변화를 확인하기 위해 index.jsp 파일을 수정한다.
commit 후 push한다. =>그러면 젠킨스에서 자동으로 빌드가 된다.
다시 들어가 보면 새로 커밋한 걸로 뜬다.
정리하기
eks-server에서 작업한다.
kubectl delete all -all
eksctl delete cluster EKS-CLUSTER --region ap-northeast-2
콘솔에서는 Nodegroup을 지워야 eks cluster를 지울 수 있지만, cli에서는 바로 eks cluster를 지울 수 있다.
S3
S3에 접근할 때는 인터넷이 필요하다. 내부망을 사용하지 않는다.
Properties > 맨 밑에 정적 웹사이트 활성화 [Edit]
그러면 이렇게 웹사이트 주소가 나온다.
Route53에서 레코드 추가해준다.
ping이 잘 간다.
인스턴스에 역할이 들어 있기 때문에 eks-server에서 접근이 가능하다
하지만 만약 이 인스턴스가 프라이빗 서브넷에 있었다면 s3에 접근되지 않았을 것이다.
private subnet 2a의 인스턴스를 만든다.
ansible-server에 접속하도록 키를 옮기고, 접속해 본다.
ping을 쳐 보면 안간다.
역할을 부여해 본다.
credentials이 되더라도 인터넷이 안돼서 접속이 안된다.
내가 소유자여도 인터넷으로 접속하므로 -> data transfer 로 인한 아웃바운드 트래픽 발생 ->요금 부과
=> 엔드포인트에 대한 정보를 줘서 인터넷을 거치지 않고 내부 망으로 endpoint를 거쳐 연결할 수 있도록 한다.
-> 요금이 준다. => 비용효율적
=> 보안 강화
VPC > 엔드포인트
엔드포인트를 생성한다.
이 중 Gateway를 선택한다.
Gateway를 통해 내부망으로 S3에 연결할 수 있다.
Private subnet을 선택한 뒤 생성한다.
라우트 테이블에 생긴 pl~ 이 엔드포인트이다.
다시 해보면 ping이 간다.
'Infra > Kubernetes' 카테고리의 다른 글
Kafka & Redis on Kubernetes (0) | 2023.06.12 |
---|---|
kubernetes 9 (0) | 2022.07.25 |
kubernetes 8 (0) | 2022.07.22 |
kubernetes 7 (0) | 2022.07.21 |
kubernetes 5 (0) | 2022.07.20 |