본문 바로가기
CICD/k8s

쿠버네티스 k8s 사용 정리(1)

by windy7271 2024. 3. 12.
728x90
반응형

쿠버네티스란 컨테이너화 된 애플리케이션을 대규모로 운영하기 위한 컨테이너 오케스트레이션(관리 툴)

클러스터는 쿠버네티스의 전체 환경, 마스터노드, 워커노드를 합한 노드의 집합

 

1. 마스터 노드: 클러스터에 핵심적인 것들 설치,, 설치해야함(scheduler, API server, Scheduler 등) eks 를 사용해서 다운 

> 워커노드 컨트롤 하는곳, 즉 여기서 명령어로 관리함

 

2.워커노드(ec2) : 실질적으로 컨테이너들이 실행하게될 노드

 

aws에서 클러스터 추가시 > 마스터노드 저절로 구성된다.  

워커노드 생성시 마스터 노드에 종속 시켜야한다.

 

 

eks로 배포하기전에 연습을 해봐야한다.

실습 환경 : play with Kubernetes

 

3대 생성 1대는 마스터노드이고, 2개는 워커 노드이다

 

마스터 노드 구성한다는 뜻.

 kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16

윈도우는 ctrl insert c 가 복사이다

 

마스터 노드  1개 설정

 

2. 마스터 노드 에서 초기화 해준다. 

 kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml

 

 

kubeadm join 에 서 토큰을 가져다가 워커노드인 2와 3에 쓰면 된다.

 

이렇게 되면 성공

 

기본 설정 끝 연결된 노드들 확인해본다. 노드2 혹은 노드 3에서 하면 마스터 노드가 아니기 때문에 에러가 난다.

다 Ready 가 나와야한다.

 

pod 생성 => 컨테이너를 만든다. nginx pod를 만든다.

 

pods 몇개 있는지 확인

 

get pode -A : 모든 pods 보기

 

get pods -A -o wide : 자세하게 보기

 

 

마스터 노드에서 nginx 실행 명령어 => 특정 로직에 의해 마스터 노드에 실행할 워커노드 지정 및 컨테이너 실행 (알아서 라우팅까지)

 

 

마스터 노드에 nginx pods 하나 설치 후 실행 확인.

kubectl run nginx --image=nginx --port=80 --restart=Never

 

 

running 중 됐다.

 

Namespace를 설정해주지 않으면 default로 들어간다.

 

Namespane 지정 해보기

kubectl create namespace test-namespace

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: test-namespace  # 네임스페이스 지정시, 여기에 지정
  labels:
    app: nginx
spec: 
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    
#spec: 요소들 지정

 

test-namespace 생성

test-namespace 생성

 

yml를 적용 해줘야한다.  pod가 생성이 된다. 

kubectl apply -f 파일명.yml

 

그러면 test-namespace에 생기게 된다. 

 

지우는 방법 1.

yml파일로 만들어진 파일을 알아서 찾아서 삭제해준다.

 

2. pod이름과 스페이스 이름을 직접 써야한다.

kubectl delete pod nginx-pod -n test-namespace

 

curl 명령으로 호출을 하지만 port가 닫혀있어서 안된다.

 

port를 열어줘야한다.

service 생성 

 

test할시 

curl ip:nodePort => 해줘야지 nginx 화면이 출력된다.

 

 

node3으로 잡혀있다. 그럼 노드 3 ip로 접속해본다.

 

nginx가 나온다.

 

web -> service -> pods라고 생각하면 된다.

하지만 service가 물리적으로 서버로 직접 띄어있는게 아니라. service에서 nginx에 label 이름을  selector로 등록을 해 놓으면

ip를 직접 호출해 주었을때. 포트가 열려있어 nginx에 들어갈 수 있는것이다.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30007
  selector:
    app: nginx

 

selector에서 app 을 nginx로 설정을 해놔서 80 80 을 열어준다.

 

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector: # 참조하겠다.
    matchLabels:
      app: my-nginx 
  template: # 파트의 정보
    metadata:
      labels:
        app: my-nginx # 이름을 맞춰 줘야함
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

이렇게 이름을 my-nginx로 바꿔주면 service에서selector이름도 바꿔줘야한다.

deployment를 통해 pods를 만든다. >> pod 파일이 따로 필요없다

get pods 하면 2개가 나온다.

 

둘 다 ip를 날려보면 잘 나온다.

 

replicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

ReplicaSet는 지정된 수의 파드 복제본이 항상 실행되도록 보장해주는 k8s의 리소스이다.

실행해주면

이렇게 나온다.

 

 

진짜 eks로 실습하기

eks 설정

- 마스터노드에 연결완료.

aws eks update-kubeconfig --region ap-northeast-2 --name 6team_cluster

 

으로 work노드를 2개 만들어 줬다.

 

확인해보면 2개가 만들어 져있다.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: boseok-nginx-depl
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: boseok-nginx 
  template: 
    metadata:
      labels:
        app: boseok-nginx 
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

 

apply해주면 내꺼 포함 팀원들꺼까지 들어온다.

 

인바운드를 추가해줘야지 ec2에서 접근이 가능하다.

 

 

loadbalancer 

- http 만

apiVersion: v1
kind: Service
metadata:
  name: boseok-nginx-service
spec:
  type: LoadBalancer
  ports:
  -name: http
  - port: 80
    targetPort: 80
  selector:
    app: boseok-nginx # depl의 label과 싱크가 같다.

# loadbalancer 와 ,targetGroup을 만들어준다.
# 만들어지고 나서 loadbalancer 의 dns를 호출해야한다.

 

실행하면 로드밸런서와, 대상그룹을 잡아준다. 바로 접속이 가능하다.

 

- https + http 설정

apiVersion: v1
kind: Service
metadata:
  name: boseok-nginx-service
  annotations:  # 인증서 주소
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: # < 인증서arn (고유주소) >
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 80
  selector:
    app: boseok-nginx

# loadbalancer 와 ,targetGroup을 만들어준다.
# 만들어지고 나서 loadbalancer 의 dns를 호출해야한다.

 

반응형

댓글