티스토리 뷰

이번 글을 진행하려면 먼저 선행되어야 할 작업이 있습니다. 또한 aws, k8s에 대한 기초 지식이 없으면 어려울 수 있습니다.

 

-k8s 1.19버전

-aws cli 설치 후 aws에 액세스 하기

-eksctl 설치

-아래와 같은 vpc 구축

 

위 3가지 선행작업이 되었다는 가정하에 진행합니다.

k8s 클러스터 생성

우선 퍼블릿 서브넷 3개를 가지는 VPC를 통해 EKS를 이용하여 k8s 클러스터를 만들어보겠습니다.

$ eksctl create cluster -f create-cluster.yaml

명령어를 이용하여 k8s 클러스터를 생성합니다.

 

* create-cluster.yaml 

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: "클러스터 이름"
  region: ap-northeast-2
  version: "1.19"

vpc:
  subnets:
    public:
      ap-northeast-2a: { id: "서브넷 id" }
      ap-northeast-2b: { id: "서브넷 id" }
      ap-northeast-2c: { id: "서브넷 id" }

 

만약 올바르게 VPC 구축이 되었고, 올바른 서브넷 아이디를 넣었다면 아래와 같은 메시지가 출력됩니다.

클러스터를 생성하는데 약 20분 정도가 소모되므로 기다려줍니다. 잘 생성되었다면 아래와 같은 메시지가 출력됩니다.

 

생성한 클러스터내에 데이터 플레인 생성하기

 

아래 명령어를 통해 방금 생성한 클러스터에 데이터 플레인 3개를 생성해줍니다.

$ eksctl create nodegroup -f create-nodegroup.yaml

*create-nodegroup.yaml

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: "클러스터 이름"
  region: ap-northeast-2

vpc:
  id: "vpc 아이디"
  cidr: "vpc 사이더"
  subnets:
    public:
      ap-northeast-2a:
        id: "서브넷 아이디"
        cidr: "서브넷 사이더"
      ap-northeast-2b:
        id: "서브넷 아이디"
        cidr: "서브넷 사이더"
      ap-northeast-2c:
        id: "서브넷 아이디"
        cidr: "서브넷 사이더"

nodeGroups:
  - name: ng-1 
    instanceType: m5.large #인스턴스 유형
    desiredCapacity: 3 #최소 노드수 
    minSize: 2 #최소 노드수
    maxSize: 5 #최대 노드수
    ssh: # ssh를 위한 공개키 설정 이 작업은 aws로 개인키를 만든 후 공개키로 만들어줘야한다
      publicKeyPath: ~/public.pem

 

컨트롤 플레인(클러스터)와 데이터 플레인 확인하기

 

아래 명령어를 통해 현재 k8s 컨텍스트를 확인할 수 있습니다. 

$ kubectl config current-context

 

아래 명령어를 통해 데이터 플레인이 잘 생성된 걸 확인할 수 있습니다.

$ kubectl get nodes

 

alb 설정하기

 

Installation Guide - AWS Load Balancer Controller

Load Balancer Controller Installation Kubernetes version requirements AWS Load Balancer Controller v2.0.0~v2.1.3 requires Kubernetes 1.15+ AWS Load Balancer Controller v2.2.0+ requires Kubernetes 1.16+ Existing AWS ALB Ingress Controller users AWS ALB Ingr

kubernetes-sigs.github.io

외부에서 클러스터 내부에 접근하기 위한 type은 여러가지가 있지만 여기서는 ingress를 이용하여 service, nodeport를 설정해줄 것입니다. 또한 alb는 Instance 모드입니다.

 

자격 증명 만들기

eksctl utils associate-iam-oidc-provider \
    --region <region-code> \
    --cluster <your-cluster-name> \
    --approve

 

ALB에 대한 정책 생성

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.1/docs/install/iam_policy.json

위에서 받은 json을 이용하여 아래와 같이 해줍니다.

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam-policy.json

 

클러스터에 대한 serviceAccount 생성하기

eksctl create iamserviceaccount \
--cluster=<cluster-name> \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve

클러스터에 아무나 접근하면 안되므로 serviceAccount를 만들어줘야 합니다.

cert-manager 설치

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.0.2/cert-manager.yaml

만약 k8s 버전이 1.16보다 낮으면 다른 버전의 cert-manager를 이용해야 합니다.

 

ALB controller 생성하기

wget https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.1/docs/install/v2_2_1_full.yaml

컨트롤러를 생성하기 전에 반드시 해야하는 일이 있습니다.

apiVersion: apps/v1
kind: Deployment
. . . 
name: aws-load-balancer-controller
namespace: kube-system
spec:
    . . . 
    template:
        spec:
            containers:
                - args:
                    - --cluster-name=<INSERT_CLUSTER_NAME>

--cluster-name의 부분을 반드시 생성한 클러스터의 이름으로 변경해줍니다. 

 

또 우리는 serviceAccount를 미리 생성했으므로 아래로 이동하여 kind:ServiceAccount 부분을 모두 삭제해줍니다.

apiVersion: v1
kind: ServiceAccount

 

그럼 이제 alb controller를 설치해줍니다.

kubectl apply -f v2_2_1_full.yaml

 

*주의 : cert-manager 관련 오브젝트들이 다 설치되었는지 확인하고 실행하시기 바랍니다. 만약 생성되기전에 위 명령어를 실행하면 에러가 발생합니다.

 

이렇게 하면 k8s 클러스터에 ingress를 위한 alb controller를 설치하였습니다.

 

그럼 간단히 외부에 통신할 수 있는 간단하게 nginx를 배포해보겠습니다.

deployment -> service -> ingress 순으로 진행합니다. 반드시 선행 오브젝트가 제대로 생성되고 실행되는지 확인하고 다음 오브젝트를 생성하시기 바랍니다. 안그러면 에러가 발생합니다.

 

Deployment

$ kubectl apply -f nginx-deployment.yaml

*nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 8
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Service

$ kubectl apply -f nginx-service.yaml

*nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: "/healthy"
spec:
  selector:
     app: nginx
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80

 

Ingress

$ kubectl apply -f nginx-ingress.yaml

*nginx-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "nginx-service"
                port:
                  number: 8080

 

$ kubectl describe ingress nginx-ingress

위 명령어를 통해 ingrss가 아주 잘 생성된 걸 확인할 수 있습니다.

k8s-default-nginxing-eecf94859d-1802852978.ap-northeast-2.elb.amazonaws.com 로 접근하면 아래와 같이 외부에서 내부로 접근할 수 있습니다.

alb의 과정은 아래와 같습니다. 화살표는 잘못된 것이므로 무시합니다.

nodeport는 아래의 명령어를 통해 확인할 수 있습니다. 8080이 서비스로 가기 위한 포트이고 뒤에 32334(이미지와 다름)은 alb의 타겟그룹 포트로 nodeport입니다. 타겟그룹의 포트 번호는 뜬금없는 32334인데 alb에서 알아서 라우팅해줍니다.

 

aws eks를 이용하여 컨트롤 플레인과 데이터 플레인을 생성하였고, 외부에서 내부로 접근하게 해보았습니다. controller 같은 경우 alb 말고도 다양한 소스들이 존재합니다. 구글링해서 참고해보시길 바랍니다.

 

 

[K8S] kubeadm 이용하여 k8s Cluster 배포하기(공식문서 위주)

AWS EKS 나 GCP GKE를 이용하면 어렵지 않게 쿠버네티스 클러스터를 구축할 수 있지만 퍼블릭 클라우드를 이용하지 않고 온프레미스 환경에서 쿠버네티스 클러스터를 구축하기란 쉬운 일은 아닙니

kingofbackend.tistory.com

 

댓글
댓글쓰기 폼
공지사항
Total
248,427
Today
802
Yesterday
1,065
링크
«   2022/10   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함