我在裸机上使用kubernetes进行了centos7部署。一切都很好。但是,我想要Ingress
工作。所以简单地说,我想要做的是从Ingress中终止SSL并在入口和我的服务之间使用简单的http。这就是我所做的:
1)我hack weave to allow hostNetwork
2)我按照以下方式设置了入口控制器:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
k8s-app: nginx-ingress-lb
kubernetes.io/cluster-service: "true"
spec:
template:
metadata:
labels:
k8s-app: nginx-ingress-lb
name: nginx-ingress-lb
spec:
hostNetwork: true
terminationGracePeriodSeconds: 60
serviceAccountName: nginx-ingress-serviceaccount
nodeSelector:
role: edge-router
containers:
- image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.12.0
name: nginx-ingress-lb
imagePullPolicy: Always
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 1
# use downward API
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
- --enable-ssl-passthrough
# - --default-ssl-certificate=$(POD_NAMESPACE)/tls-certificate
volumeMounts:
- name: tls-dhparam-vol
mountPath: /etc/nginx-ssl/dhparam
volumes:
- name: tls-dhparam-vol
secret:
secretName: tls-dhparam
请注意DaemonSet和nodeSelector。还有hostNetwork = true
,这样我的kubernetes节点就会打开80和443来监听路由)。
所以我试图去http://foo.bar.com并且毫不奇怪,没有。我刚收到default backend - 404
页面。我需要入口规则......
3)所以我创建了一个Ingress
规则:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hub
annotations:
kubernetes.io/ingress.class: "nginx"
ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.org/ssl-services: "hub"
spec:
tls:
- hosts:
- foo.bar.com
secretName: tls-dhparam
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: hub
servicePort: 8000
所以效果很好!...对于http ...当我到http://foo.bar.com的节点时,我可以访问我的服务(集线器)并可以登录。但是,由于必须登录它才有意义强制执行https ....
所以我的问题是,当我将浏览器切换到https://foo.bar.com时,我最终得到default backend - 404
页。
查看上面提供的证书,我看到它是由kubernetes创建的:
Kubernetes Ingress Controller Fake Certificate
Self-signed root certificate
检查我的秘密:
$ kubectl -n ingress-nginx get secrets
NAME TYPE DATA AGE
default-token-kkd2j kubernetes.io/service-account-token 3 12m
nginx-ingress-serviceaccount-token-7f2sq kubernetes.io/service-account-token 3 12m
tls-dhparam Opaque 1 8m
我做错了什么?
答案 0 :(得分:1)
问题是我使用pem文件似乎没有用(并且没有与之相关的明显错误)。通过
切换到tls证书/密钥kubectl create secret tls tls-certificate --key my.key --cert my.cer
的工作。
答案 1 :(得分:0)
在您的示例中,您的Ingress
似乎未明确声明metadata.namespace
。如果它在default
命名空间中结束,而tls-dhparam
Secret
位于ingress-nginx
命名空间中则会出现问题。 Ingress
es的tls秘密应与Ingress
位于同一名称空间。