7.25

w0nyyy·2022년 7월 25일
0

쿠버네티스

워커노드 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

이미지 업로드 확인

EKS

클러스터 세팅

클러스터 생성 클릭. -> 쿠버네티스 틀을 생성한 것. 제어플레인을 생성함과 동시에 안에 노드 그룹에서 워커 노드들을 생성할 수 있음
제어 플레인 : 마스터 노드
*이미 생성된 마스터 노드에 접근해서 사용할 수 있음. 내부에서 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 연결

직접 컨테이너와 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가 생성된 워커노드 접근

configmap

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 적용

rds, deployment

mysql rds로 꾸밀것,. wordpress deployment로 꾸며볼것

pv, efs 로 연결

rds

데이터베이스 생성 - 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 서비스 연결 완료

브라우저 접속 후 세션 풀림 발생

리소스 정리

체크 해제하기 스냅샷

0개의 댓글