microk8s를 이용해서 설치한 K8s 클러스터에서는 microk8s의 addon을 이용하여 쉽게 서비스를 설치할 수 있다.
K8s/docker container 개발에서 가장 중요한 container registry가 있는데, 이걸 addon으로 설치해서 사용하는 게 필수적이다. pod로 배포하기 전에 registry에 push되어야 하기 때문이다.
registry가 정상적으로 접근 가능한지 확인하려면 다음 명령을 이용한다.
curl https://my.registry.url/v2/
{}
{}를 응답으로 주면 정상적으로 동작하는 것이다.
microk8s registry addon을 활성화해보자.
microk8s enable registry
container-registry namespace에 설치된다. 다음 명령으로 확인 가능하다.
kubectl get all -n container-registry
NAME READY STATUS RESTARTS AGE
pod/registry-6c9fcc695f-6rs55 1/1 Running 0 28m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/registry NodePort 10.152.183.102 <none> 5000:32000/TCP 28m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/registry 1/1 1 1 28m
NAME DESIRED CURRENT READY AGE
replicaset.apps/registry-6c9fcc695f 1 1 1 28m
service가 5000번 포트로 열려있는 것을 확인할 수 있다.
이렇게 설치된 registry는 기본이 NodePort 형태로 공개된 거라서 재설치나 설정 변경 시에 IP가 바뀌게 되므로 docker tag와 docker push 명령의 endpoint를 종종 변경해줘야 하는 번거로움이 발생한다. 게다가 http로만 접근 가능한 상태이므로 docker push 명령에서 거부하기도 하고 원격에서 push해야 하는 경우에는 보안 상 문제가 발생한다.
이런 문제를 한 번에 해결하려면 ingress 설정을 해주는 게 필요하다. https를 지원하고 ip가 아닌 service를 통해 직접 pod에 연결할 수 있다.
https 사용을 위해 tls 설정을 하는 게 좋다. 당연히 본인이 소유한 도메인이 존재해야 하고 해당 도메인으로 접근했을 때 K8s에 접근이 되어야 한다.
우선 cert-manager도 설치한다.
microk8s enable cert-manager
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: 내_이메일_주소
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: public
kubectl apply -f issuer-prod.yml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: registry-ingress
namespace: container-registry
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- 내_레지스트리_도메인
secretName: registry-tls-secret
rules:
- host: 내_레지스트리_도메인
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: registry
port:
number: 5000
kubectl apply -f registry-ingress.yml
"내_레지스트리_도메인"에 https로 접근하면 registry service의 5000번 포트로 연결된다. registry 서비스는 이미 내부 포트 5000번이 열려 있으므로 다음과 같은 단계로 연결되는 것이다.
curl https://내_레지스트리_도메인/v2/
{}을 정상적으로 응답하면 docker 명령의 tag와 push 기능을 이용해보자.
docker tag 내_저장소/내_서비스:latest 내_레지스트리_도메인/내_저장소/내_서비스:latest
docker push 내_레지스트리_도메인/내_저장소/내_서비스:latest
registry에 등록된 이미지 목록을 조회할 수도 있다.
curl https://registry.terzeron.com/v2/_catalog
{
"repositories": [
"terzeron/fm_backend",
"terzeron/fm_frontend",
"terzeron/tm_backend",
"terzeron/tm_frontend"
]
}
curl https://registry.terzeron.com/v2/내_저장소/내_서비스/tags/list
ex) curl https://registry.terzeron.com/v2/terzeron/fm_backend/tags/list
{
"name": "terzeron/fm_backend",
"tags": [
"latest"
]
}