쿠버네티스 (3) - 서비스 (+ 인그레스)

Seong·2023년 1월 28일
0

쿠버네티스

목록 보기
3/6

Pod는 다수의 워커 노드와 동적인 IP를 가지고 있어서 네트워크에 노출 시키는데 제한이있다.
따라서 쿠버네티스에서는 파드가 외부와 통신할 수 있도록 단일한 진입점을 부여하는 Service를 사용해야한다.

노드 포트(Node Port)

#평범한 Deplyment 배포용
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  labels:
    app: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deploy-nginx
  template:
    metadata:
      labels:
        app: deploy-nginx 
    spec:
      containers:
      - name: nginx
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: np-nginx 
spec:
  selector:
    app: deploy-nginx  
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 30000 #수동으로 할땐 30000~32767 사이 안넣으면 랜덤
  type: NodePort


NodePort는 특정 Port를 Open하여 외부에서 클러스터내의 파드에 접근할수 있게 해준다.

어느 워커노드로 들어가더라도 Service에서 판단해서 파드로 보내준다.
간단하게 외부에 오픈이 가능하지만, 결국 워커노드를 Open하는것이기때문에 보안상의 문제로 자주 사용하진 않는다.

주로 서비스로 ClusterIP화한뒤 로드밸런서로 로드밸런싱을하는 방식으로 노출을 한다

로드 밸런서(LoadBalancer)

(커맨드로 사용하려면 expose로 사용가능)

apiVersion: v1
kind: Service
metadata:
 name: lb-nginx 
spec:
 selector:
   app: deploy-nginx  
 ports:
   - name: http
     port: 80
     targetPort: 80 
 type: LoadBalancer

이름을 바꿔서 만들경우

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-chk-ip
  labels:
    app: deploy-chk-ip
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deploy-chk-ip
  template:
    metadata:
      labels:
        app: deploy-chk-ip 
    spec:
      containers:
      - name: chk-ip
        image: sysnet4admin/chk-ip
---
apiVersion: v1
kind: Service
metadata:
  name: lb-chk-ip 
spec:
  selector:
    app: deploy-chk-ip  
  ports:
    - name: http
      port: 80
      targetPort: 80 
  type: LoadBalancer

같은 port와 targetPort를 가져도 External IP로 다르게 접근할 수 있다

클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다.

외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동으로 생성된다
(추후 metallb에대해 기술예정)

엔드포인트 임의 설정

apiVersion: v1
kind: Service
metadata:
  name: external-data
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-data
subsets:
  - addresses:
      - ip: 192.168.1.11
    ports:
      - name: http
        port: 80
  • 서비스 IP 주소
    https://kubernetes.io/ko/docs/concepts/services-networking/service/#ips-and-vips
    실제로 고정된 목적지로 라우팅되는 파드 IP 주소와 달리, 서비스 IP는 실제로 단일 호스트에서 응답하지 않는다.
    대신에, kube-proxy는 iptables (리눅스의 패킷 처리 로직)를 필요에 따라 명백하게 리다이렉션되는 가상 IP 주소를 정의하기 위해 사용한다.
    클라이언트가 VIP에 연결하면, 트래픽이 자동으로 적절한 엔드포인트로 전송된다.

클러스터IP

클러스터 Ip는 Pod와 Pod의 연결을위한 내부용 IP이다.

헤드리스(Headless)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  labels:
    app: deploy-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deploy-nginx
  template:
    metadata:
      labels:
        app: deploy-nginx 
    spec:
      containers:
      - name: nginx
        image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: hdl-nginx 
spec:
  selector:
    app: deploy-nginx  
  ports:
    - name: http
      port: 80
      targetPort: 80
  clusterIP: None

내부용 클러스터지만 IP가 없는상태,
StatefulSet과 결합하면 IP를 할당하지않고 내부에서 도메인이름으로 호출을 할 수있는 구조가 됨

인그레스(Ingrees)

MSA에 적합하게 경로에대한 정보를 제공하는 오브젝트

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ing-default
            port:
              number: 80
      - path: /hn
        pathType: Prefix
        backend:
          service:
            name: ing-hn
            port:
              number: 80
      - path: /ip
        pathType: Prefix
        backend:
          service:
            name: ing-ip
            port:
              number: 80

인그레스를 사용하려면 인그레스 컨트롤러도 설정해 줘야 한다

apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.1
  name: ingress-nginx-admission-patch
  namespace: ingress-nginx
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/component: admission-webhook
        app.kubernetes.io/instance: ingress-nginx
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
        app.kubernetes.io/version: 1.3.1
      name: ingress-nginx-admission-patch
    spec:
      containers:
      - args:
        - patch
        - --webhook-name=ingress-nginx-admission
        - --namespace=$(POD_NAMESPACE)
        - --patch-mutating=false
        - --secret-name=ingress-nginx-admission
        - --patch-failure-policy=Fail
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47
        imagePullPolicy: IfNotPresent
        name: patch
        securityContext:
          allowPrivilegeEscalation: false
      nodeSelector:
        kubernetes.io/os: linux
      restartPolicy: OnFailure
      securityContext:
        fsGroup: 2000
        runAsNonRoot: true
        runAsUser: 2000
      serviceAccountName: ingress-nginx-admission
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.1
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app.kubernetes.io/component: admission-webhook
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.1
  name: ingress-nginx-admission
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    service:
      name: ingress-nginx-controller-admission
      namespace: ingress-nginx
      path: /networking/v1/ingresses
  failurePolicy: Fail
  matchPolicy: Equivalent
  name: validate.nginx.ingress.kubernetes.io
  rules:
  - apiGroups:
    - networking.k8s.io
    apiVersions:
    - v1
    operations:
    - CREATE
    - UPDATE
    resources:
    - ingresses
  sideEffects: None

(작성중)

profile
필요할때 찾아보는 메모장

0개의 댓글

관련 채용 정보