μΏ λ²λ€ν°μ€ λ΄λΆλΌλ¦¬ ν΅μ μ ν λ λ³΄ν΅ μλΉμ€μ λλ©μΈ svc.cluster.local μ μ΄μ©νμ¬ ν΅μ νκ² λ©λλ€.
μΈλΆμμ λ΄λΆλ‘ λ€μ΄μ€λ ν΅μ μ λν΄μλ Ingress λ₯Ό μ΄μ©ν΄ https ν΅μ μ νκ²λμ£ .
νμ§λ§ Ingress λ λ΄λΆ ν΅μ μ λν΄μλ https ν΅μ μ 보μ₯ν΄μ£Όμ§ μμ£ . μ΄ λΆλΆμ λν΄μλ Istio μ mTLS λ₯Ό μ΄μ©ν΄μ νλμμ ν΅μ μ λͺ¨λ https ν΅μ μ νκ² ν μ μμ΅λλ€.
Istio μ mTLS κ° κΆκΈνλ€λ©΄?
[Istio] μΏ! μ°λ¦¬λ§μ λΉλ°μ΄μΌ - mTLS (νμΈνΈ)
[Istio] μΏ! μ°λ¦¬λ§μ λΉλ°μ΄μΌ - mTLS (κ²μ¦νΈ)
κ·Έλ λ€λ©΄ mTLS λ₯Ό μ΄μ©νμ§ μκ³ λ΄λΆ ν΅μ μ μ΄λ»κ² https ν΅μ μ ν μ μμκΉμ?
μ λ΅μ κ°λ¨ν©λλ€. νλ λ§λ€ certificate λ₯Ό κ°μ§κ³ μμΌλ©΄ λ©λλ€.
μ΄λ² κΈμμλ μλΉμ€λ₯Ό μμ±ν λ coreDNS μ λ±λ‘λλ svc.cluster.local λλ©μΈμ https ν΅μ μ ν΄λ³΄κ³ μ ν©λλ€.
λ μΈ λλμ½λ~
Cert Manager λ₯Ό μ΄μ©ν΄μ certificate λ₯Ό μμ±ν©λλ€.
Cert Manager κ° κΆκΈνλ€λ©΄ μ¬κΈ° μ°Έκ³ !
Issuer μ Certificate λ₯Ό μλμ κ°μμ.
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: service-https-test
namespace: default
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: service-https-test
namespace: default
spec:
dnsNames:
- service-https-test.default.svc
- service-https-test.default.svc.cluster.local
issuerRef:
kind: Issuer
name: service-https-test
secretName: service-https-test
svc.cluster.local μ μμ μκ° μλλ selfSigned λ₯Ό ν΅ν΄ Certificate λ₯Ό μμ±ν©λλ€.
μ΅μ’ μ μΌλ‘ Certificate λ Secret μΌλ‘ μμ±λ©λλ€.
ca.crt, tls.crt, tls.key κ° μμ±λ©λλ€. λμ½λ© ν΄λ³΄λ©΄ μλμ κ°μ£ .
Cert Manager λ₯Ό μ΄μ©νλ νμ€ν νΈν©λλ€. μμ΄ νλ€λ©΄ ssh-keygen λ‘ μμ±ν΄μ νλνλ Secret κ°μΌλ‘ λ£μ΄μ€¬μ΄μΌ νμ κ²λλ€.
κ·Έ λ€μμΌλ‘ nginx μμ μ¬μ©ν config λ₯Ό configmap μ μ΄μ©ν΄ μμ±ν©λλ€.
apiVersion: v1
kind: ConfigMap
metadata:
name: service-https-test
namespace: default
data:
nginx-tls.conf: |
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/tls.crt;
ssl_certificate_key /etc/nginx/ssl/tls.key;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
80 ν¬νΈλ‘ μ κ·Όνκ² λλ©΄, 443 ν¬νΈλ‘ 리λ€μ΄λ μ λκ²λ ꡬμ±νμκ³ , server_name μ _; μΌλ‘ μ€μ ν¨μΌλ‘μ¨ μ무 λλ©μΈμ΄λ λ€ μμ©ν©λλ€.
κ·Έλ¦¬κ³ μ΄μ μλΉμ€μ νλλ₯Ό μμ±ν©λλ€.
apiVersion: v1
kind: Service
metadata:
name: service-https-test
namespace: default
spec:
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
selector:
app: service-https-test
sessionAffinity: None
type: ClusterIP
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: service-https-test
name: nginx
namespace: default
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
- name: nginx-certs
mountPath: /etc/nginx/ssl
volumes:
- name: nginx-config
configMap:
name: service-https-test
- name: nginx-certs
secret:
secretName: service-https-test
μ΄λ €μ΄ λΆλΆμ΄ μμΌλ λ°λ‘ μ€λͺ μ νμ§ μκ² μ΅λλ€.
κ·ΈλΌ μ΄μ νλ² νμΈν΄λ³΄μ£ !
μλΉμ€μ λλ©μΈμΈ http://service-https-test:80 μΌλ‘ μ κ·Όνλ 리λ€μ΄λ μ λ κ²μ νμΈ ν μ μμ΅λλ€.
Nginx κ° μ¬μ©νλ μΈμ¦μλ μ체 μ¬μΈν μΈμ¦μμ΄κΈ° λλ¬Έμ curl λͺ λ Ήμ΄λ₯Ό μ¬μ©ν λ -k λ₯Ό λΆμ¬μ€μΌ ν©λλ€.
μ΄λ²μλ https://service-https-test:443 λ‘ μ κ·Όν΄μ https ν΅μ μ νλ μ§ νμΈν΄λ³΄κ² μ΅λλ€.
TLS handshake κ³Όμ μ΄ μλ κ±Έ 보λ μμ£Ό μ λμν©λλ€.
λΏλ§ μλλΌ, νλμ IP μ£ΌμμΈ https://10.42.0.10:443 λ‘λ κ°λ₯ν©λλ€.
κ·Έλ¦¬κ³ λΉμ°νκ² μ§λ§, ν¬νΈ ν¬μλ©μΌλ‘ μ κ·Όν΄λ κ°λ₯ν©λλ€.
μ£Όμ μν¨μ΄ λ¨λλ°, 그건 μΈμ¦μκ° μ μ CA κ° μλ μ체 μ¬μΈν μΈμ¦μμ΄κΈ° λλ¬Έμ λλ€.
mTLS λ₯Ό μ΄μ©νκΈ° λλ¬Έμ svc.cluster.local μ λν https ν΅μ μ΄ νμλ μμμ§λ§, νμ κΆκΈνλ λΆλΆμ΄μλλ° μ΄λ² μ€μ΅μΌλ‘ ν΅ν΄ κΆκΈμ¦μ ν΄κ²°ν μ μμμ΅λλ€.
κ·ΈλΌ μ€λμ μ¬κΈ°κΉμ§~