Kubernetes-rest-ex
쿠버네티스 내에서 REST API 통신을 실험하는 예제
- 실습 환경
- Kubernetes v1.26.3
- Calico CNI
- Spring boot v3.0.6
- jdk 17
- Docker
- Docker Hub
- 우리집
Docker Hub URL
미리 만들어둔 Spring Boot Image를 사용합니다.
- https://hub.docker.com/repository/docker/ghdcksgml1/spring-hello/general
- https://hub.docker.com/repository/docker/ghdcksgml1/spring-rest/general
Application 구조
앱 동작은 간단합니다. Rest Application이 Hello Application을 rest 요청을 한 값을 그대로 출력하는 Application입니다.
Hello Application 소스 코드 (8080포트)
@RestController
class HelloController {
@GetMapping("/")
fun getHello(): String {
return "Hello Server"
}
}
Rest Application 소스 코드 (8081포트)
@RestController
class HelloRestController(
@Value("\${rest.url}") val url: String // rest.url="http://localhost:8080/"
) {
@GetMapping("/")
fun getRest(): String {
val restTemplate = RestTemplate()
return restTemplate?.getForObject(url, String::class.java) ?: "error"
}
}
실행결과
당연히 Local에서는 잘 돈다.
이제 쿠버네티스에 배포를 해보자.
apiVersion: apps/v1
kind: Deployment # hello Application Deployment
metadata:
labels:
app: webserver
name: webserver-hello
spec:
replicas: 3
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
containers:
- image: ghdcksgml1/spring-hello
name: webserver-hello
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment # Rest Application Deployment
metadata:
labels:
app: webserver
name: webserver-rest
spec:
replicas: 3
selector:
matchLabels:
app: webserver
template:
metadata:
labels:
app: webserver
spec:
containers:
- image: ghdcksgml1/spring-rest
name: webserver-rest
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service # LoadBalancer
metadata:
labels:
app: webserver
name: webserver-svc
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
name: webserver-hello
- port: 8081
protocol: TCP
targetPort: 8081
name: webserver-rest
selector:
app: webserver
type: LoadBalancer
쿠버네티스 아키텍처는 아래와 같다.
배포해보면...
이유는?
현재 'http://localhost:8080/'을 호출하고 있습니다. 하지만, 아키텍처를 보면 각각의 deployment는 분리된 환경이기 때문에 Hello Deployment의 8080포트로 접근할 수 없는 것이지요.
그럼 접근하는 방법은?
- Service IP로 접근하기
$kubectl get svc
위 명령어를 치면 service의 cluster-ip가 존재합니다. 이걸 localhost 대신 적어주는 것이죠.
URI를 'http://10.100.36.230:8080'으로 요청하면 됩니다.
하지만, service가 삭제되면 cluster-IP가 바뀔텐데 어떻게 적용하지? 라는 의문이 생깁니다.
맞습니다. service ip대신 service-name을 입력할 수 있습니다.
'http://webserver-svc:8080/'로 요청하면 되겠죠? 이렇게되면, 서비스가 삭제되고 다시 생성되어도 rest uri를 바꾸지 않아도 됩니다.