我正试图让Kubernetes集群在单个Redhat 7.7服务器上运行。
我以前设法使其能够在AWS上的Centos 7和Redhat 7.7 AMI上运行。
Traefik HTTP入口控制器启动并运行,但是所有http请求在traefik-ingress-controller-http-service的nodePort上超时。
kubectl get服务的输出| grep traefik
起初我以为Ingress本身有问题,但是如果您尝试从服务器内部卷曲,它会很好地工作。
要丢弃某种防火墙问题,我在一些服务中添加了一个nodePort,可以正常使用它们。
每当我在服务器内部使用curl时,traefik-ingress-controller窗格中的调试消息就会出现在日志中:
level=debug msg="vulcand/oxy/roundrobin/rr: begin ServeHttp on request"
对于超时的请求,没有调试消息。
使用netstat -anp之后,我注意到kube-proxy拥有我要使用的端口,因此我还查看了kube-proxy pod的日志,并与成功安装的日志进行了比较,唯一的不同这行,仅在失败的服务器安装上显示:
node.go:135]成功检索到节点IP:192.168.215.172
我暂时完成了端口转发,并且工作正常:
nohup kubectl port-forward --address 0.0.0.0 svc/traefik-ingress-controller-http-service 30225:443 -n traefik &
我的版本是:
Kubernetes:1.17.3 特拉菲克:1.7
Traefik配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-ingress-configmap
namespace: traefik
data:
traefik.toml: |
defaultEntryPoints = ["https","http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
CertFile = "/ssl/tls.crt"
KeyFile = "/ssl/tls.key"
[kubernetes]
[kubernetes.ingressEndpoint]
publishedService = "traefik/traefik-ingress-controller-http-service"
[ping]
entryPoint = "http"
服务:
---
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-controller-http-service
namespace: traefik
annotations: {}
spec:
selector:
k8s-app: traefik-ingress-controller
ports:
- protocol: TCP
port: 80
name: http
- protocol: TCP
port: 443
name: https
nodePort: 30220
type: NodePort
Traefik部署:
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: traefik-ingress-controller
namespace: traefik
labels:
k8s-app: traefik-ingress-controller
spec:
replicas: 1
selector:
matchLabels:
k8s-app: traefik-ingress-controller
template:
metadata:
labels:
k8s-app: traefik-ingress-controller
name: traefik-ingress-controller
spec:
serviceAccountName: traefik-ingress-serviceaccount
terminationGracePeriodSeconds: 35
volumes:
- name: traefik-ui-tls-cert
secret:
secretName: traefik-ui-tls-cert
- name: traefik-ingress-configmap
configMap:
name: traefik-ingress-configmap
containers:
- image: traefik:v1.7
name: traefik-ingress-controller
imagePullPolicy: Always
resources:
limits:
cpu: 200m
memory: 384Mi
requests:
cpu: 25m
memory: 128Mi
livenessProbe:
failureThreshold: 2
httpGet:
path: /ping
port: 80
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
failureThreshold: 2
httpGet:
path: /ping
port: 80
scheme: HTTP
periodSeconds: 5
volumeMounts:
- mountPath: "/ssl"
name: "traefik-ui-tls-cert"
- mountPath: "/config"
name: "traefik-ingress-configmap"
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: dashboard
containerPort: 8080
args:
- --logLevel=DEBUG
- --configfile=/config/traefik.toml
- --insecureskipverify
欢迎提出任何想法:)
答案 0 :(得分:0)
我开始跟踪所有相关网络接口上的tcp包,我意识到traefik服务的群集IP(通过DNAT和IP表进行DNS查找和平衡)无法回复SYN初始包。
在这种情况下,我必须将externalTrafficPolicy设置为Local,以允许Traefik HTTP入口控制器Pod使用实际的客户端IP来应答,而不是使用掩码的NAT IP /端口。
---
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-controller-http-service
namespace: traefik
annotations: {}
spec:
selector:
k8s-app: traefik-ingress-controller
ports:
- protocol: TCP
port: 80
name: http
- protocol: TCP
port: 443
name: https
nodePort: 30220
type: NodePort
externalTrafficPolicy: Local