Istion-ingress Gateway+cert-Manager로 GKE의 HTTPS 대응을 신속하게 실현
15363 단어 KubernetesIstiotech
이번 검증에는 다음과 같은 동기가 있다.
그 밖에 이번에는 다음과 같은 전제를 바탕으로 진행한다.
type: NodePort
(Cloud Load Balaning(CLB)의 비용 절약을 위해)GKE 만들기
각 어셈블리에 대한 Deploy의 GKE를 생성하는 Cluster.
다음 규격을 사용하여 그룹을 만들고 있습니다.
e2-medium
Preemtible VMs
istio
Istio
, HTTP load balancing
, Kubernetes Engine Monitoring
각종 add-on의 무효화에 관하여 GCP의 공식 지침이 있으니 참고하십시오.
또 Istio의 Setup을 구상해 다음과 같은 변경을 추가했다.
(변경 사항에 대한 자세한 내용은 아래 링크를 참조하십시오.)
allow - tcp:10250,tcp:443,tcp:15017
도메인 획득 + Cloudflare DNS 설정
HTTPS에 대응하기 위해 도메인 취득과 Cloudflare DNS 설정을 진행합니다.
우선, 임의의 등록표를 사용하여 도메인 이름을 얻는다.
(Google Domaains 검색 방법은 다음 링크를 참조하십시오.)
그런 다음 Cloudflare DNS 측면의 설정 작업을 수행합니다.
계정을 미리 만든 후 계정의 홈 화면에서 "Adda site"를 클릭하여 도메인 이름을 추가합니다.
그런 다음 레지스트리 옆에 지정된 DNS 서버 목록을 Cloudflare DNS 서버에 재지정합니다.
Cloudflare Sync 설정
이번 GKE 클러스터는 노드로 활용
Preemtible VMs
되고 있다.Preemtible VMs
최장 24시간으로 종료 후 노드의 Public IP도 변경되므로 A 레코드 업데이트(동기화)가 필요합니다.IP는 kubernetes-Coludflare-sync를 동기화합니다.
이 Custom Controller는 자신이 관리하는 도메인 이름에서 GKE Nodes의 외부 IP를 뺀 상태로 유지됩니다.
// CloudflareのAPI keysをSecretsとして登録する
kubectl create secret generic cloudflare \
--from-literal=email=<email> \
--from-literal=api-key=<api_key>
// Service Accountの設定
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user <email>
kubectl apply -f ./sync-sa.yaml
// ImageのBuild + Push
docker build -t gcr.io/<gcp_project_id>/kubernetes-cloudflare-sync:latest .
docker push gcr.io/<gcp_project_id>/kubernetes-cloudflare-sync:latest
// Deploymentの作成([Configure]のsample deployment)
kubectl apply -f ./sync-deployment.yaml
Istio(IngressGateway) 설정
여기까지의 준비가 완료되면 Istio-Ingress Gateway 설정을 진행한다.
단계는
getting-started
의 내용과 같다.Ingress Gateway의 Manifest 내
type: LoadBalancer
→type: NodePort
변경을 위해 프로필은 지정된 demo
이후에generate Manifest입니다.// demo Profile用のManifestのディレクトリを用意しておく
$ mkdir temp-profile
<dir>
|
|- istio-1.8.1
|
|- temp-profile
// Istioのdownload
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.8.1 TARGET_ARCH=x86_64 sh -
$ cd istio-1.8.1
$ ./bin/istioctl manifest generate --set profile=demo >> ./../temp/istio-demo-profile.yaml
Ingress Gateway의 Manifest에서 type: LoadBalancer
→type: NodePort
수정된 Manifest를 Apply로 합니다.---
apiVersion: v1
kind: Service
metadata:
annotations: null
labels:
app: istio-ingressgateway
install.operator.istio.io/owning-resource: unknown
istio: ingressgateway
istio.io/rev: default
operator.istio.io/component: IngressGateways
release: istio
name: istio-ingressgateway
namespace: istio-system
...
selector:
app: istio-ingressgateway
istio: ingressgateway
// NodePortに変更する
type: NodePort
---
$ kubectl apply -f ./../temp/istio-demo-profile.yaml
$ kubectl label namespace default istio-injection=enabled
$ kubectl get svc --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 3h38m
istio-system istio-egressgateway ClusterIP 10.1.0.190 <none> 80/TCP,443/TCP,15443/TCP 72s
istio-system istio-ingressgateway NodePort 10.1.1.172 <none> 15021:32308/TCP,80:31232/TCP,443:30791/TCP,31400:32322/TCP,15443:32480/TCP 71s
istio-system istiod ClusterIP 10.1.1.23 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 70s
kube-system calico-typha ClusterIP 10.1.3.58 <none> 5473/TCP 173m
kube-system kube-dns ClusterIP 10.1.0.10 <none> 53/UDP,53/TCP 3h38m
kube-system metrics-server ClusterIP 10.1.0.54 <none> 443/TCP 3h38m
$ kubectl describe node | grep ExternalIP
ExternalIP: <node1_ip>
ExternalIP: <node2_ip>
ExternalIP: <node3_ip>
다음에 Istio-ingress Gateway를 만들 때 Firewall Rule를 만들어서 분배된 GKE 노드의 포트를 통신하고 NodePort에서 외부에서 통신할 수 있도록 한다.필요한 경우 GKE 노드에 대한 네트워크 태그를 제공합니다.
// 15021:32308/TCP,80:31232/TCP,443:30791/TCP,31400:32322/TCP,15443:32480/TCP の例であれば
// <http_port_number> → 31232, <https_port_number> → 30791となる
gcloud compute firewall-rules create allow-conn-from-nodeport \
--network=default \
--project <gcp_project_id> \
--target-tags istio \
--allow tcp:<http_port_number>,<https_port_number>
HTTP 통신은 이런 상태에서도 가능할 것이다.Deploy에서 httpbin 등의 Sample deployment를 받은 후 소통 확인을 해주세요.
cert-Manager 설정
HTTPS에 대응하기 위해 이번에는cert-Manager를 이용한 증명서와 Istio 측의 라우팅 설정을 추가로 발행한다.
$ export CM_VERSION="v1.1.0"
$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/$CM_VERSION/cert-manager.yaml
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
...
mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
$ kubectl get pods --namespace cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-64887fb9d6-2hjxv 1/1 Running 0 103s
cert-manager-cainjector-99977ff45-tdw7s 1/1 Running 0 104s
cert-manager-webhook-64c5d4c9db-29b2c 1/1 Running 0 103s
cert-Manager의 Deploy가 완성되면 다음 문서에 따라 Cloudflare의 DNS-01 도전에 사용할 Issuer/Cluster Issuer를 만듭니다.apiVersion: v1
kind: Secret
metadata:
name: cloudflare-api-token-secret
namespace: istio-system
type: Opaque
stringData:
api-token: <token>
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: cloudflare-prod
namespace: istio-system
spec:
acme:
email: <email>
privateKeySecretRef:
name: cloudflare-account-key
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
key: api-token
name: cloudflare-api-token-secret
email: <email>
에서 Issuer/ClusterIssuer를 만든 후 Ceertificate를 만듭니다.Certficate를 제작할 때 주의해야 할 것은 istio-ingessgateway의 Deployment와 같은 Namespace
istio-system
가 제작했다는 점이다.(이번 검증에서는 Issuer, Celtificate 등cert-Manager 관련 리소스
istio-system
가 제작했다.)The Certificate should be created in the same namespace as the istio-ingressgateway deployment.
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: <domain>
namespace: istio-system
spec:
commonName: <domain>
dnsNames:
- <domain>
issuerRef:
kind: Issuer
name: cloudflare-prod
secretName: <secret_name>
Certficate의 Manifest에 지정된 Secret Name에서 Secret이 제대로 만들어졌는지 확인합니다.$ kubectl get secret -n istio-system
...
<secret_name> Opaque 1 21s
다음으로Manifest에서 지불한 Domaain, 제작된 Certficate(Secret)를 지정하고gateway, vs 서비스의 자원을 제작한다.여기서 만든 자원은 다음과 같은 역할을 합니다.
gateway
: 요청을 받는istio-ingssgateway(Deployment)를 설정하는 자원(port,protocol,cert)vservice
: 업무의 루트 목적지를 설정하는 규칙에 사용되는 자원apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: httpbin-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
# secret name of certificate
credentialName: <secret_name>
# This should match a DNS name in the Certificate
hosts:
- <domain>
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- <domain>
gateways:
- httpbin-gateway
http:
- match:
- uri:
prefix: /status
- uri:
prefix: /delay
route:
- destination:
port:
number: 8000
# The name of a service from the service registry.
host: httpbin
이렇게 하면 집단 이외의 요청 루트를 Backend의Pod에 연결할 수 있다.생성된 가상 리소스를 사용하여 받은 HTTP(S) 요청을 다음과 같이 처리합니다.
/status
HTTPS 연결을 통한 인증
모든 설정이 완료되면 연결을 확인합니다.
요청한 라우팅 목적지로서 Deployment 를 미리 Deploy httpbin 으로 설정합니다.
$ cd istio-1.8.1
$ kubectl apply -f samples/httpbin/httpbin.yaml
도메인 이름과 Istio-ingress Gateway에서 지불한 HTTPS용port을 확인하고 다음curl 명령을 실행합니다.200 OK
회신 후 정상적으로 설치되었는지 확인할 수 있습니다.$ curl -s -I -HHost:<domain> "https://<domain>:<port_number>/status/200"
HTTP/2 200
server: istio-envoy
date: Fri, 01 Jan 2021 13:35:47 GMT
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 0
x-envoy-upstream-service-time: 1
끝맺다
우리는 Istio-Ingress Gateway+cert-Manager를 사용하는 HTTPS에 대응할 때의 설정 절차를 총괄하였다.
앞으로도 아이스티오 자체 검증을 할 생각이다.
참고 자료
Reference
이 문제에 관하여(Istion-ingress Gateway+cert-Manager로 GKE의 HTTPS 대응을 신속하게 실현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/taxin/articles/101-istio-ingress-gw텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)