다른 모든 요청에 대한 Kubernetes Traefik 내부 서버 오류
그래서 저는 traefik 2.2를 사용하여 단일 노드 마스터로 베어 메탈 쿠버네티스 클러스터를 실행합니다.물리적 또는 가상 로드 밸런서가 없으므로 trafik 포드는 포트 80 및 443의 모든 요청을 수신합니다.나는 조타 장치가 설치된 워드프레스의 예를 가지고 있습니다.여기 보시는 것처럼 다른 모든 요청은 정확히 500개의 오류입니다.http://wp-example.cryptexlabs.com/feed/ .저는 500 오류의 요청이 워드프레스 컨테이너에 절대 도달하지 않는다는 것을 확인할 수 있어서 이것이 trafik과 관련이 있다는 것을 알고 있습니다.트래픽 로그에는 500개의 오류가 있습니다.그래서 traefik 네임스페이스에 1개의 포드가 있고, 기본 서비스에 서비스가 있으며, wp-example 네임스페이스인 예제 wordpress 사이트를 가리키는 기본 네임스페이스에 외부 네임 서비스가 있습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: traefik
chart: traefik-0.2.0
heritage: Tiller
release: traefik
name: traefik
namespace: traefik
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: traefik
release: traefik
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: traefik
chart: traefik-0.2.0
heritage: Tiller
release: traefik
spec:
containers:
- args:
- --api.insecure
- --accesslog
- --entrypoints.web.Address=:80
- --entrypoints.websecure.Address=:443
- --providers.kubernetescrd
- --certificatesresolvers.default.acme.tlschallenge
- --certificatesresolvers.default.acme.email=foo@you.com
- --certificatesresolvers.default.acme.storage=acme.json
- --certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
image: traefik:2.2
imagePullPolicy: IfNotPresent
name: traefik
ports:
- containerPort: 80
hostPort: 80
name: web
protocol: TCP
- containerPort: 443
hostPort: 443
name: websecure
protocol: TCP
- containerPort: 8088
name: admin
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: traefik-service-account
serviceAccountName: traefik-service-account
terminationGracePeriodSeconds: 60
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: wp-example.cryptexlabs.com
namespace: wp-example
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`wp-example.cryptexlabs.com`)
services:
- name: wp-example
port: 80
- name: wp-example
port: 443
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/instance: wp-example
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/name: wordpress
helm.sh/chart: wordpress-9.3.14
name: wp-example-wordpress
namespace: wp-example
spec:
clusterIP: 10.101.142.74
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 31862
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 32473
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/instance: wp-example
app.kubernetes.io/name: wordpress
sessionAffinity: None
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/instance: wp-example
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/name: wordpress
helm.sh/chart: wordpress-9.3.14
name: wp-example-wordpress
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app.kubernetes.io/instance: wp-example
app.kubernetes.io/name: wordpress
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app.kubernetes.io/instance: wp-example
app.kubernetes.io/managed-by: Tiller
app.kubernetes.io/name: wordpress
helm.sh/chart: wordpress-9.3.14
spec:
containers:
- env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: MARIADB_HOST
value: wp-example-mariadb
- name: MARIADB_PORT_NUMBER
value: "3306"
- name: WORDPRESS_DATABASE_NAME
value: bitnami_wordpress
- name: WORDPRESS_DATABASE_USER
value: bn_wordpress
- name: WORDPRESS_DATABASE_PASSWORD
valueFrom:
secretKeyRef:
key: mariadb-password
name: wp-example-mariadb
- name: WORDPRESS_USERNAME
value: user
- name: WORDPRESS_PASSWORD
valueFrom:
secretKeyRef:
key: wordpress-password
name: wp-example-wordpress
- name: WORDPRESS_EMAIL
value: user@example.com
- name: WORDPRESS_FIRST_NAME
value: FirstName
- name: WORDPRESS_LAST_NAME
value: LastName
- name: WORDPRESS_HTACCESS_OVERRIDE_NONE
value: "no"
- name: WORDPRESS_HTACCESS_PERSISTENCE_ENABLED
value: "no"
- name: WORDPRESS_BLOG_NAME
value: "User's Blog!"
- name: WORDPRESS_SKIP_INSTALL
value: "no"
- name: WORDPRESS_TABLE_PREFIX
value: wp_
- name: WORDPRESS_SCHEME
value: http
image: docker.io/bitnami/wordpress:5.4.2-debian-10-r6
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 6
httpGet:
path: /wp-login.php
port: http
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: wordpress
ports:
- containerPort: 8080
name: http
protocol: TCP
- containerPort: 8443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 6
httpGet:
path: /wp-login.php
port: http
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
requests:
cpu: 300m
memory: 512Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /bitnami/wordpress
name: wordpress-data
subPath: wordpress
dnsPolicy: ClusterFirst
hostAliases:
- hostnames:
- status.localhost
ip: 127.0.0.1
restartPolicy: Always
schedulerName: default-scheduler
securityContext:
fsGroup: 1001
runAsUser: 1001
terminationGracePeriodSeconds: 30
volumes:
- name: wordpress-data
persistentVolumeClaim:
claimName: wp-example-wordpress
의 출력kubectl describe svc wp-example-wordpress -n wp-example
Name: wp-example-wordpress
Namespace: wp-example
Labels: app.kubernetes.io/instance=wp-example
app.kubernetes.io/managed-by=Tiller
app.kubernetes.io/name=wordpress
helm.sh/chart=wordpress-9.3.14
Annotations: <none>
Selector: app.kubernetes.io/instance=wp-example,app.kubernetes.io/name=wordpress
Type: LoadBalancer
IP: 10.101.142.74
Port: http 80/TCP
TargetPort: http/TCP
NodePort: http 31862/TCP
Endpoints: 10.32.0.17:8080
Port: https 443/TCP
TargetPort: https/TCP
NodePort: https 32473/TCP
Endpoints: 10.32.0.17:8443
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
josh@Joshs-MacBook-Pro-2:$ ab -n 10000 -c 10 http://wp-example.cryptexlabs.com/
This is ApacheBench, Version 2.3 <$Revision: 1874286 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking wp-example.cryptexlabs.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.4.43
Server Hostname: wp-example.cryptexlabs.com
Server Port: 80
Document Path: /
Document Length: 26225 bytes
Concurrency Level: 10
Time taken for tests: 37.791 seconds
Complete requests: 10000
Failed requests: 5000
(Connect: 0, Receive: 0, Length: 5000, Exceptions: 0)
Non-2xx responses: 5000
Total transferred: 133295000 bytes
HTML transferred: 131230000 bytes
Requests per second: 264.61 [#/sec] (mean)
Time per request: 37.791 [ms] (mean)
Time per request: 3.779 [ms] (mean, across all concurrent requests)
Transfer rate: 3444.50 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 6 8.1 5 239
Processing: 4 32 29.2 39 315
Waiting: 4 29 26.0 34 307
Total: 7 38 31.6 43 458
Percentage of the requests served within a certain time (ms)
50% 43
66% 49
75% 51
80% 52
90% 56
95% 60
98% 97
99% 180
100% 458 (longest request)
Traefik Debug Logs: https://pastebin.com/QUaAR6G0 은 SSL 및 x509 인증서에 대한 무언가를 보여주고 있지만, 제가 https가 아닌 http를 통해 요청하고 있습니다.
저는 같은 패턴을 사용하는 nginx 컨테이너로 테스트를 했고 문제가 없었습니다.이것은 특히 워드프레스와 트래픽의 관계와 관련이 있습니다.
다운스트림 서버에서 Keep-Alive가 활성화되지 않았고 trafik은 Keep-Alive가 기본적으로 활성화되어 있다는 사실에 대한 trafik에 대한 참조도 보았습니다.또한 워드프레스 이미지를 확장하고 워드프레스에서 Keep-Alive를 활성화하여 Keep-Alive를 활성화하려고 시도했습니다.'kubectl port-forward'를 통해 프레스 컨테이너라는 단어에 액세스하면 Keep-Alive 헤더가 전송되어 활성화되었음을 알 수 있지만 여전히 요청의 50%가 실패하는 것을 볼 수 있습니다.
trafik 로그에서 HTTP 연결은 정상이지만 favicon 등에 대해 HTTPS 리디렉션이 발생하면 x509 인증서가 유효하지 않습니다.워드프레스 포드에 유효하지 않은 SSL 인증서가 있기 때문입니다.
사용할 수 있습니다.--serversTransport.insecureSkipVerify=true
트래픽이 암호화되고 외부 트래픽이 HTTP이므로 클러스터 내부에서 안전하게 보호할 수 있습니다.
나중에 신뢰할 수 있는 인증서를 사용해야 하는 경우 wordpress 앱과 함께 배포하고 트래픽이 포드 수준에서 암호 해독되도록 ssl 패스스루와 함께 trafik을 사용합니다.그런 다음 trafik에서 안전하지 않은 옵션을 제거할 수 있습니다.
bitnamihelm argocd image를 사용하여 다음 구성을 통해 내 쪽의 '내부 서버 오류' 메시지가 해결되었습니다.
조타 값.yaml
server:
traefik
# Do not redirect http to https on the server. This should be handled by ingress.
insecure: true
# Cannot use ingress from values.yaml as it forwards to https service name instead of http
ingress:
enabled: false
수신 매니페스트:
spec:
rules:
- host: hostname
http:
paths:
- path: /
pathType: Prefix
backend:
service:
# Attention: The service name on my deployment is 'argo-cd-server', but in the documentation it's always 'argocd-server'
name: argo-cd-server
port:
# http instead of https
name: http
리디렉션:https를 https로 리디렉션하려면 리디렉션 미들웨어를 사용합니다(k3s에서 작동함).
metadata:
annotations:
"traefik.ingress.kubernetes.io/router.middlewares": "{namespace}-{name-of-traefik-middleware}@kubernetescrd",
미들웨어 사양:
spec:
redirectScheme:
permanent: "true"
scheme: "https"
이유를 잘 모르겠습니다. 설명할 수 없지만 이 옵션을 추가하면 무작위 오류가 중지됩니다.
--serversTransport.insecureSkipVerify=true
언급URL : https://stackoverflow.com/questions/62500281/kubernetes-traefik-internal-server-error-on-every-other-request
'programing' 카테고리의 다른 글
JPA 수준에서 잠긴 업데이트 건너뛰기에 대한 선택 (0) | 2023.06.10 |
---|---|
data.table에서 키를 설정하는 목적은 무엇입니까? (0) | 2023.06.10 |
ggplot은 for 루프 내부에 있으면 작동하지 않지만 외부에서 작동합니다. (0) | 2023.06.10 |
setsid() 앞에 포크()가 있는 이유 (0) | 2023.06.10 |
angular2 onError 이미지 바인딩 (0) | 2023.06.10 |