programing

다른 모든 요청에 대한 Kubernetes Traefik 내부 서버 오류

batch 2023. 6. 10. 08:35
반응형

다른 모든 요청에 대한 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

반응형