一、ingress-nginx
官方文档:https://kubernetes.github.io/ingress-nginx/deploy/
1.1 部署
使用官方提供的 manifest 模板(版本 1.6.4)修改:
- 强制 http 跳转到 https
# 在模板的这个 configmap 中的 data 下增加“force-ssl-redirect: "true"”
# 还有很多参数可以在官方文档查看
---
apiVersion: v1
data:
allow-snippet-annotations: "true"
force-ssl-redirect: "true"
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.6.4
name: ingress-nginx-controller
namespace: ingress-nginx
---
- 设置全局默认 TLS 证书
# 在 Deployment 中的启动参数(spec.template.spec.containers.args)
# 增加 “--default-ssl-certificate=ingress-nginx/default-tls”
# ingress-nginx 是命名空间,default-tls 是 secret
# 这里是因为我们有泛域名证书,设置一个全局默认证书后,下面的二级域名就不用每个都创建一个 secret
...
spec:
containers:
- args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
- --election-id=ingress-nginx-leader
- --controller-class=k8s.io/ingress-nginx
- --ingress-class=nginx
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
- --default-ssl-certificate=ingress-nginx/default-tls
...
服务启动后还需要创建证书:
# 部署
kubectl apply -f deploy.yaml
# 创建默认证书
kubectl create secret tls default-tls \
--key xxx.key --cert xxx.crt -n ingress-nginx
1.2 测试模板
# 访问 http://xx.xx.net 时,会直接跳转到 https,同时由于这里没有配置 TLS 证书,会使用配置的默认证书。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: nginx
rules:
- host: xx.xx.net
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: nginx
port:
number: 80
# 不使用默认证书,需要创建对应的 secret,还要在 ingress.spec 中配置 tls。
# 其中 tls 中的 hosts 的取值需要与 rules 字段中的 host 完全匹配。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- https-example.foo.com
secretName: testsecret-tls
rules:
- host: https-example.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service1
port:
number: 80