Today I Learn - 49

이정빈·2021년 4월 28일
0

클라우드 엔지니어

목록 보기
50/53

Session Affinity

세션을 고정시켜 클라이언트가 항상 똑같은 웹/어플리케이션/파드에 접근 할 수 있도록 하는 기술.

Service - 로드 밸런서 설정

쿠버네티스의 노드에 접근하기 위해 설정해야 하지만 쿠버네티스 내에서 설정할 수 없기 때문에 이를 설치하기 위한 애드온이 필요하다.

MELTAL LB 방식

layer2 방식
layer2에서 작동한다. arp요청과 ipv4 서비스, NDP 요청과 IPv6로 서비스로 되어있다.
ethernet 네트워크만 있으면 작동한다. 라우터가 필요하지 않다.

기술적인 단점: 노드 하나에 로드 밸런서를 설치하기 때문에 많은 요청이 들어오면 성능이 떨어질 수 있다.

BGP 방식
실제 물리 라우터가 필요하다.

Service - External Name

외부를 참조해서 kubedns에 세팅한다. CNAME으로 구성이 된다.

파드(App) --> SVC(gapi) --> api.google.com/monitoring/v5

Service - Endpoint

기본적으로 서비스 명과 같은 이름의 오브젝트가 자동으로 생성.

레이블 셀렉터에 의해 선택된 파드의 목록을 가지고 있음.

Service - Ingress

Service

프록시, 로드밸런서

  • ClusterIP: 쿠버네티스 클러스터 내부 <-> 내부
  • NodePort: 쿠버네티스 클러스터 외부 노출 -> 내부
  • LoadBalancer: 쿠버네티스 클러스터 외부 노출 -> 내부
  • ExternalName: 쿠버네티스 클러스터 내부 -> 외부

ClusterIP

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80 # 서비스 포트
      targetPort: 8080 # Pod의 노출 포트
kubectl run test -it --image ghcr.io/c1t1d0s7/network-multitool --rm

> host myapp-svc.default.svc.cluster.local
> host myapp-svc.default.svc
> host myapp-svc.default
> host myapp-svc

FQDN

<SVC_NAME>.<NAMESPACE>.<RESOURCE_TYPE>.<DOMAIN>
  • RESOURCE_TYPE: svc
  • DOMAIN: cluster.local

Service - 멀티포트

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8443

Service - 세션 어피니티(Session Affinity)

클라이언트의 세션 고정

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-ses
spec:
  sessionAffinity: ClientIP
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

/etc/resolv.conf

nameserver 169.254.25.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
  • nameserver: DNS 서버
    • 169.254.25.10 -> (nodelocaldns : DNS Cache Server)
      • Client -> nodelocaldns -> coredns
      • nodelocaldns 구성이 없으면 kube-system에 coredns 서비스의 IP 설정

Service - Headless Service

파드의 IP가 리턴됨

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-headless
spec:
  clusterIP: None
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
host myapp-svc-headless
myapp-svc-headless.default.svc.cluster.local has address 10.233.84.68
myapp-svc-headless.default.svc.cluster.local has address 10.233.120.26
myapp-svc-headless.default.svc.cluster.local has address 10.233.94.45

StatefulSet 컨트롤러 + Headless Service 같이 사용.

​ 파드마다 FQDN 부여


Service - NodePort

30000-32767

ClusterIP + NodePort

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-nodeport
spec:
  type: NodePort
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

MetalLB 추가 구성

https://metallb.universe.tf/

MetalLB 작동 모드

  • L2: L2 Ethrenet 네트워크 만 있으면 작동 (라우터 X)

  • BGP: 라우터 필요

vi ~/kubespray/inventory/mycluster/group_vars/k8s-cluster/addons.yml
metallb_enabled: true
metallb_ip_range:
  - "192.168.201.200-192.168.201.220"
metallb_protocol: "layer2"
vi ~/kubespray/inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.ym
kube_proxy_strict_arp: true
ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
kubectl get ns
kubectl get all -n metallb-system

Service - LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-lb
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Service - ExternalName

파드(App) --> SVC(gapi) --> api.google.com/monitoring/v5

apiVersion: v1
kind: Service
metadata:
  name: gping
spec:
  type: ExternalName
  externalName: www.google.com

# gping.default.svc.cluster.local
# -CNAME-> www.google.com

Service - Endpoint

기본적으로 서비스 명과 같은 이름의 오브젝트가 자동으로 생성됨.

레이블 셀렉터에의해 선택된 파드의 목록 가지고 있음.


Ingress

https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/

Nginx Ingress Controller 설치

vi ~/kubespray/inventory/mycluster/group_vars/k8s-cluster/addons.yml
ingress_nginx_enabled: true
ansible-playbook -i inventory/mycluster/inventory.ini cluster.yml -b
kubectl get ns
kubectl get all -n ingress-nginx

Ingress 리소스

---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: myapp-ing
spec:
  rules:
  #http://www.example.com -> myapp-svc:80
  - host: www.example.com
    http:
      paths:
      - path: / 
        backend:
          serviceName: myapp-svc
          servicePort: 80
### a.exam.com
### b.exam.com
### c.exam.com/help
### c.exam.com/qna
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: ghcr.io/c1t1d0s7/go-myweb
        ports:
        - containerPort: 8080

Ingress 테스트

방법1: /etc/hosts를 수정
192.168.201.21 www.example.com

C:\Windows\System32\drivers\etc\hosts

방법2: curl -resolv
curl http://www.example.com --resolv www.example.com:80:192.168.201.23 -v

4/27 숙제

MySQL DB 파드에 서비스 생성하여 mysql 클라이언트 도구로 접근

apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: qwer1234
    ports:
    - containerPort: 3306
      protocol: TCP
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
kubectl run test -it --image ghcr.io/c1t1d0s7/network-multitool --rm
profile
WAS Engineer, Cloud Engineer(지망)

0개의 댓글