Infra/Kubernetes

kubernetes 7

서머스 2022. 7. 21. 17:41

# vi pod-nodename.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename-metadata
  labels:
    app: pod-nodename-labels
spec:
  containers:
  - name: pod-nodename-containers
    image: nginx
    ports:
    - containerPort: 80
  nodeName: worker1
---
apiVersion: v1
kind: Service
metadata:
  name: pod-nodename-service
spec:
  type: NodePort
  selector:
    app: pod-nodename-labels #라벨과 셀렉터는 같아야 한다.
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

node1에 배치된다.

 

[root@master1 test]# kubectl label node worker2 app=dev
node/worker2 labeled

레이블이 생겼다.

 

 

# vi pod-nodeselector.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector-metadata-app
  labels:
    app: pod-nodeselector-labels
spec:
  containers:
  - name: pod-nodeselector-containers
    image: nginx
  ports:
    - containerPort: 80
  nodeSelector:
    app: dev
---
apiVersion: v1
kind: Service
metadata:
  name: pod-nodeselector-service
spec:
  type: NodePort
  selector:
    app: pod-nodeselector-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

 

 

apply 후

worker2에 배치되게 된다.

 

[root@master1 test]# kubectl get node --show-label

 

master 노드는 pod가 운영되지 않도록 설정되어 있다.

 

 

[root@master1 test]# kubectl taint node worker1 tiger=cat:NoSchedule
node/worker1 tainted
[root@master1 test]# kubectl taint node worker2 tiger=cat:NoSchedule
node/worker2 tainted

설정되었다.

 

create는 되지만 pending상태로 유지가 된다.

두 개의 노드 모두 taint 상태이기 때문이다.

 

 

# vi pod-taint.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-taint-metadata
  labels:
    app: pod-taint-labels
spec:
  containers:
  - name: pod-taint-containers
    image: nginx
    ports:
    - containerPort: 80
  tolerations:
  - key: "tiger"
    operator: "Equal"
    value: "cat"
    effect: "NoSchedule"
---
apiVersion: v1
kind: Service
metadata:
  name: pod-taint-service
spec:
  type: NodePort
  selector:
    app: pod-taint-labels
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
~

 

[root@master1 test]# kubectl apply -f pod-taint.yaml

 

 

EKS

Kubernetes 제어 플레인을 설치하고 운영할 필요 없이 AWS에서 kubernetes를 손쉽게 실행하도록 하는 관리형 서비스

Architecture of EKS

ECR; Elastic Container Registry

 

User Data

#!/bin/bash
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

* amazon-linux-extras == yum, dnf

* completion = 자동완성, 도커의 명령어를 자동완성 시켜준다.

 

 

 

인스턴스를 생성한다.

 

Route53에서 docker.~레코드에 docker의 public ip를 넣는다.

 

인스턴스에 CLI로 접속 후 docker가 잘 설치되었는지 확인해 본다.

 

docker run -d -p 80:80 --name=test-site hyun141/web-site:v2.0

이미지 확인 후, 접속해 본다.

이미지가 잘 설치되었다.

 

Docker 전용 IAM 생성

 

web ui 접근, CLI로 접근하기 위해 둘 다 체크한다.

 

.csv 파일을 다운로드 받아 둔다.

 

 

역할 생성

s3 full access에 대해 체크한다.

 

Role name 설정 후 생성한다.

 

S3 탭으로 간다.

[Create bucket] 생성

버킷을 생성한다. 

public으로 설정하지 않는다.

 

aws configure를 하여 아까 만들었던 IAM을 입력한다.

* output format은 json으로 입력해야 한다.

 

 

이러한 자격 증명은 .aws 디렉터리에 보관되어 있다.

.aws를 지우면 접속이 안된다.

 

configure 없이 ec2-user가 접근 가능하게 하도록 인스턴스에 IAM 역할을 준다.

 

아까 만들었던 IAM role을 추가한다.

 

다시 하면 접근 가능해진다.

 

 

 

Amazon ECR - ECR의 repository로 들어간다.

상단에 public 탭으로 들어간 뒤, [Create repository] 클릭

[Create Repository] 클릭

 

 

방금 만든 repo 선택 후 [View push commands] 클릭

자격 증명이 필요하다.

 

다시 aws configure 한 후,

1번 명령어를 복붙한다.

 

 

들어가 보면 업로드 되어 있다.

 

루트 계정에서새로운 Role을 만든다.

Use case를 EKS로 설정한다.

생성한다.

 

docker2로 firefox에서 로그인한다.

 

아까 만든 클러스터 서비스 role을 추가한다.

 

서브넷들에 노드들이 들어가게 된다.

서브넷은 public 2a, 2c로

보안 그룹은 MY-SG-WEB

kubectl 설치 - Amazon EKS

 

kubectl 설치 - Amazon EKS

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

docs.aws.amazon.com

curl -o kubectl.sha256 https://s3.us-west-2.amazonaws.com/amazon-eks/1.19.6/2021-01-05/bin/linux/amd64/kubectl.sha256
chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> ~/.bashrc

nodegroup 역할 만들기

AmazonEKSWorkerNodePolicy

AmazonEC2ContainerRegistryReadOnly

AmazonEKS_CNI_Policy

3개 추가한다.

 

 

 

 

나와서 EC2를 보면 인스턴스가 두개 더 생성되어 있는 것을 볼 수 있다.

 

 

worker 노드 2개가 추가되었다.

 

내가 만든 cluster ip에 expose한다.

 

worker2 에서 curl해 보면 잘나온다.

 

[ec2-user@ip-10-29-45-159 workspace]$ kubectl expose pod nginx-pod --name nodeport --type NodePort --port 80
service/nodeport exposed
[ec2-user@ip-10-29-45-159 workspace]$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
clusterip    ClusterIP   172.20.191.253   <none>        80/TCP         4m28s
kubernetes   ClusterIP   172.20.0.1       <none>        443/TCP        98m
nodeport     NodePort    172.20.167.227   <none>        80:32688/TCP   6s

expose 한번 더 하기

worker1의 이더넷 아이피 확인

worker2에서 curl 된다.

 

 

worker1 - 두번째 SG 클릭한다.

인바운드 규칙을 편집한다.

 

worker1의 ip:포트번호 

하면 접속된다.

curl로 하면 접속 x - 접속하려면 보안그룹을 Anywhere로 바꿔야 한다.

 

퍼블릭 ip = 이더넷 ip와 동일하다.

따라서 포트 번호를 붙이면 public으로 들어가질 수 있다.

private는 같은 네트워크 안에서 접속 가능하다. - 보안그룹에서 막으면 접속되지 않게 된다.

 

master에서 worker1의 ip를 8080포트로 expose 한다.

loadBalancer 생성

 

SG에서 80번 포트 추가한다.(8080은 안해도 됨)

 

 

vi dd.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-web
  labels:
    app: nginx-pod
spec:
  containers:
  - name: nginx-pod-container
    image: public.ecr.aws/m3u5u7i4/web-site:v1.0]
---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-service-pod
spec:
  type: LoadBalancer
  # externalIPs:
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

이미지는 아까 만든 ECR의 이미지를 활용했다.

 

접속 된다.

 

리소스 삭제하기

EKS - 노드 그룹 삭제

 

인스턴스 종료

 

LB 삭제

 

EKS Cluster 삭제한다.

 

S3 버킷 삭제

 

Route 53 - Hosted zone에서

NS, SOA, CNAME을 제외하고 다 delete 한다.

 

ECR에서 repo 지운다.