[클라우드/K8S 기본(10) -Ingress, MetalLB, Calico 실습(1)(kia,sk)]

SooYeon Yeon·2022년 9월 14일
0

클라우드 K8S

목록 보기
12/18

실습

실습 환경

  • 사용자가 211.183.3.100/shop으로 접속한다고 하면, metalLB를 통해(211.183.3.201)로 들어오고, ingress-controller에서 LB서비스를 요청하기 때문에 ingress-controller로 넘어간다.(nginx). 그리고 여기서 ingress로 넘어가서 ingress에서 /, /shop에 따라 Calico로 묶인 노드들의 ex) shop 30002포트로 들어간다. 해당 노드의 포트로 들어와서, 서비스 “NodePort”(80)으로 들어오게 되고, 여기서 Pod의 포트(80)으로 들어가게 된다.

선결조건

  • metallb가 준비된 상태여야한다. on-premise 환경에서 사용하기 어려운 service type LoadBalancer를 포드 형태로 제공할 수 있는 방법
  • 각 LB 별로 필요한 구성값을 추가하여 배포해야 한다.
  • 생성된 포드에 볼륨을 연결할 계획이므로 master에 nfs 서버가 구축되어 있어야 한다.

(상태 확인, 마운트 가능여부 확인을 위해, node에서 showmount -e 211.183.3.100)

시나리오

  • 우리는 kia, sk의 서비스(서비스(nodeport/lb)), deployment, volume을 관리해주는 업체이다.
  • kia, sk는 별도의 ns, address-pool on LB, mount point

metallb 있는 지 확인

kubectl get ns
kubectl get pod -n metallb-system

nfs 동작 확인

systemctl status nfs-server | grep Active
mkdir /kia /sk
chmod 777 /sk -R
chmod 777 /kia -R
vi /etc/exports
/kia 211.183.3.0/24(rw,no_root_squash,sync)
/sk 211.183.3.0/24(rw,no_root_squash,sync)
systemctl restart nfs-server

worker에서 확인

showmount -e 211.183.3.100

kubectl api-resource | grep Namespace 로 버전 확인 가능

  1. namespace 생성

명령으로 할거면→ kubectl create ns sk ; kubectl create ns kia

yaml로 할거면

apiVersion: v1
kind: Namespace
metadata:
  name: kia
kubectl apply -f kia-ns.yaml
kubectl get ns | grep kia
apiVersion: v1
kind: Namespace
metadata:
  name: sk
kubectl apply -f sk-ns.yaml
kubectl get ns | grep sk
  1. metallb를 이용하여 사용하게 될 LB 주소 대역 지정

default : 211.183.3.201 - 211.183.3.210

kia : 211.183.3.211 - 211.183.3.220

sk : 211.183.3.221 - 211.183.3.230

metallb + configmap

lb-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: | # 이게 없다면 그대로 찍어내지 못하게 됨i
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 211.183.3.201-211.183.3.210
    - name: kia
      protocol: layer2
      addresses:
      - 211.183.3.211-211.183.3.220
    - name: sk
      protocol: layer2
      addresses:
      - 211.183.3.221-211.183.3.230
  • 배포
root@manager:~/k8slab/lab1# kubectl apply -f lb-config.yaml
configmap/config created
  1. 각 회사별 deploy-svc 생성/배포하기

참고 : https://metallb.universe.tf/usage/

kia deploy-svc생성 및 배포

kia-deploy-svc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kia
  name: kia-deploy
spec:                   # RS
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: kia
  template:         # POD
    metadata:
      labels:
        app: kia
    spec:           # container
      containers:
      - name: kia-nginx
        image: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: kia
  name: kia-lb
  annotations:
    metallb.universe.tf/address-pool: kia
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: kia
  type: LoadBalancer
  • 배포
root@manager:~/k8slab/lab1# kubectl apply -f kia-deploy-svc.yaml
deployment.apps/kia-deploy created
  • 확인
root@manager:~/k8slab/lab1# kubectl get pod,svc -n kia
NAME                              READY   STATUS    RESTARTS   AGE
pod/kia-deploy-5fcb8b68db-jll9t   1/1     Running   0          46s
pod/kia-deploy-5fcb8b68db-mph28   1/1     Running   0          46s
pod/kia-deploy-5fcb8b68db-rdj9d   1/1     Running   0          46s

NAME             TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
service/kia-lb   LoadBalancer   10.110.41.95   211.183.3.211   80:31261/TCP   46s

sk deploy-svc 생성 및 배포

sk-deploy-svc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: sk
  name: sk-deploy
spec:                   # RS
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: sk
  template:         # POD
    metadata:
      labels:
        app: sk
    spec:           # container
      containers:
      - name: sk-nginx
        image: httpd
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: sk
  name: sk-lb
  annotations:
    metallb.universe.tf/address-pool: sk
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: sk
  type: LoadBalancer
  • 배포하기
root@manager:~/k8slab/lab1# kubectl apply -f sk-deploy-svc.yaml
deployment.apps/sk-deploy created
  • pod, svc 확인
root@manager:~/k8slab/lab1# kubectl get pod,svc -n sk
NAME                             READY   STATUS    RESTARTS   AGE
pod/sk-deploy-848bb96648-2l9mx   1/1     Running   0          39s
pod/sk-deploy-848bb96648-4gbm4   1/1     Running   0          39s
pod/sk-deploy-848bb96648-ff44z   1/1     Running   0          39s

NAME            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
service/sk-lb   LoadBalancer   10.103.144.31   211.183.3.221   80:30256/TCP   39s

  1. deploy 배포 시 kia와 sk의 모든 pod는 각 pod의 /test 디렉토리를 각각 nfs 서버의 /kia, /sk와 마운트 되어야 한다.
root@manager:~/k8slab/lab1# touch /kia/kia.txt
root@manager:~/k8slab/lab1# touch /sk/sk.txt

확인 해야 할 사항

kubectl exec [pod이름] -n [ns이름:kia,sk] -- ls /test

-n kia면 kia.txt가, -n sk면 sk.txt가 들어 있어야 한다.

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kia
  name: kia-deploy
spec:                   # RS
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: kia
  template:         # POD
    metadata:
      labels:
        app: kia
    spec:           # container
      containers:
      - name: kia-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: kia-volume
          mountPath: /test
      volumes:
      - name: kia-volume
        nfs:
          path: /kia
          server: 211.183.3.100
---
apiVersion: v1
kind: Service
metadata:
  namespace: kia
  name: kia-lb
  annotations:
    metallb.universe.tf/address-pool: kia
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: kia
  type: LoadBalancer
root@manager:~/k8slab/lab1# kubectl exec pod/kia-deploy-5dd76667dc-225s9 -n kia -- ls /test
kia.txt
  • 로드밸런서 IP 지정해서 변경 확인
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kia
  name: kia-deploy
spec:                   # RS
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      app: kia
  template:         # POD
    metadata:
      labels:
        app: kia
    spec:           # container
      containers:
      - name: kia-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: kia-volume
          mountPath: /test
      volumes:
      - name: kia-volume
        nfs:
          path: /kia
          server: 211.183.3.100
---
apiVersion: v1
kind: Service
metadata:
  namespace: kia
  name: kia-lb
  annotations:
    metallb.universe.tf/address-pool: kia
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: kia
  type: LoadBalancer
  loadBalancerIP: 211.183.3.215 #로드밸런서 IP 지정할 수도 있음
root@manager:~/k8slab/lab1# kubectl get pod,svc -n kia
NAME                              READY   STATUS    RESTARTS   AGE
pod/kia-deploy-5dd76667dc-225s9   1/1     Running   0          115m
pod/kia-deploy-5dd76667dc-f5sm8   1/1     Running   0          115m
pod/kia-deploy-5dd76667dc-sqvdn   1/1     Running   0          115m

NAME             TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
service/kia-lb   LoadBalancer   10.110.41.95   211.183.3.215   80:31261/TCP   146m

시작하면

worker부터 실행 → master 실행

kubectl get no

kubectl get pod -n kube-system (calico, api/scheduler/controller)

kubectl get pod -n metallb-system (controller, speaker)

위의 명령 실행이 되지 않는다면 현재 계정은 kubernetes 환경에 대한 SA 가 없는 상태.

0개의 댓글