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
프록시, 로드밸런서
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
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
클라이언트의 세션 고정
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-ses
spec:
sessionAffinity: ClientIP
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
nameserver 169.254.25.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
파드의 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 부여
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 작동 모드
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
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-lb
spec:
type: LoadBalancer
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
파드(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
기본적으로 서비스 명과 같은 이름의 오브젝트가 자동으로 생성됨.
레이블 셀렉터에의해 선택된 파드의 목록 가지고 있음.
https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/
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
---
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
192.168.201.21 www.example.com
C:\Windows\System32\drivers\etc\hosts
curl http://www.example.com --resolv www.example.com:80:192.168.201.23 -v
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