λμ μμ²μ
λκΉ?
μλμ
μ΄ λ¬Έμ λ₯Ό μ μΆνκΈ° μ μ Kubernetes λ¬Έμ μμ μ΄λ€ ν€μλλ₯Ό κ²μνμ΅λκΉ?
μμ 컨νΈλ‘€λ¬, "νΈμ€νΈ", λ€μ€ νΈμ€νΈ.
https://github.com/kubernetes/ingress/issues/87 μμ μ΄ λ¬Έμ λ₯Ό μ°Ύμμ§λ§ μλͺ»λ μ μ₯μμ μμκΈ° λλ¬Έμ λ«νμ΅λλ€.
μ΄κ²μ λ²κ·Έ λ³΄κ³ μμ
λκΉ μλλ©΄ κΈ°λ₯ μμ²μ
λκΉ? (νλ μ ν):
κΈ°λ₯ μμ²
νμ¬ κ΅¬νμμ λμΌν μλΉμ€λ₯Ό κ°λ¦¬μΌμΌ νλ λͺ κ°μ νμ/λλ©μΈμ΄ μλ κ²½μ° "λ§μ" μ€λ³΅ μ½λκ° λ°μν©λλ€.
μμ:
spec:
rules:
- host: foobar.com
http:
paths:
- backend:
serviceName: foobar
servicePort: 80
- host: api.foobar.com
http:
paths:
- backend:
serviceName: foobar
servicePort: 80
- host: admin.foobar.com
http:
paths:
- backend:
serviceName: foobar
servicePort: 80
- host: status.foobar.com
http:
paths:
- backend:
serviceName: foobar
servicePort: 80
κ·Έλμ Host
νλκ° λ¨μΌ FQDNμμ FQDN λ°°μ΄λ‘ λ³κ²½λ κ²μ μ μν©λλ€.
κ·Έλμ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
spec:
rules:
- host: ["foobar.com", "api.foobar.com", "admin.foobar.com", "status.foobar.com"]
http:
paths:
- backend:
serviceName: foobar
servicePort: 80
18μ€μ μ μ½νκ³ κ΅¬μ±μ λ λͺ ννκ² λ§λλλ€.
https://github.com/kubernetes/kubernetes/issues/41881 μ μ€λ³΅μΌ μλ μμ§λ§ ꡬννκΈ°κ° λ μ¬μ΄ κ² κ°μ΅λλ€.
cc @aledbf (λΉμ μ k8sμ μ΄ λΆλΆμμ "μΌ"νλμ§ νμ€νμ§ μμ λ§μ§λ§ λ¬Έμ λ₯Ό λ§κ°νμ΅λλ€)
Kubernetes λ²μ ( kubectl version
):
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", BuildDate:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.4+coreos.0", GitCommit:"97c11b097b1a2b194f1eddca8ce5468fcc83331c", GitTreeState:"clean", BuildDate:"2017-03-08T23:54:21Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
νκ²½ :
λμ§νΈμ€μ
, μ½μ΄OS.
μ΄κ²λ +1. @klausenbusk μ μ λͺ¨λ https://github.com/kubernetes/kubernetes/issues/41881 μμ μΈκΈνλ―μ΄ μ΄κ²μ λ¨Ό κΈΈμ κ° κ²μ λλ€.
μμΌλμΉ΄λ λλ νμ λλ©μΈ μ μ© μ΅μ
μ μ νΈνλ―λ‘ host: web.*
λλ host: api.web.*
λ₯Ό μ§μ νκ³ ν΄λΉ ν¨ν΄μΌλ‘ _μμ_νλ λͺ¨λ νλͺ©μ΄ ν΅κ³Όνλλ‘ νμ¬ μλΉμ€κ° μ΅μ’
λλ©μΈμ λν΄ λ¬΄μ§νκ² λ‘λλ€. ( .example.com
? .prod.example.com
? .beta.example.com
? .it.internal
?μμ μ€ν μ€μ
λκΉ?), κ·Έλ¬λ νμ¬ λͺ¨λ리μμ λμ΄μλ κ²μ "μ 체 λ¨μΌ λλ©μΈμ λμ΄ν΄μΌ ν©λλ€. host:
μμ ν° μ§μ μ
λλ€.
κ°μΈμ μΌλ‘ λλ λν μμ 컨νΈλ‘€λ¬(μΌλ°μ μΌλ‘ ν΄λ¬μ€ν° κ΄λ¦¬μκ° λ°°ν¬ν¨)μ "λ€μ λλ©μΈ λλ κ·Έ νμ λλ©μΈλ§ μλΉμ€ν©λλ€..."λΌλ μ νμ΄ μμ΄μΌ νλ€κ³ μκ°νμ§λ§ μ΄λ λ³κ°μ λ¬Έμ μ λλ€.
λ λ€λ₯Έ +1. μ¬μν μΈκ·Έλ μ€ μ¬μ© μ¬λ‘κ° μλ κ±°μ λͺ¨λ μ¬λμ΄ μ΄μ μ λ릴 μ μλ€κ³ μκ°ν©λλ€.
+1
+1
90μΌ λμ μ¬μ©νμ§ μμΌλ©΄ λ¬Έμ κ° λΆμ€ν΄μ§λλ€.
/remove-lifecycle stale
νμ¬ λ¬Έμ λ₯Ό μ΅μ μΌλ‘ νμν©λλ€.
λΆμ€ λ¬Έμ λ μΆκ°λ‘ 30μΌ λμ μ¬μ©νμ§ μμΌλ©΄ μ©κ³ κ²°κ΅ λ«νλλ€.
/lifecycle frozen
μ£ΌμμΌλ‘ μ΄μκ° μλμΌλ‘ λ«νμ§ μλλ‘ ν©λλ€.
μ΄ λ¬Έμ λ₯Ό μ§κΈ μ’
λ£ν΄λ μμ νλ€λ©΄ /close
.
sig-testing, kubernetes/test-infra λ°/λλ @fejta
νΌλλ°±μ 보λ΄μμμ€.
/μλͺ
μ£ΌκΈ° λΆμ€
/remove-lifecycle λΆμ€
λΆλͺ ν, λλ μ€λλμμ κ·Έκ²μ μ κ±° ν μ μμ΅λλ€ ...
@deitch κ° ν¨κ³Όκ°
μ΄ κΈ°λ₯λ λ³΄κ³ μΆμ§λ§ ν΄κ²° λ°©λ²μΌλ‘ YAML IDλ₯Ό μ¬μ©ν©λλ€. λ€μμ μ£Όμ΄μ§ μλ₯Ό μ°Ύλ λ°©λ²μ λλ€.
spec:
rules:
- host: foobar.com
http: &http_rules
paths:
- backend:
serviceName: foobar
servicePort: 80
- host: api.foobar.com
http: *http_rules
- host: admin.foobar.com
http: *http_rules
- host: status.foobar.com
http: *http_rules
λλ μ΄κ²μ΄ λ§€μ° νμλ°μ κ²μ΄λΌλ λ§ μΈμ μΆκ°ν κ²μ΄ λ³λ‘ μμ΅λλ€. λ² ν APIμ λν κ·μΉμ΄ μ¬μ ν μ΄λ₯Ό μμ ν μ μλ μ μ°μ±μ νμ©νκΈ°λ₯Ό λ°λλλ€.
μ¬κΈ°μμ λμΌ - μ¬λ¬ λλ©μΈμ μΆκ°ν΄μΌ ν©λλ€.
*.foobar.com
*.foobar.net
*.foobar.biz
νμ¬ κ΅¬νμμ μ€μ λ‘ νΈμνμ§ μμ κ²μ ...
κ·Έλμ ν¬νλ₯Ό...
90μΌ λμ μ¬μ©νμ§ μμΌλ©΄ λ¬Έμ κ° λΆμ€ν΄μ§λλ€.
/remove-lifecycle stale
νμ¬ λ¬Έμ λ₯Ό μ΅μ μΌλ‘ νμν©λλ€.
λΆμ€ λ¬Έμ λ μΆκ°λ‘ 30μΌ λμ μ¬μ©νμ§ μμΌλ©΄ μ©κ³ κ²°κ΅ λ«νλλ€.
μ΄ λ¬Έμ λ₯Ό μ§κΈ μ’
λ£ν΄λ μμ νλ€λ©΄ /close
.
sig-testing, kubernetes/test-infra λ°/λλ fejtaμ νΌλλ°±μ 보λ΄μμμ€.
/μλͺ
μ£ΌκΈ° λΆμ€
/remove-lifecycle λΆμ€
μ΄κ²μ λ§μ΄ νμν©λλ€ :((
μ΄ κΈ°λ₯μ λν΄ +1μ λλ€.
λν @kramarzκ° μ μν ν΄κ²° λ°©λ²μ μλνμ§λ§ λ€μ μ€λ₯κ° λ°μν©λλ€.
Error: YAML parse error on mysite-web/templates/ingress.yaml: error converting YAML to JSON: yaml: line 4: mapping values are not allowed in this context
μ΄ κΈ°λ₯μ λν΄ +1μ λλ€.
90μΌ λμ μ¬μ©νμ§ μμΌλ©΄ λ¬Έμ κ° λΆμ€ν΄μ§λλ€.
/remove-lifecycle stale
νμ¬ λ¬Έμ λ₯Ό μ΅μ μΌλ‘ νμν©λλ€.
λΆμ€ λ¬Έμ λ μΆκ°λ‘ 30μΌ λμ μ¬μ©νμ§ μμΌλ©΄ μ©κ³ κ²°κ΅ λ«νλλ€.
μ΄ λ¬Έμ λ₯Ό μ§κΈ μ’
λ£ν΄λ μμ νλ€λ©΄ /close
.
sig-testing, kubernetes/test-infra λ°/λλ fejtaμ νΌλλ°±μ 보λ΄μμμ€.
/μλͺ
μ£ΌκΈ° λΆμ€
/remove-lifecycle λΆμ€
μ λ§ νμν κΈ°λ₯
μμ§ λ³Έ μ μ΄ μλ μ¬μ© μ¬λ‘μ
λλ€. api[0-9].domain.io
μ²λΌ 보μ΄λ μΌλΆ λλ©μΈμ΄ μμ΅λλ€. κΈ°μ‘΄ μμΌλμΉ΄λ λλ©μΈμ μ΄ κ²½μ°λ₯Ό λ€λ£¨μ§ μμ΅λλ€. μ§ν©μ yaml IDλ₯Ό μ¬μ©νμ¬ μλμΌλ‘ κ΄λ¦¬ν μ μμ λ§νΌ μΆ©λΆν μμ§λ§ λ체(μ: μ κ·μ λλ©μΈ μ΄λ¦)κ° νμνμ§ μμ κ²½μ° μ΄μμ μ
λλ€.
μ΄ κΈ°λ₯μ΄ μ λ§ νμν©λλ€
μ΄ κΈ°λ₯μ λν λ λ€λ₯Έ ν¬ν
λ²μ 루νλ₯Ό μ¬μ©νλ λ λ€λ₯Έ ν΄κ²° λ°©λ²:
rules:
{{- range .Values.ingress.hosts }}
- host: {{ . }}
http:
paths:
- path: /
backend:
serviceName: {{ $fullName }}
servicePort: 80
{{- end }}
κ·Έλ¦¬κ³ κ° yamlμμ:
ingress:
hosts:
- "bla.blub"
- "foo.bar"
λ³μ fullNameμ μ€μ νκ³ ...
μ¬μ ν νΈμ€νΈ μμμ λν΄ λ°°μ΄μ΄λ μ κ·μ λλ ...λ₯Ό μ νΈν©λλ€.
μ΄κ²μ Ingressμμ λ°μνμ§ μλ κ²μ΄ κ±°μ νμ€νμ§λ§ APIκ° Ingressλ₯Ό λ°λ₯Ό μ μλλ‘ μΌλμ λμ΄μΌ ν©λλ€(곧 μ μμ΄ μ¬κΉμ?)
Ingressλ₯Ό νλ‘μ°νλ API, @thockin? μμ μ κ΅μ²΄κ° μμ΅λκΉ?
μ΄κ²μ Ingressμμ κ±°μ λ°μνμ§ μμ΅λλ€.
μλμ? λ§μ μ€λ³΅μ νΌνκΈ° μν΄ μμ£Ό μμ²λλ κΈ°λ₯μΈ κ² κ°μ΅λλ€. -- μ°λ¦¬μ λμμ 무μμ λκΉ?
λκ΅°κ°μκ² μ μ©ν μ μμ΅λλ€. nginx μμ μμ server-alias μ΅μ μ μ¬μ©νμ¬ λ¨μΌ μμ μ λν΄ μ¬λ¬ λλ©μΈμ κ°μ΅λλ€.
λκ΅°κ°μκ² μ μ©ν μ μμ΅λλ€. nginx μμ μμ server-alias μ΅μ μ μ¬μ©νμ¬ λ¨μΌ μμ μ λν΄ μ¬λ¬ λλ©μΈμ κ°μ΅λλ€.
@catalinpan λΉμ μ λμμ μ΄λ»κ² μλν©λκΉ? λ΄ μλ² λ³μΉμ΄ μ΄ κ΅¬μ±μμ μλνμ§ μμ΅λλ€.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: foobar-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/server-alias: "two-app.foobar.dev"
spec:
tls:
- secretName: tls-secret
rules:
- host: "one-app.foobar.dev"
http:
paths:
- backend:
serviceName: foobar
servicePort: 80
@angelogwapo λ 보μ νκ³ μλ nginx μμ λ²μ μ΄ λ³μΉ ꡬνμ μ§μνλμ§ νμΈν κ°μΉκ° μμ΅λλ€. λ²μ μ΄ μ΅μ λ²μ μΈ κ²½μ° rewrite-target
κ΅¬λ¬Έμ΄ μ΄λ»κ² μκ²Όλμ§ μ¬κΈ°μμ νμΈ
λμΌν λλ©μΈμ μ¬μ©νλ λ€λ₯Έ μΈκ·Έλ μ€κ° μλ κ²½μ° λ³μΉμ΄ μλνμ§ μλ κ²½μ°κ° μμ΅λλ€. μ¬κΈ° μ μ€λͺ
μ΄ μμ΅λλ€.
μΈμ κΉμ§λ μμ κ²½μ°κ° λΉμ κ³Ό DNS λ μ½λμ μ μ©λμ§ μλ two-app.foobar.dev
μ κ°μ λΆν λΆμ°μ ν¬μΈνΈ one-app.foobar.dev
κ·νμ μμ κ° μλν©λλ€.
νΉμ μ¬μ© μ¬λ‘, μ¬λ¬ μ§μμ μ¬λ¬ λ°°ν¬ = μν νμΈ λ° λͺ κ°μ§ μΆκ° μ΅μ μ΄ μλ μ¬λ¬ νΈμ€νΈλ₯Ό κ°λ¦¬ν€λ μ¬λ¬ μλ² λ³μΉ CNAME λλ¬Έμ terraformμ μ¬μ©νμ¬ Route 53μμ μλ² λ³μΉμ κ΄λ¦¬ν©λλ€.
μμ:
CNAME two-app.foobar.dev --> one-app-ew1.foobar.dev
CNAME two-app.foobar.dev --> one-app-ase1.foobar.dev
μλλ μ κ° μ¬μ©νλ μμμ λλ€.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/server-alias: public_url
name: app1
spec:
tls:
- hosts:
- public_region_url
secretName: my_wildcard
rules:
- host: public_region_url
http:
paths:
- path: /
backend:
serviceName: app1
servicePort: 80
μ΄ κΈ°λ₯μ μλνλ Let's Encrypt κΈ°λ₯λ μ¬μ©νλ traefik μ¬μ©μμκ² λ§€μ° μ’μ΅λλ€. μ¬κΈ°μ traefikμ μΌνλ‘ κ΅¬λΆλ λλ©μΈ λͺ©λ‘μ νΈμ€νΈλ‘ μμν©λλ€(https://docs.traefik.io/v1.7/configuration/acme/#onhostrule). μ¬κΈ°μ 첫 λ²μ§Έ λλ©μΈμ μΈμ¦μμ κΈ°λ³Έ λλ©μΈμ΄ λκ³ λ€λ₯Έ λͺ¨λ κ²μ SAN
sκ° λ©λλ€.
@catalinpan λλ μλ² λ³μΉ μ£ΌμμΌλ‘ μ΄λ €μμ κ²ͺκ³ μμ΅λλ€.
@angelogwapoμ κ±°μ λμΌν ꡬμ±μ κ°μ§κ³ μμ΅λλ€. λ κ°μ λλ©μΈμ΄ μμ΅λλ€.
λ λ€ λμΌν λ‘λ λ°Έλ°μλ₯Ό κ°λ¦¬ν€κ³ μμ΅λλ€. λ λ€ μ ν¨ν TLS μΈμ¦μκ° μμ΅λλ€.
λ΄ κ΅¬μ± μλ. μ¬λ°λ₯Έ νμ΄μ§λ‘ μ°κ²°λμ§λ§ TLS μΈμ¦μλ νΈμ€νΈλ‘ μΈκΈλ λλ©μΈμλ§ μ ν¨ν©λλ€. λ€λ₯Έ λλ©μΈμΌλ‘ μ΄λνλ©΄ Kubernetes μμ 컨νΈλ‘€λ¬ κ°μ§ μΈμ¦μκ° νμλ©λλ€. κ·Έ λ°λ. λμμ μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€...
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
app.kubernetes.io/instance: ngress-rules
cert-manager.io/issuer: letsencrypt-prod
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/server-alias: two-app.two-domain.dev
nginx.ingress.kubernetes.io/ssl-redirect: "true"
name: ingress-rules
namespace: default
spec:
rules:
- host: one-app.one-domain.dev
http:
paths:
- backend:
serviceName: service1
servicePort: 80
path: /
- backend:
serviceName: service2
servicePort: 80
path: /portal/
tls:
- hosts:
- one-app.one-domain.dev
secretName: one-app-tls
- hosts:
- two-app.two-domain.dev
secretName: two-app-tls
Btw, μ΄ λ³κ²½ μ¬νμ ν¬ν¨ν΄μΌ νλ λ²μ 0.27μ μ¬μ©νκ³ μμ΅λλ€. https://github.com/kubernetes/ingress-nginx/pull/4472/files#diff -9bba411a7c28f1ef63c3a5339db109d5
@jacqinthebox : Ingress
ꡬμ±μ μ€μ λ‘ νλμ νΈμ€νΈ( one-app.one-domain.dev
)λ§ κ΅¬μ±ν©λλ€. λ¬Όλ‘ tls
λ λ€ κ΅¬μ±νμ§λ§ κ° λλ©μΈμ λν΄ μ¬μ ν νλμ κ·μΉμ΄ νμν©λλ€. νΉν spec.rules
μλμ λ°°μ΄μ μ°Έμ‘°νμμμ€. νμ¬ λ λ²μ§Έ λλ©μΈμ΄ νλ‘μν΄μΌ νλ μλΉμ€λ₯Ό NGINXμ μλ €μ£Όλ κ²μ μμ΅λλ€.
νΈμ§ : λ΄ λμ, λ΄κ° λ무 λΉ¨λλ€. λλ λΉμ μ΄ μλ² λ³μΉ μ£Όμμ λν΄ μ΄μΌκΈ°νκ³ μλ€λ κ²μ λͺ°λμ΅λλ€.
@jacqinthebox
λ λ€ λμΌν λ‘λ λ°Έλ°μλ₯Ό κ°λ¦¬ν€κ³ μμ΅λλ€. λ λ€ μ ν¨ν TLS μΈμ¦μκ° μμ΅λλ€.
νλμ TLS λΉλ°μμ μ¬λ¬ λ
립 λλ©μΈμ μ¬μ©ν μ μμ΅λλ€.
``` tls:
νμ helm μ°¨νΈλ₯Ό μ¬μ©νμ¬ μ΄λ μ΄μ κ° λλ©μΈμ λν dup ꡬμ±μ μμ±ν μ μμ΅λλ€. "λ§μ½"λΉμ μ λ¬Όλ‘ μ‘°ν μ₯μΉλ₯Ό μ¬μ©νκ³ μμ΅λλ€ :)
+1
@kramarz , κ°μ¬ν©λλ€. μ΄ ν΄κ²° λ°©λ²μ΄ μ μκ² ν¨κ³Όμ μ λλ€.
ν΄κ²° λ°©λ²μ https://github.com/jetstack/cert-manager μμλ μλ²½νκ² μλν©λλ€.
μ¬κΈ° λ΄ μκ° μμ΅λλ€
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: site
annotations:
cert-manager.io/issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/server-alias: host2.com
spec:
rules:
- host: host1.com
http:
paths:
- path: /
backend:
serviceName: site
servicePort: 8080
tls:
- secretName: nice-name
hosts:
- host1.com
- host2.com
@AndreKoepke κ°μ¬ν©λλ€. κ·Έκ²μ λλ₯Ό μν΄ λ€μ ν¨κ³Όκ° μμμ§λ§ domain.com
λ₯Ό spec.rules[0].host
νκ³ www.domain.com,domain.se,www.domain.se
λ₯Ό nginx.ingress.kubernetes.io/server-alias
ν λ€μ μ€λ₯κ° λ°μν©λλ€. controller.go:1155] Conflicting hostname (domain.com) and alias (www.domain.se). Removing alias to avoid conflicts.
μ΄λ€ μ μ?
κ°μ₯ μ μ©ν λκΈ
μ΄ κΈ°λ₯λ λ³΄κ³ μΆμ§λ§ ν΄κ²° λ°©λ²μΌλ‘ YAML IDλ₯Ό μ¬μ©ν©λλ€. λ€μμ μ£Όμ΄μ§ μλ₯Ό μ°Ύλ λ°©λ²μ λλ€.