Infra/Kubernetes

kubernetes 9

서머스 2022. 7. 25. 09:53

인스턴스를 생성한다.

사용자 데이터

#!/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
usermod -a -G docker ec2-user
docker run -d -p 80:80 --name=test-site halilinux/web-site:v2.0

 

생성되었다.

 

Route53에서 docker~ 레코드의 IP를 변경한 뒤, 접속해본다.

 

해당 도메인으로 접속했을 때, 위 사이트가 뜨면 성공!

 

ECR로 들어간다.

 

public repository를 만든다.

 

인스턴스에 터미널로 접속한다.

 

aws configure 한다.

 

내가 적격한 사용자임을 알리기 위해, push 커멘드를 복사- 붙여넣기 한다.

 

 

tag한다. public.ecr~ 은 아까 만든 web-site repo의 URI이다.

버전 이름은 blue로 하였다.

 

이미지 확인 후 push 한다.

 

그러면 repo에 blue 이미지가 올라와 있다.

 

EKS

* 루트 사용자 말고, IAM user로 로그인해서 만들어야 한다!

* Fargate를 하면 프로비저닝을 할 필요가 없으며, 사용량에 따라 비용이 발생한다.

 

 

 

subnet은 public의 2a, 2c로 한다.

 

로깅을 다 체크한 뒤, Create 한다.

 

방금 만든 EKS에 노드 그룹을 추가한다.

 

저번에 만들었던 Role을 선택한다.

이를 통해 노드 그룹에 대한 접근 권한을 부여할 수 있다.

 

t2.micro로 설정해서 요금 청구를 방지한다.

 

최소 크기 5, 최대 크기 10개로 scale in/out 할 수 있도록 한다.

 

설정 완료 후 생성한다.

새로운 Cluster를 만든다.

 

 

 

kubectl 설치 및 간결하게 하기

aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html

 

kubectl 설치 - Amazon EKS

kubectl 설치 Kubernetes는 클러스터 API 서버와 통신하기 위해 kubectl이라는 명령줄 유틸리티를 사용합니다. 많은 운영 체제 패키지 관리자에서 kubectl 이진 파일을 제공하며, 흔히 이 방법이 수동 다운

docs.aws.amazon.com

리눅스 두번째 명령어 복사 후 붙여넣기 한다.

 

$ curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.22.6/2022-03-09/bin/linux/arm64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin # 환경변수처럼 어느곳에서든 실행할 수 있도록 bin 디렉터리에 옮겨 준다.
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ kubectl version --short --client
$ kubectl get svc

홈 디렉터리에서 .bash_profile을 수정한다.

아래 두 줄을 추가한다.

 

exit 후 재접속해서

kubectl version 대신 k version만 쳐본다.

잘 실행된다.

 

 

EBS 볼륨 뭐..하기

해당 volume에 나오는 id를 복사해둔다.

 

그다음 2a az에 있는 노드 하나를 골라서 ip를 복사해둔다.

나는 맨 위에 노드의 아이디를 저장했다.

 

volume 디렉터리를 만든 뒤 aws-vol.yaml 파일을 만든다.

aws ec2 create-volume --availability-zone=ap-northeast-2a --size=1 --volume-type=gp2


apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-aws
spec:
  storageClassName: gp2
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  awsElasticBlockStore:
    fsType: ext4
    volumeID: vol-0315fe31a65d17c6d
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-aws
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
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-29-13-196.ap-northeast-2.compute.internal
  volumes:
    - name: pvc
      persistentVolumeClaim:
        claimName: pvc-aws

아까 복사한 부분을 알맞은 장소에 붙여넣기 한다.

라벨이 없어서 오류가 났다

Pod부분에 labels를 추가했다

 

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

또 오류가 나서 맨 밑에 줄에 추가했다.

 

 

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

 



바로 apply가 안되므로 기존에 만들었던 sc인 gp2를 삭제하고 다시 apply한다.

 

워드프레스 설치하기

wordpress 디렉터리를 만든 디 이 하위에 추가한다.

 

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

 

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

 

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
    - 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.56.105
  selector:
    app: wordpress-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

apply 후 확인해 본다.

 

 

LB가 생성되어있다.

리스너 탭에서 [Edit]를 클릭한다.

추가한다.

 

해당 LB의 SG를 확인한다.

이 SG의 인바운드 규칙을 추가한다.

HTTPS 443번 포트를 열어서 접속할 수 있도록 한다.

 

 

그리고 Route53 - 레코드 추가해서 LB를 추가한다.

 

 

 

그리고 해당 인스턴스로 터미널 접속한다.

폴더가 공유가 되엇지만 index.html 파일에 아무것도 없어서 Forbidden이 뜨게 된다.

 

remoteAccess 보안 그룹 클릭해서 인바운드 규칙 수정한다.

 

 

EBS에 1G짜리 볼륨을 확인해 보면 연결된 인스턴스가 보인다.

이게 Container와 연결된 볼륨이다.

 

이더넷1의 ip curl 해보면 나온다.

 

인스턴스가 사용가능상태에 있다가 pv를 하는순간 attach 되고 그 워커노드에 pod가 생성되면서 pvc가 생성되면서 연결된다.

 

 

2c에도 추가해본다.

4번째 자리 숫자가 0~15보다 큰, 16부터 시작하는 것은 2c에 존재한다.

 

aws ec2 create-volume --availability-zone=ap-northeast-2c --size=1 --volume-type=gp2

 

id 복사

 

 

 

 

그리고 인스턴스 터미널로 접속 

인터넷에서 외부 ip:30088로 접속해서 forbidden이 뜨면 맞음

 

sudo mount /dev/xvdf~~ /mnt

df -h

sudo vi /mnt/index.html

아 죽고싶다

 

회원가입 한다.

 

플러그인 - ssl 검색해서 Really Simple SSL 설치한다.

설치 후 [활성화] 클릭

 

그러면 다시 로그인 했을때 SSL 인증이 되어 자물쇠 모양이 생긴다.

 

 

 

RDS와 연결하기

 

 

생성된 RDS에 연결된 SG로 - 인바운드 규칙 편집한다.

내 컴퓨터에 설정된 IP의 범위로 설정한다.

 

Endpoint를 저장한다.

 

configmap을 작성한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-wordpress
  namespace: default
data:
  WORDPRESS_DB_HOST: database-1.cpjg0z799zyd.ap-northeast-2.rds.amazonaws.com
  WORDPRESS_DB_USER: shchoi
  WORDPRESS_DB_PASSWORD: Kosa0401!
  WORDPRESS_DB_NAME: wordpress

기존에 작성된 코드를 지우고 쓴다.

sevice deploy 하고

apply

로드밸런서 생성된거에

리스너에 ssl 추가 tcp - 인스턴스 포트는 위에꺼랑 똑같이 복붙 ssl 인증서는 맨위에꺼

 

연결된 보안그룹에서 

 

노드그룹 삭제 - 클러스터 삭제

db삭제-인스턴스 삭제

EBS에서 볼륨 삭제

 

'Infra > Kubernetes' 카테고리의 다른 글

Kafka & Redis on Kubernetes  (0) 2023.06.12
EKS로 배포하기  (0) 2022.08.04
kubernetes 8  (0) 2022.07.22
kubernetes 7  (0) 2022.07.21
kubernetes 5  (0) 2022.07.20