Ingress, Volume

인프런 - 초보를 위한 쿠버네티스 안내서 수강 중

Ingress

Ingress란? 각 서비스를 생성하고 접근할 때 고유 포트를 입력해주어야 하는데 서비스가 늘어날수록 관리가 어려워진다. Ingress는 서비스 포트를 적지 않고 경로로 접근이 가능하도록 해준다

microk8s Ingress 활성화

microk8s enable ingress

Ingress 컨트롤러 확인

kubectl get pods -A | grep ingress

Ingress 동작 순서

  1. Ingress ControolerAPI 서버에서 Ingress 변화 감시
  2. Ingress Controoler가 설정 파일을 보고 Nginx의 설정 변경
  3. 프로세스 재시작

예제 코드

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
spec:
  rules:
    - host: nginx.192.168.64.5.sslip.io
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  number: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: echo
          image: nginx:latest

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - port: 80
      protocol: TCP
  selector:
    app: nginx
  • sslip를 사용해서 동일 IP, 동일 포트라도 다른 파드를 실행 시킬 수 있음
  • nginx.192.168.64.5.sslip.io: 해당 주소로

Volume

볼륨은 파드의 일부분으로 정의되며 파드와 동일한 라이프사이클을 갖는 디스크 스토리지이다.

만들었던 컨테이너들은 파드를 제거하면 내부에 저장된 데이터가 모두 사라지게 된다. 예를들어 워드프레스 컨테이너에서 데이터베이스에 따로 저장을 하지 않는다면 컨테이너 삭제시 데이터가 모두 사라진다.

볼륨을 이용하면 컨테이너 디렉토리를 외부 저장소와 연결해 문제점을 해결할 수 있다

empty-dir

파드 안의 컨테이너 간 동일 디렉토리를 공유할 때 사용

예제 코드

apiVersion: v1
kind: Pod
metadata:
  name: sidecar
spec:
  containers:
    - name: app
      image: busybox
      args:
        - /bin/sh
        - -c
        - >
          while true;
          do
            echo "$(date)\n" >> /var/log/example.log;
            sleep 1;
          done
      volumeMounts:
        - name: varlog
          mountPath: /var/log
    - name: sidecar
      image: busybox
      args: [/bin/sh, -c, "tail -f /var/log/example.log"]
      volumeMounts:
        - name: varlog
          mountPath: /var/log
  volumes:
    - name: varlog
      emptyDir: {}
  • appsidebar에서 경로를 varlog 이름으로 공유
  • appvarlog 경로에 있는 example.log 파일에 1초마다 시간 로그 생성
  • sidebarvarlog 경로에 있는 example.log 파일의 로그를 읽음

hostpath

컨테이너 디렉토리를 외부(호스트) 디렉토리와 연결을 할 떄 사용

apiVersion: v1
kind: Pod
metadata:
  name: host-log
spec:
  containers:
    - name: log
      image: busybox
      args: ["/bin/sh", "-c", "sleep infinity"]
      volumeMounts:
        - name: varlog
          mountPath: /host/var/log
  volumes:
    - name: varlog
      hostPath:
        path: /var/log
  • log 컨테이너는 sleep inifinity로 연결을 유지하는 역할만 함
  • log 컨테이너와 외부 호스트는 경로를 varlog 이름으로 공유
  • log 컨테이너에서 호스트에 저장되어 있던 로그 확인 가능

[참조] 인프런 - 초보를 위한 쿠버네티스 안내서

끝!