aws eks (kubernetes) 사용하기

eks는 아마존에서 관리해주는 쿠버네티스이다. 마스터를 다 관리를 해주므로 사용하기만 해서 많이 편하다.

prerequisite

  • aws어카운트는 미리 만들어 두셔야 따라하실수 있습니다.
  • 가능하면 로그인 하는 유저의 secret키를 만들어 두시면 좋을거같습니다. 아래쪽 스탭을 참고해주세요

랩탑에 관련 프로그램 설치

kubectl

https://kubernetes.io/docs/tasks/tools/

k9s

https://k9scli.io/

https://k9scli.io/topics/install/

aws cli 설치

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

AWS 액세스 키 생성

setup command line

aws configure

생성한 키와 내용을 넣는다.

~/.aws/에 파일이 생성된다. 내용 확인

cat ~/.aws/config
cat ~/.aws/credentials

기본 유저 설정

여러개의 프로파일일 경우 프로파일 이름을 설정한다.

export AWS_PROFILE=Profile_Name

확인

aws help
aws command help
aws command subcommand help
aws ec2 describe-instances help

aws ec2 describe-instances  --region us-west-2 --query "Reservations[].Instances[].InstanceId"

eksctl 설치

https://eksctl.io

brew install aws-iam-authenticator
brew tap weaveworks/tap
brew install weaveworks/tap/eksctl

리눅스 윈도우 사용자는 https://eksctl.io/introduction/#installation 참고

install Argo CD CLI

brew install argocd

kubernetes cluster 생성

eksctl create cluster \
--name cluster-1 \
--version 1.18 \
--region us-west-2 \
--nodegroup-name c1-nodes \
--node-type t3.medium \
--nodes 2
  • type
    • t3.nano
    • t3.micro
    • t3.small
    • t3.medium
    • t3.large
2021-05-10 12:22:19 [ℹ]  waiting for the control plane availability...
2021-05-10 12:22:19 [✔]  saved kubeconfig as "/Users/ragon/.kube/c2-config"
2021-05-10 12:22:19 [ℹ]  no tasks
2021-05-10 12:22:19 [✔]  all EKS cluster resources for "cluster01" have been created
2021-05-10 12:22:39 [ℹ]  adding identity "arn:aws:iam::849053568:role/eksctl-cluster01-nodegroup-cluste-NodeInstanceRole-PFUE0IKTPN8T" to auth ConfigMap
2021-05-10 12:22:40 [ℹ]  nodegroup "cluster01-nodes" has 0 node(s)
2021-05-10 12:22:40 [ℹ]  waiting for at least 4 node(s) to become ready in "cluster01-nodes"

생성 확인

eksctl get cluster
ls ~/.kube/
cat ~/.kube/config

생성이 되고 나면 ~/.kube/ 폴더에 config파일이 생성이 된다. 이 정보로 kubernetes와 통신할수 있다.

apiVersion: v1
clusters:
  - cluster:
      certificate-authority-data: xxxx
    name: cluster-1
contexts:
  - context:
      cluster: cluster-1
      user: cluster-1
    name: cluster-1
kind: Config
preferences: {}
users:
  - name: cluster-1
    user:
      exec:
        apiVersion: client.authentication.k8s.io/v1alpha1
        args:
          - token
          - -i
          - cluster01
        command: aws-iam-authenticator
        env:
          - name: AWS_STS_REGIONAL_ENDPOINTS
            value: regional
          - name: AWS_DEFAULT_REGION
            value: us-west-2
          - name: AWS_PROFILE
            value: Profile_Name

이부분을 주의하자 없으면 넣어줄것.

- name: AWS_PROFILE
  value: Profile_Name

config를 이용한 생성

vi config.yml

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: cluster-in-existing-vpc
  region: us-west-2

vpc:
  subnets:
    private:
      eu-north-1a: { id: subnet-0fxxx6e0c4a6d300c }
      eu-north-1b: { id: subnet-05xxxb573695c03 }
      eu-north-1c: { id: subnet-04xxxa607393184 }

nodeGroups:
  - name: ng-1-workers
    labels: { role: workers }
    instanceType: t3.micro
    desiredCapacity: 10
    privateNetworking: true
eksctl create cluster --config-file=./config.yml --kubeconfig ~/.kube/aws-config

접속 확인

vi ~/.zshrc

export KUBECONFIG=~/.kube/config
kubectl get node

check cluster

eksctl get cluster

argocd

install

kubectl create namespace argocd
curl -o init/install_argocd.yaml https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

k apply -n argocd -f init/install_argocd.yaml

git 생성

argocd는 git으로 모든걸 관리하기때문에 git repo를 하나 만들어보자. 저는 github을 사용.

핵심은 프로그램 소스가 들어 있는 git은 따로 있고 여기서 생성한 git은 쿠버네티를 관리하기 위한 새로운 git repo이다.

install Argo CD CLI

brew install argocd

접속

kubectl port-forward svc/argocd-server -n argocd 8080:443

http://localhost:8080

비번 알아내기

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

XXXXXXXXX

admin/XXXXXXXXX 로 접속하면 된다.

cert-manager를 추가

argo ui에서 helm repo 등록 : https://charts.jetstack.io

cert-manager 를 앱으로 등록하자.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  namespace: argocd
spec:
  destination:
    name: ''
    namespace: cert-manager
    server: 'https://kubernetes.default.svc'
  source:
    path: ''
    repoURL: 'https://charts.jetstack.io'
    targetRevision: v1.3.1
    chart: cert-manager
    helm:
      parameters:
        - name: installCRDs
          value: 'true'
  project: default
  syncPolicy:
    syncOptions:
      - CreateNamespace=true

save하면 앱이 만들어지고 sync를 누르면 설치가 된다.

커맨드로 실행하려면 yml을 파일로 저장하고 다음 커맨드를 실행하자.

kubectl apply -f add-app/cert-manager.yml

repo / app 추가

  • argo용 ssh key 생성

    ssh-keygen
    > .ssh/argocd
    

  • repo 등록 private/public 키 argocd에 repo에 등록한다. 또는 커맨드로 추가 가능

    argocd repo add git@github.com:YOUR/argocd.git --ssh-private-key-path ~/.ssh/argocd
    

nginx 앱 추가

nginx앱을 하나 만들어서 배포해보자.

argocd git에 폴더를 하나 만들자

mkdir my-webserver
vi service.yml
---
apiVersion: v1
kind: Service
metadata:
  name: www
  namespace: www
  labels:
    app: www
spec:
  selector:
    app: www
  ports:
    - name: http
      port: 80
      targetPort: 80

vi deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: www
  namespace: www
  labels:
    app: www
spec:
  replicas: 1
  selector:
    matchLabels:
      app: www
  template:
    metadata:
      labels:
        app: www
    spec:
      containers:
        - name: www
          image: nginx:latest
          ports:
            - containerPort: 80

이제 커밋을 하고 argocd 화면에서 app을 추가해 주면 된다.

이제 nginx가 쿠버네티스에 디플로이된것을 화면으로 확인할수 있다.

aws alb controller (application load balance controller)

쿠버네티스를 직접 설치하고 사용할때는 ingress-nginx를 사용하였으나 eks에는 aws (alb) application load balance를 사용할수 있는 방법이 있다.

처음 고민이 aws에서 로드발란스를 세팅하는게 번거롭다는 고민이 있엇는데 그걸 aws에서 알고 있엇는지 kubernete 설정파일에 적어만 주면 자동으로 alb가 생성이 된다.

https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html

이 링크에 있는 내용을 해주면 된다. 간단하게 요약해보면

Oidc를 이용하여 인증을 체크

oidc.issuer가 있는지 체크

aws eks describe-cluster --name cluster01 --query "cluster.identity.oidc.issuer" --output text
> https://oidc.eks.us-west-2.amazonaws.com/id/55078434365FAxxx21D4C440DD

결과 나왓으므로 이걸로 다시

aws iam list-open-id-connect-providers | grep 55078434365FAxxx21D4C440DD

아무것도 안나온다. 없다는거다 그러면 생성 해줘야 한다. 있으면 생성부분을 넘어가면 된다.

  • 없으면 생성 Create IAM OIDC provider

https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html

eksctl utils associate-iam-oidc-provider \
    --region us-west-2 \
    --cluster cluster01 \
    --approve

> 2021-05-04 19:17:23 [ℹ]  eksctl version 0.45.0
> 2021-05-04 19:17:23 [ℹ]  using region us-west-2
> 2021-05-04 19:17:23 [ℹ]  IAM Open ID Connect provider is already associated with cluster "ekc-ekc-cluster-1" in "us-west-2"

내용 확인

aws iam list-open-id-connect-providers | grep 55078434365FAxxx21D4C440DD
> - Arn: arn:aws:iam::849053568:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/55078434365FAxxx21D4C440DD

내용이 나왓으므로 oidc는 만들어졌다.

Download IAM policy for the AWS Load Balancer Controller

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

Create an IAM policy called AWSLoadBalancerControllerIAMPolicy

aws iam create-policy \
 --policy-name AWSLoadBalancerControllerIAMPolicy \
 --policy-document file://iam_policy.json
Policy:
  Arn: arn:aws:iam::849053568:policy/AWSLoadBalancerControllerIAMPolicy
  AttachmentCount: 0
  CreateDate: '2021-05-10T23:28:33+00:00'
  DefaultVersionId: v1
  IsAttachable: true
  Path: /
  PermissionsBoundaryUsageCount: 0
  PolicyId: ANPA4LL7IJKQEH5RKWDGU
  PolicyName: AWSLoadBalancerControllerIAMPolicy
  UpdateDate: '2021-05-10T23:28:33+00:00'

create iam role and annotate kubernetes account named aws-load-balancer-controller in kube-system namespaces

이건 잘 안되는듯 그냥 웹에서 하는게 좋을듯 싶다.

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

이 탭을 눌러서 여기에 적힌대로 진행한다.

웹에서 마지막단계에서 arn을 복사해두자.

arn:aws:iam::4444444:role/AmazonEKSLoadBalancerControllerRole

https://github.com/kubernetes-sigs/aws-load-balancer-controller 에서 최신 릴리즈를 확인하고

git에서 폴더를 하나 만들고

mkdir aws-alb-controller

파일을 다운받는다.

curl -o v2_2_0_full.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/v2_2_0_full.yaml

파일을 수정하자. clustername만 바꿔주면된다.

파일 추가

vi aws-load-balancer-controller-service-account.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::xxxxx:role/AmazonEKSLoadBalancerControllerRole

arn을 복사해둔 내용을 여기에 적어넣는다.

aws-load-balancer-controller-service-account.yaml 도 위에서 복사해둔 내용을 추가해서 저장

커밋/푸시 하고 앱을 추가하면 쿠버네티스에 적용이 된다.

nginx app을 alb에 오픈해 보자

eksctl 기타 사용법

eksctl get nodegroup --cluster=cluster-1
# 노드 확장
eksctl scale nodegroup --cluster=cluster-1  --nodes=2 --name=c1-nodes
eksctl scale nodegroup --cluster=cluster-1  --nodes=3 --nodes-max=3 --name=c1-nodes

# eksctl scale nodegroup --cluster=<clusterName> --nodes=<desiredCount> --name=<nodegroupName> [ --nodes-min=<minSize> ] [ --nodes-max=<maxSize> ]

delete eks

eksctl delete cluster --name cluster-1 --wait
teamsmiley's profile image

teamsmiley

2021-05-25 00:00

Read more posts by this author