카테고리 없음

[2023-06-12 월] EKS

16비트 2023. 6. 12. 17:50

 

1. IAM 사용자 생성

 

IAM 사용자 생성

생성한 사용자 MFA 설정하기

 

 

 

사용자로 접속해보기

IAM 사용자 URL 복사

시크릿창을 열고 URL에 붙여넣기

 

 

 

리포지토리로 사용할 가상머신 켜고 MobaXterm 접속

# curl http://192.168.1.157:5000/v2/_catalog   # 현재 리포지토리에 있는 이미지 정보

# curl http://192.168.1.157:5000/v2/web-site/tags/list   # web-site 이름이 web-site 이고 태그가 달린 이미지 정보

# vi /etc/docker/daemon.json    # 인증정보 있는지 확인. 안되어있다면 입력 후 systemctl restart docker

{ "insecure-registries":["192.168.1.157:5000"] }

 

# docker pull 192.168.1.157:5000/web-site:aws    # 사설리포지토리에서 이미지 가져오기

# docker pull 192.168.1.157:5000/web-site:food

 

 

2. AWS ECR

AWS ECR

자격증명

# aws configure

ap-northeast-2

json

# aws s3 ls

 

가상머신에 AWS CLI 설치

# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# unzip awscliv2.zip

# ./aws/install

# aws --version

 

 

ECR에 로그인

# aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/f5s7z9x9

 

# docker tag 192.168.1.157:5000/web-site:aws public.ecr.aws/f5s7z9x9/web-site:aws    # 태그 달기

# docker tag 192.168.1.157:5000/web-site:food public.ecr.aws/f5s7z9x9/web-site:food

# docker push public.ecr.aws/f5s7z9x9/web-site:aws

# docker push public.ecr.aws/f5s7z9x9/web-site:food

 

이미지가 잘 push됨

 

# docker rmi public.ecr.aws/f5s7z9x9/web-site:food   # 이미지 삭제하기

# docker rmi public.ecr.aws/f5s7z9x9/web-site:aws

 

# docker run -d -p 8081:80 --name aws-web public.ecr.aws/f5s7z9x9/web-site:aws # 컨테이너 생성+실행

# docker run -d -p 8082:80 --name food-web public.ecr.aws/f5s7z9x9/web-site:food

접속테스트

 

 

test-home 리포지토리 생성

 

# docker tag 192.168.1.157:5000/test-home:v0.0 public.ecr.aws/f5s7z9x9/test-home:v0.0

# docker tag 192.168.1.157:5000/test-home:v1.0 public.ecr.aws/f5s7z9x9/test-home:v1.0

# docker tag 192.168.1.157:5000/test-home:v2.0 public.ecr.aws/f5s7z9x9/test-home:v2.0

 

# docker push public.ecr.aws/f5s7z9x9/test-home:v0.0

# docker push public.ecr.aws/f5s7z9x9/test-home:v1.0

# docker push public.ecr.aws/f5s7z9x9/test-home:v2.0

 

 

3. AWS EKS의 권한 생성

 

 

ECS는 역할 설정하지 않아도 자동으로 만들어줬지만 EKS는 수동으로 역할을 만들어줘야한다

 

어떤 서비스가 역할을 사용할 것인지 선택하는 단계

 

서브넷  subnet   # 워커노드를 어디에 생성시킬 지 선택

 

4. EKS 생성 및 세팅

 

CoreDNS

EKS Kubernetes 클러스터 내에서 DNS 서비스를 제공한다.

DNS를 사용하면 개별 컨테이너가 클러스터 내의 다른 컨테이너를 쉽게 검색하고 연결할 수 있다.

 

kube-proxy

Kubernetes 클러스터의 각 노드에서 실행되는 네트워크 프록시

kube-proxy 역할은 클러스터에 정의된 서비스를 반영하고 노드에서 네트워킹 규칙을 관리하여 서비스를 지원하는 포드와의 통신을 허용한다

 

Amazon VPC CNI  (flannel 역할)

Amazon EKS Kubernetes용 Amazon VPC CNI(Container Network Interface) 플러그인을 사용하여 네이티브 VPC 네트워킹을 지원한다.

이 플러그인을 사용하면 Kubernetes 포드가 VPC 네트워크에서와 동일한 IP 주소를 포드 내에서 가질 수 있습니다. 

 

Docker 서버 세션에서 eks cli 실행
# aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER   # kubectl server에 대한 자격증명
# curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.26.4/2023-05-11/bin/linux/amd64/kubectl # kubectl 설치


# chmod +x ./kubectl
# sudo mv ./kubectl /usr/local/bin    # 어느 경로에서든지 kubectl 명령을 실행할 수 있게 하는 명령

# yum install -y bash-completion

# source <(kubectl completion bash)      # 자동완성을 위한 소스
# echo "source <(kubectl completion bash)" >> ~/.bashrc
# kubectl version --short --client
# kubectl get svc

 

5. EKS 워커노드 생성

IAM 역할 생성

워커 노드들은 EC2

역할에 정책 연결하기

AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy

 

노드 그룹 생성

생성된 워커노드 이름 입력

 

도커서버 세션에서 

# kubectl get no

# kubectl get pod --all-namespaces

 

6. EKS 워커노드 LoadBalancer로 접속, Pod 개수 제한

# mkdir test && cd $_
# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment
spec:
  replicas: 4
  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: public.ecr.aws/f5s7z9x9/web-site:aws   # ECR에 있는 이미지

 

# kubectl apply -f deployment.yaml

# kubectl get all


# vi loadbalancer-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-deployment
spec:
  type: LoadBalancer
  selector:
    app: web-site-deployment
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

# kubectl apply -f loadbalancer-deployment.yaml

# kubectl get svc

접속테스트

Route53 레코드 생성하기

도메인 명으로 접속테스트

 

ScaleOut 하기

# kubectl edit deployments.apps web-site-deployment   # replicas: 12으로 변경

# kubectl get po -o wide         # 2개의 pod가 Pending되었다

# kubectl describe po web-site-deployment-7b85c97579-p4v92   # Pod가 너무 많아서 용량이 부족함

VirtualBox는 다 만들어졌는데 EKS 워커노드는 못 만든 이유

# kubectl describe po web-site-deployment-7b85c97579-p4v92       # 노드를 지키기위해 aws 자체적으로 생성 파드 개수를 제한한다

다른 노드는 system-pod가 2개지만 하나의 노드가 system-pod로 4개가 다 차있기 때문에 12개를 생성하지 못하고 10개만 생성된다

# kubectl scale deployment web-site-deployment --replicas 6    # ScaleIn 하기

# kubectl get po -o wide  # Pending인 pod가 사라졌다

 

7. EKS 보안그룹, 워커노드 NodePort로 접속

# cp deployment.yaml deployment2.yaml

# vi deployment2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-site-deployment2
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web-site-deployment2
  template:
    metadata:
      name: web-site-deployment2
      labels:
        app: web-site-deployment2
    spec:
      containers:
      - name: web-site-deployment-container2
        image: public.ecr.aws/f5s7z9x9/web-site:food

 

# kubectl apply -f deployment2.yaml     # aws 웹페이지 6개 food 웹페이지 4개가 생성된다

 

# cp loadbalancer-deployment.yaml nodeport-deployment.yaml

# vi nodeport-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: nodeport-service-deployment
spec:
  type: NodePort
  selector:
    app: web-site-deployment2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

# kubectl apply -f nodeport-deployment.yaml

# kubectl get svc    # 노드포트 번호를 30347을 부여받았다

# kubectl get po -o wide   # pod가 생성된 노드 이름 확인

# kubectl get no -o wide   # 노드 이름

# curl 10.40.13.151     # 안됨. 도커 서버가 클러스터 안에 있지 않기 때문

# curl 13.125.163.172:30347      # 안됨. 보안 그룹 때문

 

 

현재 워커 노드에는 보안 그룹이 2개 있다

sg-0f2880c89595fddfd (eks-cluster-sg-EKS-CLUSTER-1723060346) 는 클러스터 안에서 클러스터끼리 통신하도록 하는 방화벽

sg-0e45b84a089baea4b (eks-remoteAccess-f0c4570f-2ae4-e260-74b2-ffdf06d6eb9e)는 외부에서 클러스터에 접속하는 방화벽

 

외부에서 클러스터에 접속하는 방화벽에서 생성된 노드포트 서비스의 포트 번호를 열어준다

접속테스트

 

8. EKS 워커노드 ClusterIP로 접속

# cp nodeport-deployment.yaml clusterip-deployment.yaml

# vi clusterip-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: clusterip-service-deployment
spec:
  type: ClusterIP

  externalIPs:

  - 10.40.13.151   # 위에서 노드 포트로 접속했던 워커노드의 external-IP와 매핑되어있는 Internal-lIP
  selector:
    app: web-site-deployment2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

# kubectl apply -f clusterip-deployment.yaml

# kubectl get svc

# kubectl get no -o wide    # svc와 매핑되는 EXTERNAL-IP로 접속테스트

 

접속테스트  # 안됨. 80포트를 열지 않았기 때문

eks-remoteAccess 방화벽에서 80포트를 열어준다

 

접속테스트

 

 

보안 그룹 규칙 설명

 

CLB에서 들어오는 트래픽만 허용하겠다는 규칙을 EKS가 생성해줬다

자기 자신의 보안그룹을 소스로 설정해놓으면 같은 보안 그룹 내에 있는 인스턴스끼리는 모든 포트의 통신이 가능하다

원래는 같은 보안 그룹에 있다고 해서 통신이 되는 것이 아니라 포트번호를 열어줘야한다

 

자원 정리하기

# kubectl delete all --all

노드 그룹 지우기

EKS 삭제