1. NodePort란
지난 게시글에서 service(clusterIP)에 대해 확인해봤습니다.
ClusterIP를 통해서 어떤 노드(서버)에 있더라도 pod과 pod끼리 통신을 시킬수 있었습니다.
즉 api서버와 db서버를 통신시킬수 있게됐었습니다.
그러나 clusterIP의 특성상 하나의 쿠버네티스 클러스터 안에서만 통신이 가능하다는 단점이 있었습니다.
이제 pod을 외부에 공개시킬 순서입니다.
2. deployment를 생성하여 pod를 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy
spec:
replicas: 2
selector:
matchLabels:
app: myHelloWorld
template:
metadata:
labels:
app: myHelloWorld
spec:
containers:
- name: myapp
image: jaeho310/helloworld:1
ports:
- containerPort: 8080
protocol: TCP
deployment 게시글에서 사용한 deployment를 재활용합니다.
3. service(nodePort) 생성
apiVersion: v1
kind: Service
metadata:
name: mynp
spec:
type: NodePort # type을 적지않으면 default는 clusterip이므로 꼭 적어줍니다.
ports:
- port: 80 # 서비스가 사용할 포트
targetPort: 8080 #서비스가 포워드할 컨테이너포트
nodePort: 31212 # 서비스의 노드포트(적지않으면 30000~32768중 자동할당)
selector:
app: myHelloWorld # app=MyHelloworld인 모든 pod는 이 서비스에 속한다.
clusterip와 다른점은 type을 nodeport로 해준점(default는 ClusterIP)입니다.
nodeport를 설정해주지않으면 3만번대에서 자동 할당하지만 중요한 부분이니 적었습니다.
이 서비스를 클러스터에 올리면 외부(웹브라우저)에서 쿠버네티스ip:31212 에 접근하면 pod에 접근할 수 있습니다.
4. 동작확인
nodeport를 생성해줍니다.
$ kubectl apply -f mynodeport.yaml
service/mynp created
service를 확인합니다.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
mynp NodePort 10.109.53.237 <none> 80:31212/TCP 8s
type이 nodeport인 resource가 하나 올라와있습니다.
노드포트는 클러스터 ip의 기능을 포함합니다.
이제 쿠버네티스 클러스터에 할당된 ip의 31212포트에 접근하면 pod에 접근할 수 있습니다.
$ kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.49.2:8443 3d
mynp 172.17.0.2:8080,172.17.0.4:8080 111s
$ minikube service mynp
|-----------|------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------|-------------|---------------------------|
| default | mynp | 80 | http://192.168.49.2:31212 |
|-----------|------|-------------|---------------------------|
🏃 mynp 서비스의 터널을 시작하는 중
|-----------|------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------|-------------|------------------------|
| default | mynp | | http://127.0.0.1:58836 |
|-----------|------|-------------|------------------------|
🎉 Opening service default/mynp in default browser...
❗ Because you are using a Docker driver on windows, the terminal needs to be open to run it.
kubectl get ep를 입력해 endpoint를 확인하면 쿠버네티스의 ip를 확인할 수 있습니다.
실제로 pc에 랜처, kubeadm등을 이용해 쿠버네티스를 깔았고, 공유기를 열고 포트프록시 설정을 해줬다면 쿠버네티스 ip를 진짜 외부에서 접근할 수 있겠지만
예제를 위한 클러스터인 minikube나 wsl2를 사용하고있으므로 웹 브라우저에서 접근하려면 다른 복잡한 방법을 사용해야합니다.
대신 minikube에 좋은 명령어가 있습니다.
minikube service [nodeport이름]
해당명령어를 입력하면 192.168.49.2:31212를 자동으로 프록시해서 접근해줍니다.
내 웹 브라우저에서 내 웹 애플리케이션에 성공적으로 접근한것을 확인 할 수 있습니다.
'kubernetes' 카테고리의 다른 글
[kubernetes] 쿠버네티스 인증, 인가(rbac) (0) | 2021.07.14 |
---|---|
[kubernetes] 쿠버네티스(kubernetes) cronjob 이란 (0) | 2021.07.14 |
[kubernetes] 쿠버네티스(kubernetes) service(clusterip)란 (0) | 2021.06.22 |
[kubernetes] 쿠버네티스(kubernetes) 디플로이먼트(deployment)란 (0) | 2021.06.21 |
[kubernetes] 쿠버네티스(kubernetes) 레플리카셋(replicaset)이란 (0) | 2021.06.21 |
댓글