워커노드 5개 만들것
사용자 데이터
#!/bin/bash
timedatectl set-timezone Asia/Seoul
cd /tmp
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
amazon-linux-extras install docker -y
systemctl enable --now docker
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
sudo usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site sechim052339/web-site:v2.0
route53에서 ip 도메인 등록 후 mobaxterm에 접속하면 편리하다.
ECR에서 퍼블릭 리포지토리 생성.
DOCKER 인스턴스 터미널에서 AWS CONFIGURE 진행
// aws configure 로그인 확인 명령어
aws s3 ls
ECR에서 푸시명령어 보기 클릭, 자격증명 진행
// 이미지를 업로드 하기 위해 태그 달기. (아까 사용자데이터에서 다운로드한 이미지임 )
[ec2-user@ip-10-19-13-70 ~]$ docker tag sechim052339/web-site:v2.0 public.ecr.aws/b7r5v6j2/web-site:v1.0
[ec2-user@ip-10-19-13-70 ~]$ docker push public.ecr.aws/b7r5v6j2/web-site:v1.0
이미지 업로드 확인
클러스터 생성 클릭. -> 쿠버네티스 틀을 생성한 것. 제어플레인을 생성함과 동시에 안에 노드 그룹에서 워커 노드들을 생성할 수 있음
제어 플레인 : 마스터 노드
*이미 생성된 마스터 노드에 접근해서 사용할 수 있음. 내부에서 EDIT하거나 조작할 수 없음
!!! API 접속을 위해 자격증명을 해야한다. 그러기 위해서 클러스터 이름 교수님과 똑같이 지정했음
서브넷 PUBLIC 2A,2C 지정. (프리티어이므로)
클러스터 생성 후 컴퓨팅 탭에서 노드그룹 추가 클릭
노드 IAM 역할 : 워커노드 인스턴스 생성을 위한 역할(권한)을 부여함
# EKS 작업증명. AWS cofigure가 선행되어야함. 클러스터 이름 정확히 명시해줌.
aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER
# 1.22 버전의 kubectl 설치, 구글검색창에 aws kubectl 치고 버전에 맞는 명령어 복붙
curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/amd64/kubectl
# 바이너리에 실행 권한을 적용
chmod +x ./kubectl
# 어디서나 kubectl 실행
$ sudo mv ./kubectl /usr/local/bin
# 자동완성 적용. kubectl 치트 시트 검색하면 찾을 수 있음
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
# k만 쳐도 kubectl이 실행되도록 하는 작업
vi .bash_profile
alias k=kubectl
complete -F __start_kubectl k
metallb는 퍼블릭클라우드에서 구현 불가
# aws 볼륨 생성
aws ec2 create-volume --availability-zone=ap-northeast-2a --size=1 --volume-type=gp2
생성 된 volumeId를 복사해서 아래 yaml파일에 volumeID 부분에 복붙.
$ vi aws-vol.yaml
apiVersion: v1 # PV 생성
kind: PersistentVolume
metadata:
name: pv-aws
labels:
type: local
spec:
storageClassName: gp2
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Retain
accessModes:
- ReadWriteOnce
awsElasticBlockStore:
fsType: ext4
volumeID: vol-0016556157b71d777
--- # PVC 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-aws
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
selector:
matchLabels:
type: local
--- # POD 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-aws
namespace: default
spec:
containers:
- name: test
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pvc
nodeName: ip-10-19-11-11.ap-northeast-2.compute.internal # kubectl get node에서 볼륨과 같은 az에 있는 노드를 하나 선택에 name을 복붙해준다.
volumes:
- name: pvc
persistentVolumeClaim:
claimName: pvc-aws
pending 오류남
-> VolumeBindingMode 가 immediate 여야하는데 WaitForFirstConsumer 여서 펜딩 오류가 발생
// gp2를 기본 값으로 사용하겠다는 내용
$ vi aws-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gp2
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
// 아까 생성했었던 볼륨 지우기
$ k delete sc gp2
$ k apply -f aws-sc.yaml
$ k apply -f aws-vol.yaml
$ k get pv,pvc -> Bound 확인
aws-vol.yaml pod에 label 추가 해주기
---
# 같은 파일(aws-vol.yaml) 맨 아래에 넣어주기
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-pod
spec:
type: NodePort
selector:
app: pod-aws
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
// 서비스 생성
$ k apply -f aws-vol.yaml
pod-aws를 생성한 노드에 ssh 접속한다.
30080포트를 열어준다.
lsblk를 하면 볼륨은 나오지만 df -h 하면 마운트가 안되어있음을 확인. 따라서 마운트를 해준다.
curl 10.19.11.11:30080 으로 서비스 403 forbidden 확인
$ sudo mount /dev/xvdce /mnt
$ df -h
$ sudo vi /mnt/index.html
hello world
다시 curl 10.19.11.11:30080으로 편집 확인
워커노드에 PV 생성, PVC에 EBS 마운트해서 POD 생성.
직접 컨테이너와 ebs 바로 연결하기. pv,pvc 없이
# 생성된 볼륨id 아래 volumeID 에 붙여넣기
aws ec2 create-volume --availability-zone=ap-northeast-2c --size=1 --volume-type=gp2
# vi test-ebs.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-ebs
labels:
app: test-ebs
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: test-volume
nodeName: ip-10-19-41-145.ap-northeast-2.compute.internal # 노드 지정
volumes:
- name: test-volume
# This AWS EBS volume must already exist.
awsElasticBlockStore:
volumeID: "vol-0b726ef8ca0c381b0"
fsType: ext4
---
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-pod
spec:
type: NodePort
selector:
app: test-ebs
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30088
k apply -f test-ebs.yaml
mobaxterm으로 pod가 생성된 워커노드 접근
data에 변수명과 변수값을 지정.
vi configmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-wordpress
namespace: default
data:
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: kosa0401
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
k apply -f configmap-wordpress.yaml
k describe configmaps config-wordpress
vi mysql-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql-pod
spec:
containers:
- name: mysql-container
image: mysql:5.7
envFrom: # 컨피그맵 설정 전체를 한꺼번에 불러와서 사용
- configMapRef:
name: config-wordpress
ports:
- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
type: ClusterIP
selector:
app: mysql-pod
ports:
- protocol: TCP
port: 3306
targetPort: 3306
k apply -f mysql-pod-svc.yaml
vi wordpress-pod-svc.yaml
apiVersion: v1
kind: Pod
metadata:
name: wordpress-pod
labels:
app: wordpress-pod
spec:
containers:
- name: wordpress-container
image: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql-svc:3306 # coreDNS
- name: WORDPRESS_DB_USER
valueFrom:
configMapKeyRef:
name: config-wordpress
key: MYSQL_USER
- name: WORDPRESS_DB_PASSWORD
valueFrom:
configMapKeyRef:
name: config-wordpress
key: MYSQL_PASSWORD
- name: WORDPRESS_DB_NAME
valueFrom:
configMapKeyRef:
name: config-wordpress
key: MYSQL_DATABASE
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
type: LoadBalancer
# externalIPs:
# - 192.168.2.0
selector:
app: wordpress-pod
ports:
- protocol: TCP
port: 80
targetPort: 80
리스너 편집
로드밸런서 보안그룹 443 포트 열기
워드프레스에서 ssl 플러그인 설치 후 https 적용
mysql rds로 꾸밀것,. wordpress deployment로 꾸며볼것
pv, efs 로 연결
데이터베이스 생성 - mysql 5.7.22 - 템플릿:프리티어
마스터 사용자이름: wony - 마스터 암호: kosa0401
퍼블릭 액세스: 아니오
보안그룹 생성 : MY-SG-RDS
가용영역 2b
추가구성
- 초기 데이터베이스 이름 : wordpress
로그 선택하기
보안그룹 수정
# wordpress 를 위한 configmap
vi configmap-wordpress.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-wordpress
namespace: default
data:
WORDPRESS_DB_HOST: database-1.ckxsxn5j2vga.ap-northeast-2.rds.amazonaws.com:3306
WORDPRESS_DB_USER: wony
WORDPRESS_DB_PASSWORD: kosa0401
WORDPRESS_DB_NAME: wordpress
컨피그맵 yaml
# vi wordpress-deployment-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deploy
labels:
app: wordpress-deploy
spec:
replicas: 3
selector:
matchLabels:
app: wordpress-deploy
template:
metadata:
labels:
app: wordpress-deploy
spec:
containers:
- name: wordpress-container
image: wordpress
envFrom:
- configMapRef:
name: config-wordpress
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
type: LoadBalancer
# externalIPs:
# - 192.168.2.0
selector:
app: wordpress-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
k apply -f wordpress-deployment-service.yaml
# rds와 pod 서비스 연결 완료
브라우저 접속 후 세션 풀림 발생
체크 해제하기 스냅샷