클러스터 구축까지는 했으니.. 도메인을 연결해보자
(클러스터 구축 참조)
https://fullmooney.tistory.com/46
미니pc에 나만의 k8s cluster 구축
공유기에 연결된 미니pc 3개에 ubuntu 22.04를 설치하고 k8s 1.28 클러스터 구성하는 절차이다. 준비 firebat t8 pro 16Gb 512 SSD * 3EA (Windows11 내장) Ubuntu 22.04 USB 공유기.firebat t8이 같은 wifi에 붙어있어야한다.
fullmooney.tistory.com
도메인구매
도메인은 일단 후이즈에서 구입을 했다. 처음 구매해보는지라 별생각없이 구매했는데, 더 저렴하게 파는 곳도 있는것 같고, 도메인 특성에 따라 가격이 다 다르니 자기한테 맞는것을 잘 찾아보고 구매해보자.
메인페이지에서 원하는 도메인을 입력하면 (e.g supermoon) 사용가능한 도메인 리스트가 다음 처럼 나온다.

원하는 것을 선택하고 등록신청을 하면 소유기간 1~10년별 할인율과 가격이 나오는데, 당연하게도 소유기간이 길수록 할인율은 커진다.
소유자정보를 입력하고 네임서버는 무료로 제공되는 후이즈네임서버를 사용하는 것으로 체크하고, 프리미엄 보안은 미설정으로 했다.
내 도메인이 뭐라고 털려면 털어라..
이제 결재를 하고 나면 도메인은 내것이 된다.
인증서구매
하지만 이 도메인을 쓰려면 인증서를 또 사야한다.
메인페이지 최 상단에 클라우드호스팅 메뉴를 누르면 기업/개인 상품이 뜨는데 와일드카드는 너무 비싸니 가장 저렴한 베이직 싱글/멀티를 구입하고, istio로 route를 하도록 하자.
IP를 입력해야할텐데, 마스터노드에서 네이버로 붙어서 ip 주소확인으로 간단히 실제 퍼블릭 IP를 알수있다. 아니면 터미널을 통해
curl icanhazip.com
으로 응답이 오는 IP가 퍼블릭 IP이다.
인증서를 구입하고 나면 며칠 뒤 이메일로 cname 등록을 하라고 메일이 오는데, 후이즈 네임서버를 사용하기로 했으니, 다시 후이즈에 접속해준다. 로그인 후 상단의 도메인 메뉴를 누르면 조금 아래에 총 자산:1 이라고 링크가 보이는 페이지로 이동되는데 이 링크를 누르자.
내가 구매한 도메인이 크게 보이는데 클릭하면 작은 메뉴들이 팝업으로 뜨는데 여기서 네임서버 고급설정을 눌러주자.
그리고 CNAME 레코드 관리의 관리화면 열기를 누르고 호스트명과 CNAME레코드를 이메일로 받은 내용대로 입력해준다.
그러고 나면 하루 정도 뒤에 완료가 되었다며, 메일로 인증서가 첨부되어 온다. 이 첨부파일의 압축을 해제하면 .pem파일과 적용절차 pdf가 들어있으니 일단 마스터 서버로 옮겨두자. 나는 다른 pc에서 받아서 압축해제한 뒤 scp로 복사했다.
private key 생성
private key 생성은 구글링하자. 키 길이를 2048 을 넘기면 안된다는 것만 유념 (후이즈 도메인의 경우)
Istio 설치
istio 설치는 데보션 참고해서 istioctl 로 했다.
https://devocean.sk.com/blog/techBoardDetail.do?ID=163655
[AWS EKS-연재2] AWS EKS 에 Istio 설치 및 설정
devocean.sk.com
이렇게 설치 후 kubectl get svc -n istio-system으로 istio-ingressgateway를 확인해보면,
external IP가 <none>으로 나올것이다. 직접 내부망에 클러스터 구성했기 때문인데 reverse proxy에서 접근을 위해 istio-ingressgateway service를 LoadBalncer가 아니라 NodePort 타입으로 바꿔주자.
나같은 경우 30765 포트가 https 포트로 할당되었다.
nginx reverse proxy
k8s클러스터 내부로 진입을 위해서 nginx reverse proxy를 설정하자.
nginx를 설치하고 default.conf파일을 수정해보자.
sudo apt-get install nginx
sudo vi /etc/nginx/conf.d/default.conf
server {
#listen 80;
#server_name localhost;
listen 443 ssl;
server_name supermoon.it; #구매한 도메인
ssl_certificate_key /etc/nginx/ssl/supermoon_it_nopass.key; #후이즈 설명에 따라 키 설정
ssl_certificate /etc/nginx/ssl/supermoon_it_bundle.pem; # 후이즈에서 보내준 pem파일들로 생성한 bundle pem
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
# reverse proxy
location / {
proxy_pass https://192.168.219.105:30765; # https://<노드IP>:<istio-ingressgateway https 노드포트>
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
}
}
여기까지 하면 인터넷망에서 공유기를 거쳐 설치한 nginx 서버로 들어온다음 istio-ingressgateway 서비스의 https 노드포트로 접근하는 데까지 완료된 것이다.
gateway, virtual service
그리고 위에 conf파일에 설정했던 key로 istio에서 사용할 secret도 생성한다. 일단 default namespace 에 생성해보자. 루트 경로에 복사한뒤 supermoon-it-tls 라는 secret을 생성해줬다.
kubectl create -n default secret tls supermoon-it-tls --key ~/setup/supermoon/supermoon_it_nopass.key --cert ~/setup/supermoon/supermoon_it_bundle.pem
이제 default namespace에 nginx pod와 service를 생성은 간단하니 스킵하고,
gateway와 virtual service를 생성해보자.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: default-gateway
namespace: default
spec:
selector:
app: istio-ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: supermoon-it-tls
mode: SIMPLE
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: nginx-route
namespace: default
spec:
gateways:
- default-gateway
hosts:
- '*'
http:
- match:
- uri:
exact: /
route:
- destination:
host: nginx.default.svc.cluster.local
port:
number: 80
trouble shooting
자 여기까지 하고 부푼 마음을 가지고 도메인에 접속하면, 502 Bad gateway가 뜬다.
그래도 nginx를 타긴했다는 것이니 희망은 있다.
sudo service nginx stop을 해보면 도메인이 아예 페이지를 찾을수 없다는 메시지로 바뀌는 것을 볼 수 있을것이다.
문제는 reverse proxy 설정에 있다.
conf에 설정한 proxy_pass로 요청이 전달되는데 Nginx는 기본적으로 WebSocket 연결을 지원하지 않는다. 그래서 추가 설정이 필요하다. 앞서 작성했던 default.conf 파일에 location부분에 다음 코드 중 proxy_pass 부분을 제외한 3개의 라인을 추가해주자.
location / {
proxy_pass https://192.168.219.105:30765;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
그리고 sudo service nginx restart로 nginx를 재기동해주자.
이제 welcome to nginx 페이지가 뜬다.
istio-ingressgateway에서도 접속한 로그가 보이고, /var/log/nginx/ 경로의 log 파일에서도 접속이력이 보인다.
route 처리
도메인을 싱글로 구매했기 때문에, 도메인의 context path를 나눠서 사용해야 한다.
virtual service를 다음과 같이 바꿔본다.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: nginx-route
namespace: default
spec:
gateways:
- default-gateway
hosts:
- '*'
http:
- match:
- uri:
prefix: /nginx #사용할 context-path
rewrite:
uri: / # destination에 전달될 path
route:
- destination:
host: nginx.default.svc.cluster.local
port:
number: 80
이제 supermoon.it/nginx 로 접근하면 nginx welcome 페이지를 볼 수 있다.

'환경관련' 카테고리의 다른 글
| statefulset으로 vscode+ Maven + Gradle 환경 구성 (2) | 2024.11.12 |
|---|---|
| k9s (0) | 2024.10.23 |
| 미니pc에 k8s cluster 구축 (1) | 2024.04.03 |
| 오류:6 https://packages.cloud.google.com/apt kubernetes-xenial Release 404 Not Found (0) | 2024.03.15 |
| windows 에 kind로 k8s control-plane 구성 (0) | 2023.03.08 |