M1/M2/M3 등의 Silicon 칩 기반 맥에서 K8s를 설치하는 것은 다소 어려운 작업이다.
맥은 Linux에서 제공하는 컨테이너 기술을 커널에서 직접 제공하지 않으므로 가상 머신 위에서 Linux를 설치하고 여기에 K8s를 설치하게 되는데, 바이너리 호환성이나 호스트 머신과의 네트웍 연결성에서 많은 어려움을 겪게 된다.
가장 쉬운 방법은 Docker Desktop을 유료로 구매해서 사용하는 것인데, 비용 문제가 있으므로 무료인 방법을 제시하려고 한다.
Podman이나 Colima가 Docker Dekstop의 대안이 될 수 있는데, Podman은 Desktop이 제공되므로 편리하지만 docker CLI와의 호환성 이슈가 있어서 docker를 이용한 컨테이너 빌드와 배포에는 적합하지 않다. 반면에 colima는 Desktop이 제공되지 않지만 CLI로 작업할 일이 많다면 docker CLI와의 호환성이 높고 K8s를 옵션을 이용해서 쉽게 설치할 수 있으므로 이 방법을 이용해서 K8s를 구성해보도록 하겠다.
colima도 경량 Linux VM을 설치하게 되는데, 우선 x86_64로 설치할지 아니면 arm64로 설치할지 결정해야 한다. 의외로 arm64로 설치해야 Java 런타임의 바이너리 호환성이 좋아서 이것을 추천한다.
colima start \
--arch arm64 --kubernetes --network-address --runtime containerd \
--cpu 6 --memory 16 --disk 100
arm64 아키텍처로 VM을 만들고, K8s를 함께 설치하고 고정된 IP를 할당하며, CPU나 메모리 등의 자원량을 지정할 수 있다.
예전에는 colima를 설치하면 traefik이라는 ingress controller가 기본으로 설치되었던 것 같은데, 요즘은 disable되어서 설치되므로 traefik이나 nginx ingress controller를 추가로 설치해야 한다.
친숙한 nginx로 설치해본다.
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=LoadBalancer \
--set controller.ingressClassResource.default=true
이제는 컨테이너로 서비스를 설치해보도록 하겠다. bitnami에서 만든 helm chart로 Elasticsearch를 설치한다.
다음 명령으로 설치할 수 있지만,
helm install es oci://registry-1.docker.io/bitnamicharts/elasticsearch
로컬에 설치하는 거라서 멀티 노드 Elasticsearch일 필요는 없으므로 다음 yaml을 가지고 싱글 노드 설정으로 설치한다.
master:
masterOnly: false
replicaCount: 1
data:
replicaCount: 0
coordinating:
replicaCount: 0
ingest:
replicaCount: 0
helm install es oci://registry-1.docker.io/bitnamicharts/elasticsearch -f es-values.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: es-ingress
annotations:
spec:
rules:
- host: es.local # 도메인
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: es-elasticsearch
port:
number: 9200
es.local이라는 도메인 이름을 사용해서 외부 요청을 내부의 9200 포트를 이용해서 es-elasticsearch에 전달한다.
kubectl apply -f es-ingress.yml
/etc/hosts 파일에 es.local이라는 도메인 이름을 등록해야 한다.
colima가 VM을 설치할 때 IP가 고정되므로 이것을 가지고 /etc/hosts에 등록해야 한다.
다음 명령으로 확인 가능하다.
colima ssh ip addr show dev col0 | grep inet
또는
colima status | grep address
ingress는 일종의 Web Proxy라서 HTTP가 아닌 TCP 수준의 서비스는 이 방법으로 불가능하다.
이럴 경우, 다소 불편하지만 kubectl으로 port-forward 기능을 활성화해서 사용해야 한다.
예를 들어 MongoDB는 내부적으로 27017 포트를 사용하는데, 외부에 28015 포트로 열어서 여기에 연결해줄 때 이렇게 할 수 있다.
kubectl port-forward deployment/mongo 28015:27017
deployment 뿐만 아니라 svc(service)나 pods, replicaset도 가능하다.
bitnami 차트 대신에 elastic 공식 차트로 설치해보겠다.
image: "docker.elastic.co/elasticsearch/elasticsearch"
imageTag: "8.2.3"
imagePullPolicy: IfNotPresent
replicas: 1
minimumMasterNodes: 1
extraInitContainers:
- name: install-plugins
image: docker.elastic.co/elasticsearch/elasticsearch:8.2.3
command:
- sh
- -c
- |
bin/elasticsearch-plugin install analysis-nori
volumeMounts:
- name: plugins-volume
mountPath: /usr/share/elasticsearch/plugins
extraEnvs:
- name: xpack.security.enabled
value: "false"
readinessProbe:
exec:
command:
- sh
- -c
- |
curl -s -I http://127.0.0.1:9200/ | grep -q 'HTTP/1.1 200 OK'
extraVolumes:
- name: plugins-volume
emptyDir: {}
extraVolumeMounts:
- name: plugins-volume
mountPath: /usr/share/elasticsearch/plugins
persistence:
enabled: true
size: 20Gi
service:
type: ClusterIP
port: 9200
재설치할 때마다 패스워드 교체하는 게 번거로워서 인증 기능은 비활성화했고, nori analyzer도 함께 설치되도록 설정한 것이다.
helm install es elastic/elasticsearch -f es-values.yml