2017-02-15 9 views
0

Я играл с kubernetes и я создал свою среду с 4-внедрениями:loadbalancer служба не будет перенаправлять желаемый стручок

  • hello: базовый «привет мир» сервис
  • auth: обеспечивает аутентификацию и шифрование
  • интерфейс: Nginx обратный прокси-сервер, который представляет собой единую точку во въезде с внешней стороны и маршрутов к точным стручки внутри
  • nodehello: базовый «привет мир» сервис, написанный в узле JS (это то, что я способствовал)

Для hello, auth и nodehello развертывания я настроил каждый один внутренний сервис.

Для развертывания frontend Я настроил сервис балансировки нагрузки, который будет доступен для внешнего мира. Он использует конфигурационный карту nginx-frontend-conf для перенаправления на соответствующие стручки и имеет следующее содержание:

upstream hello { 
    server hello.default.svc.cluster.local; 
} 
upstream auth { 
    server auth.default.svc.cluster.local; 
} 
upstream nodehello { 
    server nodehello.default.svc.cluster.local; 
}   
server { 
    listen 443; 
    ssl on; 
    ssl_certificate  /etc/tls/cert.pem; 
    ssl_certificate_key /etc/tls/key.pem; 
    location/{ 
     proxy_pass http://hello; 
    } 
    location /login { 
     proxy_pass http://auth; 
    } 
    location /nodehello { 
     proxy_pass http://nodehello; 
    } 
} 

При вызове внешнего интерфейса конечной точки с помощью curl -k https://<frontend-external-ip> я назначьте к доступному hello стручку, который является ожидаемым поведением. При вызове https://<frontend-external-ip>/nodehello, однако я не буду перенаправляться на блок nodehello, а вместо этого на hellopod.

Я подозреваю, что конфигурация upstream nodehello является неисправной частью. Я не уверен, как работает сервисное открытие, т. Е. Как будет показано имя dns nodehello.default.svc.cluster.local. Я был бы признателен за объяснение того, как это работает и что я сделал неправильно.

YAML файлы используются

развертываний/hello.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: hello 
spec: 
    replicas: 3 
    template: 
    metadata: 
     labels: 
     app: hello 
     track: stable 
    spec: 
     containers: 
     - name: hello 
      image: "udacity/example-hello:1.0.0" 
      ports: 
      - name: http 
       containerPort: 80 
      - name: health 
       containerPort: 81 
      resources: 
      limits: 
       cpu: 0.2 
       memory: "10Mi" 
      livenessProbe: 
      httpGet: 
       path: /healthz 
       port: 81 
       scheme: HTTP 
      initialDelaySeconds: 5 
      periodSeconds: 15 
      timeoutSeconds: 5 
      readinessProbe: 
      httpGet: 
       path: /readiness 
       port: 81 
       scheme: HTTP 
      initialDelaySeconds: 5 
      timeoutSeconds: 1 

развертываний/auth.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: auth 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: auth 
     track: stable 
    spec: 
     containers: 
     - name: auth 
      image: "udacity/example-auth:1.0.0" 
      ports: 
      - name: http 
       containerPort: 80 
      - name: health 
       containerPort: 81 
      resources: 
      limits: 
       cpu: 0.2 
       memory: "10Mi" 
      livenessProbe: 
      httpGet: 
       path: /healthz 
       port: 81 
       scheme: HTTP 
      initialDelaySeconds: 5 
      periodSeconds: 15 
      timeoutSeconds: 5 
      readinessProbe: 
      httpGet: 
       path: /readiness 
       port: 81 
       scheme: HTTP 
      initialDelaySeconds: 5 
      timeoutSeconds: 1 

развертываний/frontend.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: frontend 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: frontend 
     track: stable 
    spec: 
     containers: 
     - name: nginx 
      image: "nginx:1.9.14" 
      lifecycle: 
      preStop: 
       exec: 
       command: ["/usr/sbin/nginx","-s","quit"] 
      volumeMounts: 
      - name: "nginx-frontend-conf" 
       mountPath: "/etc/nginx/conf.d" 
      - name: "tls-certs" 
       mountPath: "/etc/tls" 
     volumes: 
     - name: "tls-certs" 
      secret: 
      secretName: "tls-certs" 
     - name: "nginx-frontend-conf" 
      configMap: 
      name: "nginx-frontend-conf" 
      items: 
       - key: "frontend.conf" 
       path: "frontend.conf" 

развертываний/nodehello.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: nodehello 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: nodehello 
     track: stable 
    spec: 
     containers: 
     - name: nodehello 
      image: "thezebra/nodehello:0.0.2" 
      ports: 
      - name: http 
       containerPort: 80 
      resources: 
      limits: 
       cpu: 0.2 
       memory: "10Mi" 

услуги/hello.yaml

kind: Service 
apiVersion: v1 
metadata: 
    name: "hello" 
spec: 
    selector: 
    app: "hello" 
    ports: 
    - protocol: "TCP" 
     port: 80 
     targetPort: 80 

услуги/auth.yaml

kind: Service 
apiVersion: v1 
metadata: 
    name: "auth" 
spec: 
    selector: 
    app: "auth" 
    ports: 
    - protocol: "TCP" 
     port: 80 
     targetPort: 80 

услуги/интерфейс.YAML

kind: Service 
apiVersion: v1 
metadata: 
    name: "frontend" 
spec: 
    selector: 
    app: "frontend" 
    ports: 
    - protocol: "TCP" 
     port: 443 
     targetPort: 443 
    type: LoadBalancer 

услуги/nodehello.yaml

kind: Service 
apiVersion: v1 
metadata: 
    name: "nodehello" 
spec: 
    selector: 
    app: "nodehello" 
    ports: 
    - protocol: "TCP" 
     port: 80 
     targetPort: 80 
+1

Просьба указать используемые файлы yaml. –

+0

Добавлены файлы @FarhadFarahi yaml – Ronin

ответ

0

Это отлично работает :-)

$ curl -s http://frontend/ 
{"message":"Hello"} 
$ curl -s http://frontend/login 
authorization failed 
$ curl -s http://frontend/nodehello 
Hello World! 

Я подозреваю, что вы, возможно, обновили Nginx-фронтэнд-конф когда вы добавили/nodehello, но не перезапустили nginx. Pods не будет автоматически переключаться с ConfigMaps автоматически. Попробуйте:

kubectl delete pod -l app=frontend 

До versioned ConfigMaps случиться там не лучше решение.