728x90
가상머신에서 로컬 클러스터를 사용했다.
Service
- 파드는 클러스터 내에서 유동적이기 때문에 새로 생길 때마다 접속 정보가 변경된다. 이에 내/외부에서 파드 접속을 안정적으로 할 수 있게 도와주는 것이 쿠버네티스에서 서비스의 역할이다.
- 파드가 생성될 때 부여되는 IP를 가지고 연결한다.
NodePort
yaml에 NodePort type 선언하기
[root@m-k8s ~]# cat _Book_k8sInfra/ch3/3.3.1/nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: np-svc
spec:
selector:
app: np-pods
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
type: NodePort
[root@m-k8s ~]# kubectl create deployment np-pods --image=sysnet4admin/echo-hname
deployment.apps/np-pods created
[root@m-k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
np-pods-5767d54d4b-dpvsn 1/1 Running 0 26s
[root@m-k8s ~]# kubectl create -f _Book_k8sInfra/ch3/3.3.1/nodeport.yaml
service/np-svc created
[root@m-k8s ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d1h
np-svc NodePort 10.111.198.27 <none> 80:30000/TCP 7s
ClusterIP
는 쿠버네티스 클러스터 내부에서 사용하는 IP로, 자동으로 지정된다.
[root@m-k8s ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d2h
np-svc NodePort 10.111.198.27 <none> 80:30000/TCP 83m
[root@m-k8s ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
m-k8s Ready master 5d1h v1.18.4 192.168.1.10 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
w1-k8s Ready <none> 5d1h v1.18.4 192.168.1.101 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
w2-k8s Ready <none> 5d1h v1.18.4 192.168.1.102 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
w3-k8s Ready <none> 5d v1.18.4 192.168.1.103 <none> CentOS Linux 7 (Core) 3.10.0-1127.19.1.el7.x86_64 docker://1.13.1
- 서비스가 외부에서 노드로 들어오는 30000포트로 접속을 받으면 내부에 80포트로 변환하여 연결해준다.
- 노드의 IP와 NodePort 서비스를 이용해 외부에서 접속할 수 있다.
expose로 노드포트 서비스 생성하기
[root@m-k8s ~]# kubectl expose deployment np-pods --type=NodePort --name=np-svc-v2 --port=80
service/np-svc-v2 exposed
[root@m-k8s ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d2h
np-svc NodePort 10.111.198.27 <none> 80:30000/TCP 83m
np-svc-v2 NodePort 10.108.254.246 <none> 80:30996/TCP 34s
- 서비스를 생성할 deployment(np-pods)에 대해 서비스의 이름을 np-svc-v2로 지정하고 내부 포트를 80으로 정한다.
- expose 명령으로 서비스를 생성하면 yaml에서 지정했던 port 중 nodePort는 30000~32767내에서 자동으로 지정되고 원하는 번호로 설정이 불가능하다.
- 서비스가 외부에서 노드로 들어오는 30996포트로 접속을 받으면 내부에 80포트로 변환하여 연결해준다.
- 외부에서 노드 IP와 노드포트 번호로 접속 가능하다.
Ingress
- 포트는 중복 사용이 안 되기 때문에 노드포트 서비스를 사용하면 포트 1개 당 하나의 deployment만 적용 가능하다.
- Ingress를 사용하여 접속 경로에 따라 다른 결과값을 제공할 수 있다.
- 트래픽에 대한 L4/L7 로드밸런서와 인증서를 처리하는 기능을 가진다.
- Ingress를 사용하기 위해서는
Ingress Controller
가 필요하다. NGINX Ingress Controller를 가장 많이 사용한다. - Ingress Controller는 파드와 직접 통신할 수 없어서 노드포트 또는 로드밸런서 서비스와 연동되어야 한다.
NGINX Ingress Controller-노드포트 서비스 작동 방식
- 사용자는 노드마다 설정된 노드포트를 통해 노드포트 서비스로 접속한다. 이때 노드포트 서비스를 NGINX Ingress Controller로 구성한다.
- NGINX Ingress Controller는 사용자의 접속 경로에 따라 적합한 클러스터 IP 서비스로 경로를 제공한다.
- 클러스터 IP 서비스는 사용자를 해당 파드로 연결해준다.
[root@m-k8s ~]# cat _Book_k8sInfra/ch3/3.3.2/ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: # 경로 규칙
backend: # 연결되는 서비스와 포트
serviceName: hname-svc-default
servicePort: 80
- path: /ip
backend:
serviceName: ip-svc
servicePort: 80
- yaml로 구성한 인그레스 설정 파일
- 들어오는 주소값과 포트에 따라 노출될 서비스를 연결시킨다.
기본 경로
로 접속하면 hname-svc-default 서비스와 연결된 파드에 80포트로 넘기고,기본 경로/ip
경로로 들어오면 ip-svc서비스와 연결된 파드의 80포트로 전달하고,기본 경로/your-directory
경로로 들어오면 your-svc 서비스에 80포트로 전달한다.
[root@m-k8s ~]# kubectl apply -f _Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx created
[root@m-k8s ~]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-5bb8fb4bb6-k5xrs 1/1 Running 0 2m28s
[root@m-k8s ~]# kubectl apply -f _Book_k8sInfra/ch3/3.3.2/ingress-config.yaml
ingress.networking.k8s.io/ingress-nginx created
[root@m-k8s ~]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-nginx <none> * 80 10m
- ingress controller를 배포하고 컨트롤러 파드가 작동하는지 확인한다.
- ingress를 배포하고 ingress가 작동하는지 확인한다.
[root@m-k8s ~]# kubectl apply -f _Book_k8sInfra/ch3/3.3.2/ingress.yaml
service/nginx-ingress-controller created
[root@m-k8s ~]# cat _Book_k8sInfra/ch3/3.3.2/ingress.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30100
- name: https
protocol: TCP
port: 443
targetPort: 443
nodePort: 30101
selector:
app.kubernetes.io/name: ingress-nginx
type: NodePort
- 외부에서 NGINX Ingress Controller에 접속할 수 있게 NodePort 서비스로 NGINX Ingress Controller를 외부에 노출한다.
- 외부에서 30100포트로 들어온 요청을 80포트로 전달하고, 30101포트로 들어온 요청을 443 포트로 전달한다.
[root@m-k8s ~]# kubectl expose deploy in-hname-pod --name=hname-svc-default --port=80,443
service/hname-svc-default exposed
[root@m-k8s ~]# kubectl expose deploy in-ip-pod --name=ip-svc --port=80,443
service/ip-svc exposed
[root@m-k8s ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller NodePort 10.100.85.40 <none> 80:30100/TCP,443:30101/TCP 11m
[root@m-k8s ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hname-svc-default ClusterIP 10.106.133.159 <none> 80/TCP,443/TCP 2m41s
ip-svc ClusterIP 10.106.15.9 <none> 80/TCP,443/TCP 101s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d3h
- nginx-ingress-controller 서비스가 외부에 노출되어있다.
- deployment 2개에 대한 서비스도 외부에 노출되어있다.
- 30100포트로 접속할 경우
- 30101포트로 접속할 경우
LoadBalancer Service
- 노드포트 방식은 복잡하여 로드밸런서를 자주 사용하는데, 이 방식은 쿠버네티스 클러스터 외부에 로드밸런서를 배치하는 방식이다.
- 로드밸런서를 제공하는 타 서비스업체와 연동하여 사용해야 한다.
728x90