티스토리 뷰
How to use K8S with EKS
EKS란 AWS클라우드 환경에서 k8s를 Managed 서비스로 제공하는 서비스이다.
아래 튜토리얼을 통해 기본적인 클러스터 생성 및 어플리케이션 배포까지의 Step을 진행하였다.
Installing k8s with EKS Tools
# installing aws-cli
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
# installing eksctl
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
# installing kubectl
curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
kubectl version --short --client
Creating a EKS Cluster
EKS Cluster 생성을 위한 node(computing)의 타입, 볼륨, 노드 수 등을 지정한다.
# creating eks cluster
eksctl create cluster \
--name k8s-demo \
--region ap-northeast-2 \
--with-oidc \
--ssh-access \
--ssh-public-key rocksea-bastion \
--nodes 3 \
--node-type t3.medium \
--node-volume-size=20 \
--managed
# get .kube configuration from eks
aws eks --region ap-northeast-2 update-kubeconfig --name k8s-demo
# get cluster list
kubectl get all
Setting ConfigMap
- configmap.yaml
ConfigMap을 통해 시스템 환경변수를 등록하여 관리한다.
apiVersion: v1
kind: ConfigMap
metadata:
name: larambla-config
data:
dbHost: 'larambla.ap-northeast-2.rds.amazonaws.com'
dbPort: '3306'
dbName: 'larambla'
dbUsername: 'larambla'
dbPassword: 'larambla'
dbDdlauto: 'update'
- configmap
kubectl apply -f configmap.yaml
Creating Secrets
Password와 같은 기민한 정보는 Screts를 통해 base64 encoding을 하여 보관한다.
kubectl create secret generic spring-security \
--from-literal=spring.user.name=demo \
--from-literal=spring.user.password=password
Deploying a Application
- deployment.yaml
배포할 Pod의 Replicas(각 node에 복제 할 갯 수), Container Image, Inner Service Port 등을 지정한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: larambla-deployment
labels:
app: java-microservice
spec:
replicas: 3
selector:
matchLabels:
app: larambla-member-api
template:
metadata:
labels:
app: larambla-member-api
spec:
containers:
- name: larambla
image: xxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/larambla:latest
ports:
- containerPort: 5000
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: larambla-config
key: dbHost
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: larambla-config
key: dbPort
- name: DB_NAME
valueFrom:
configMapKeyRef:
name: larambla-config
key: dbName
- name: DB_USERNAME
valueFrom:
configMapKeyRef:
name: larambla-config
key: dbUsername
- name: DB_PASSWORD
valueFrom:
configMapKeyRef:
name: larambla-config
key: dbPassword
- name: DB_DDL_AUTO
valueFrom:
configMapKeyRef:
name: larambla-config
key: dbDdlauto
- service.yaml
배포 된 Pod에 로드밸런싱을 위한 서비스 Cluster 단위를 구성한다. 해당 서비스 생성을 통해 selector로 지정한 application이 실행중인 pod에 트래픽을 로드밸런싱을 한다.
apiVersion: v1
kind: Service
metadata:
name: larambla-service
spec:
#Creating a service of type load balancer. Load balancer gets created but takes time to reflect
type: LoadBalancer
selector:
app: larambla-member-api
ports:
- protocol: TCP
port: 80
targetPort: 5000
- EKS Command
# deploying applications
kubectl apply -f deployment.yaml
# deploying services
kubectl apply -f service.yaml
# setting auto-scale
kubectl autoscale deployment larambla-deployment --cpu-percent=50 --min=3 --max=5
Installing a Ingress Controller
- Installing ingress controller
각 서비스에 라우팅 기능을 이용하기 위해 ingress controller를 설치한다.
helm install ingress-nginx-2 ingress-nginx/ingress-nginx
--namespace ingress-nginx-2
--set controller.ingressClassResource.name=nginx-2
--set controller.ingressClassResource.controllerValue="k8s.io/ingress-nginx-2"
--set controller.ingressClassResource.enabled=true
--set controller.ingressClassByName=true
- ingress.yaml
ingress controller를 이용하여 각 서비스 라우팅 전략을 기술하고 적용한다. nginx의 reverse proxy와 같이 각 호스트의 path별 라우팅 대상 서비스를 지정 할 수 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-larambla
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: larambla.co.kr
http:
paths:
- path: /member
pathType: Prefix
backend:
service:
name: larambla-service
port:
number: 80
ingressClassName: nginx
- Creating Ingress
kubectl apply -f ingress.yaml
Installing a Dashboard
- account.yaml
Dashboard에 access 가능한 service account를 생성한다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
대쉬보드를 통해 워크로드, 노드, 서비스, 파드 등의 상태를 모니터링 및 관리할 수 있다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
kubectl apply -f user.yaml
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
Proxy를 통해 대시보드 내부에 Access 할 수 있다.
kubectl proxy
Connecting Aurora Mysql Client
Pod를 통해 Private Network의 DB에 접근도 가능하다.
kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-client -- mysql -ularambla -plarambla -hdb.ap-northeast-2.rds.amazonaws.com larambla
Adding RBAC with System Master
EKS Cluster생성 계정외에 추가로 Admin Role에 EKS접근 권한을 부여하였다.
kubectl edit -n kube-system configmap/aws-auth
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::xxxxxxxxxxxx:role/eksctl-larambla-cluster-nodegroup-NodeInstanceRole-7NCDI3TA146Z
username: system:node:{{EC2PrivateDNSName}}
**- groups:
- system:masters
rolearn: arn:aws:iam::xxxxxxxxxxxx:role/Admin
username: rocksea**
References
- AWS WORKSHOP
- Dashboard
- Installation Ingress Controller
- Deploying to EKS
- MySQL
- ArgoCD
'Developer' 카테고리의 다른 글
Configure AWS Credentials For GitHub Actions with OIDC (0) | 2022.06.05 |
---|---|
How to install Argocd (0) | 2022.04.25 |
아마존웹서비시즈코리아 Inverview 후기 (8) | 2021.10.01 |
퇴사 회고록 (0) | 2021.09.15 |
Infrastructure as Code with Terraform (0) | 2021.07.22 |
- Total
- Today
- Yesterday
- Business English
- 영문법
- hadoop
- 스페인 여행
- 영작
- 다낭
- Python Django
- 도덕경
- 해외여행
- JBOSS
- ubuntu
- 비지니스 영어
- Python
- hdfs
- 여행
- 비교구문
- mongoDB
- 가정법
- it
- 조동사
- 베트남
- k8s
- AWS
- memcached
- redis
- nodejs
- maven
- 대명사 구문
- PostgreSQL
- NGINX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |