요구사항
kubernetes 기반 어플리케이션 개발을 할때, 로컬 개발환경 구축을 위해 minikube를 사용합니다.
이때 어플리케이션에 따라서 pod, container 내부에서 커널 파라미터를 조정해야 하는 경우가 있습니다.
여기선 TCP 커넥션과 관련된 아래 세가지 커널 파라미터를 조정할 필요가 있었습니다.
- net.ipv4.ip_local_port_range
- net.ipv4.tcp_fastopen
- net.ipv4.tcp_tw_reuse
문제 상황
커널 파라미터 조정을 위해 yaml 파일에 아래와 같이 선언하였습니다.
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
securityContext:
sysctls:
- name: net.ipv4.ip_local_port_range
value: 15000 64000
- name: net.ipv4.tcp_fastopen
value: "3"
- name: net.ipv4.tcp_tw_reuse
value: "1"
하지만 minikube 환경에 deployment 배포를 해보면 해당 옵션들의 변경이 허용되지 않는 경우가 있습니다.
> kubectl apply -f deployment.yaml
> kubectl describe pod ${podName}
...
Status: Failed
Reason: SysctlForbidden
Message: Pod forbidden sysctl: "net.ipv4.tcp_fastopen" not whitelisted
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning SysctlForbidden 27s kubelet forbidden sysctl: "net.ipv4.tcp_fastopen" not whitelisted
Normal Scheduled 27s default-scheduler Successfully assigned default/... to minikube
해결 방법
Pod 내에서 변경할 수 있는 커널 파라미터가 제한되어 있고, 어떤 것들은 minikube 클러스터 구성시에 명시적으로 허용해주어야 합니다.
> minikube start --driver=docker --extra-config="kubelet.allowed-unsafe-sysctls=net.ipv4*"
추가적으로 minikube 환경에 배포된 어플리케이션을 테스트하기 위해서는 로컬에서 접근할 수 있는 endpoint가 있어야 합니다. Service 타입을 NodePort로 배포하고, minikube의 service-node-port 파라미터를 선언해주면 일정 범위의 port가 할당되어 테스트를 쉽게 진행할 수 있습니다.
> minikube start --driver=docker --extra-config="kubelet.allowed-unsafe-sysctls=net.ipv4*" --extra-config="apiserver.service-node-port-range=32760-32767" --ports=127.0.0.1:32760-32767:32760-32767
> helm install springboot-demo
> curl localhost:$(kubectl get services -o=json |jq '.items[0].spec.ports[0].nodePort')/actuator/health/liveness
참고
'kubernetes' 카테고리의 다른 글
docker-machine, virtualbox 로 docker cli 환경 구성 (Docker Desktop 유료화, host only network, x509: certificate) (0) | 2022.01.24 |
---|---|
jib 사용시 jvm 옵션을 동적으로 설정하는 방법 (3) | 2021.07.27 |
Kubernetes 환경에서의 spring boot 개발 workflow 익히기 (0) | 2020.09.08 |