1. Service
- Pod에 Access할 수 있는 고정 IP를 할당
- 할당한 IP와 Port에 따라 트래픽 라우팅
- selector를 기준으로 Pod에 L4 Load Balancing 기능 제공
- 고유 DNS Name 지정 가능(?)
* {service name}.{namespace name}.svc.cluster.local의 형식으로 DNS 등록
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376 <<< 외부 노출 Port
- Service Type
1) ClusterIP
- Service IP 할당의 Default Type
- K8s Cluster의 내부 IP할당 (외부에서 접근 불가)
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
sessionAffinity: ClientIP
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
- name: https
protocol: TCP
port: 443
targetPort: 9377
*sessionAffinity : Traffic 유입시 특정 컨테이너로 라우팅. 웹세션 등에 사용
2) LoadBalancer
- Private IP와 Public IP를 동시에 사용
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
clusterIP: 10.20.30.50
loadBalancerIP: 10.20.30.254
type: LoadBalancer
3) ExternalName
- API와 DB 등의 외부 서비스를 K8s Cluster 내부에서 호출할 때 사용
- 주소를 DNS Name으로 설정해주면 요청을 해당 URI로 포워딩 해준다
apiVersion: v1
kind: Service
metadata:
name: prod-mongodb
namespace: prod
spec:
type: ExternalName
externalName: mymongodb.document.azure.com
4) NodePort
- Pod의 IP와 고정 Port를 통해 외부로 노출
ex) On-Premise의 Load Balacner등의 외부 솔루션을 사용하여 라우팅을 하는 경우
apiVersion: v1
kind: Service
metadata:
name: node-svc
spec:
selector:
app: hello-node
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
nodePort: 30036
5) Headless service
- ClusterIP가 없는 Load Balancer로 DNS Name을 통해 Service에 연결된 Pod들의 IP들을 리턴하는 형식으로
Zookeeper, Etcd, Consul 등과 같은 Service Discovery를 제공한다
apiVersion: v1
kind: Service
metadata:
name: node-svc-headless
spec:
clusterIP: None
selector:
app: hello-node
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
6) ExternalIP
- Service에 고정 IP 할당
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externIPs:
- 80.11.12.13
2. Ingreess
- Service에 대한 L7 Load Balnacer로 Path와 URI를 기준으로 라우팅 제공
- L7 Layer로써 URI 별 Service 단위의 Log 수집 용이
paiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: labs-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- host:
- www.evillgenius.com
scretName: scret-tls
rules:
- host: www.evillgenius.com
http:
paths:
- path: /registration/*
backend:
serviceName: reg-svc
servicePort: 8808
- path: /labaccess/*
backend:
serviceName: labaccess-svc
servicePort: 8809
- TLS Termination에 대한 인증서 정보를 가진 Secret 선언 가능
- 지정 경로에서 Secret을 가져와서 SSL Termination 수행
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress-tls
spec:
tls:
- secretName: hello-ingress-secret
rules:
- http
paths:
- path: /users/*
backend:
serviceName: uses-node-svc
servicePort: 80
- path: /products/*
backend:
serviceName: products-node-svc
servicePort: 80
* Secret : 보안이 필요한 Configuration의 저장소
* API를 외부에 주로 제공한다면 Kong 또는 Ambassador 등의 세밀한 Ingress Controller가 좋다
* annotation : 일종의 Custom Filed로써, K8s 객체에 데이터 형식이 없는 추가적 Metadata 저장 장소이다
- 용도
1) Git Has, TimeStamp, PR Number 등 Label에 적합하지 않은 정보
2) 객체 Trace
3) 이미지의 base64 인코딩과 같은 UI Data 제공
4) Rolling Deployment에서 Roll-out 상태를 Trace하고 Rollback에 필요한 정보 제공
3.. Refernece
Kubernetes Advanced Workshop
조대협의 블로그
'System Engineering > Kubernetes' 카테고리의 다른 글
6. K8s Volume (0) | 2021.04.05 |
---|---|
5. K8s Lifecycle / Configmap (0) | 2021.04.02 |
3. K8s Controller (0) | 2021.03.25 |
2. Kubernetes Architecture (1) | 2021.02.23 |
1. 가상화와 Container의 차이 (0) | 2021.02.20 |