참고
- AKS에 HTTPS 수신 컨트롤러 만들기 (고유한 TLS 인증서 사용) - Azure docs
- k8s secret / tls secret - Kubernetes docs
앞서 진행 했던 k8s에 인증서 적용 방법의 연장되는 내용입니다.
기존에 관리하던 인증서를 k8s에 적용하는 시나리오에 대한 내용입니다.
사전 준비
- 도메인, 인증서가 필요하며 각 발급받는 방법에 대한 내용은 포함되지 않았습니다.
- 무료 인증서 발급받기
Azure의 public ip를 먼저 만들고, ingress controller가 이 public ip를 사용 하도록 하겠습니다.
공용 IP 주소 만들기
공용 ip주소 만들기 전에 aks cluster 리소스들이 존재하는 리소스 그룹 이름을 얻어 옵니다.
az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
얻어온 리소스 그룹에 공용 ip를 생성합니다.
az network public-ip create --resource-group MC_myResourceGroup_myAKSCluster_eastus --name myAKSPublicIP --sku Standard --allocation-method static --query publicIp.ipAddress -o tsv
출력 된 ip는 다음 과정인 수신기(nginx controller) 만들기에 사용됩니다.
수신 컨트롤러 만들기
네임 스페이스 만들어 주고
kubectl create namespace ingress-basic
저장소를 등록합니다.
helm repo add ingress-nginx <https://kubernetes.github.io/ingress-nginx>
다음 내용 변경 후 수신 컨트롤러를 생성합니다.
- "STATIC_IP" 부분을 위 에서 생성했던 public ip로 변경
- "DNS_LABEL" 부분을 테스트에 사용할 dns로 입력. (앞서 생성했던 public ip의 dns로 적용됩니다.)
- 반드시 필요한건 아니지만 나중에 cname record 테스트를 위해 추가 합니다.
Windows cmd 에서의 multiple line 사용하려면 역슬래시(\) 대신 서컴플렉스(^)로 교체해야 합니다.
helm install nginx-ingress ingress-nginx/ingress-nginx \
--namespace ingress-basic \
--set controller.replicaCount=2 \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.admissionWebhooks.patch.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.service.loadBalancerIP="STATIC_IP" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"="DNS_LABEL"
컨트롤러가 생성되면서 내용을 확인할 수 있는 커맨드를 출력해 줍니다.
빨간 부분의 커맨드를 실행하여 컨트롤러의 상태를 확인해 봅니다.
수신기의 EXTERNAL-IP 확인
kubectl -n ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller
조금전에 만들었던 public ip와 동일하네요. 정상입니다.
azure portal에서 public ip의 dns도 확인해 보면
수신기 생성할 때 옵션으로 tls-test dns가 설정되어 있습니다.
DNS 레코드 추가
ingress-pip의 공용 IP를 DNS에 등록합니다.
(저는 도메인 관리(godaddy) 페이지에 A record로 등록 했습니다.)
kubernetes secret 만들기
먼저 인증서가 있는 경로로 이동합니다.
secret을 생성합니다.
kubectl create secret tls aks-ingress-tls ^
--namespace ingress-basic ^
--key private.key ^
--cert certificate.crt
데모 응용프로그램 실행 (from Azure docs)
kubectl apply -f aks-helloworld.yaml --namespace ingress-basic
kubectl apply -f ingress-demo.yaml --namespace ingress-basic
수신 규칙 만들기
아래 내용중 demo.azure.com 부분을 인증서에 정의된 도메인으로 교체 후 hello-world-ingress.yaml 파일로 만들어 줍니다.
만약 tls-test.mydomain.net 으로 인증서를 생성했다면
demo.azure.com 부분을 tls-test.mydomain.net 으로 변경 해주시면 됩니다.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-world-ingress
namespace: ingress-basic
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
- hosts:
- demo.azure.com
secretName: aks-ingress-tls
rules:
- host: demo.azure.com
http:
paths:
- backend:
serviceName: aks-helloworld
servicePort: 80
path: /hello-world-one(/|$)(.*)
- backend:
serviceName: ingress-demo
servicePort: 80
path: /hello-world-two(/|$)(.*)
- backend:
serviceName: aks-helloworld
servicePort: 80
path: /(.*)
수신기 규칙을 적용합니다.
kubectl apply -f hello-world-ingress.yaml
결과 확인
저는 수신 컨트롤러 만들고 수신 컨트롤러의 ip를 dns에 (a record)등록 했습니다.
당연한 이야기 지만 dns에 레코드 등록하지 않았으면 ingress-controller에 도메인으로 접속할 수 없습니다.
dns에 등록한 url로 접속 확인
깔끔하게 정상적으로 접속 되었습니다.
지금은 ingress-pip의 공용 IP를 A record로 맵핑된 상태에서 진행된 테스트 이고
큰 의미가 있진 않지만
ingress-pip의 dns를
CNAME record로 등록한 후 접속 되는지 확인도 해봅니다.
어짜피 내용은 바뀐게 없으니 똑같은 화면이 출력되면 정상이고,
nslookup으로 변경한 레코드 도메인으로 접속 되는지 확인
좋아~ ingress-pip의 dns로 잘 가고 있네요
'IT > Kubernetes' 카테고리의 다른 글
PV, PVC는 무엇인가? (0) | 2023.04.10 |
---|---|
Jenkins로 AKS CI/CD 구축 1/2 - Jenkins 구성 (0) | 2023.04.10 |
K8S 인증서 적용방법 (with selfsigned) (0) | 2023.04.10 |
K8S 인증서 적용방법 (with cert-manager) (1) | 2023.04.10 |
Azure Kubenet CIDR (0) | 2023.04.10 |