6

首先,我在https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer测试了本教程

效果很好。我还测试了相同的教程,但还添加了一个 tls 密码来测试 https,它也可以正常工作。

当我创建自己的图像时,我的问题就出现了。这是我采取的步骤:

  1. Dockerfile:
     # 我们将我们的舞台标记为“建造者”
     FROM node:9.4.0-alpine 作为构建器

     复制 package.json package-lock.json ./

     ## 将节点模块存储在单独的层将防止在每次构建时安装不必要的 npm
     运行 npm i && mkdir /srv/cs-ui && cp -R ./node_modules ./srv/cs-ui

     工作目录 /srv/cs-ui

     复制 。.

     ## 在生产模式下构建 Angular 应用程序并将工件存储在 dist 文件夹中
     运行 $(npm bin)/ng build --environment "prod"

     来自 nginx

     ## 复制我们默认的 nginx 配置
     复制 nginx/default.conf /etc/nginx/conf.d/

     ## 删除默认的 nginx 网站
     运行 rm -rf /usr/share/nginx/html/*

     ## 从“builder”阶段将 dist 文件夹中的工件复制到默认 nginx nginx 公用文件夹
     复制 --from=builder /srv/cs-ui/dist /usr/share/nginx/html/
  1. Dockerfile 使用如下所示的 docker-compose 文件运行:
版本:'2'
服务:
  cs-ui:
    图片:“gcr.io/cs-micro/cs-ui:v1”
    容器名称:“cs-ui”
    tty: 真
    建造: 。
    端口:
      - “80:80”
  1. 在本地,这可以正常工作。接下来我要做的是将它推送到 Container Registry。
gcloud docker -- 推送 gcr.io/cs-micro/cs-ui:v1
  1. 之后我创建一个容器:
kubectl 运行 cs-ui --image=gcr.io/cs-micro/cs-ui:v1 --port=80
  1. 然后我暴露它:
kubectl 暴露部署 cs-ui --target-port=80 --type=NodePort
  1. 然后我运行以下入口文件:
apiVersion:扩展/v1beta1
种类:入口
元数据:
  名称:基本入口
规格:
  tls:
    -secretName:tls 证书
  后端:
    服务名称:cs-ui
    服务端口:80

用命令:

kubectl apply -f test.yaml
  1. kubectl 描述服务
    名称:cs-ui
    命名空间:默认
    标签:运行=cs-ui
    注释:              
    选择器:run=cs-ui
    类型:节点端口
    IP:10.35.244.124
    端口:80/TCP
    目标端口:80/TCP
    节点端口:30272/TCP
    端点:10.32.0.32:80
    会话亲和性:无
    外部流量策略:集群
    事件:                   


    名称:kubernetes
    命名空间:默认
    标签:组件=apiserver
                       提供者=kubernetes
    注释:       
    选择器:          
    类型:集群IP
    IP:10.35.240.1
    端口:https 443/TCP
    目标端口:443/TCP
    端点:35.195.192.28:443
    会话亲和性:ClientIP
    事件:            
  1. kubectl 描述部署
    名称:cs-ui
    命名空间:默认
    创建时间戳:2018 年 1 月 25 日星期四 12:27:59 +0100
    标签:运行=cs-ui
    注释:deployment.kubernetes.io/revision=1
    选择器:run=cs-ui
    副本:1 个需要 | 1 更新 | 共 1 个 | 1 个可用 | 0 不可用
    策略类型:滚动更新
    MinReadySeconds: 0
    RollingUpdateStrategy:最多 1 个不可用,最多 1 个激增
    吊舱模板:
      标签:运行=cs-ui
      容器:
       cs-ui:
        图片:gcr.io/cs-micro/cs-ui:v1
        端口:80/TCP
        环境:  
        坐骑:       
      卷:        
    条件:
      类型 状态 原因
      ---- ------ ------
      Available True MinimumReplicasAvailable
    旧副本集:  
    NewReplicaSet:cs-ui-2929390783(创建了1/1副本)
    事件:
      类型原因年龄来自消息
      ---- ------ ---- ---- --------
      Normal ScalingReplicaSet 9m deployment-controller 扩大副本集 cs-ui-2929390783 到 1
  1. kubectl 描述
    名称:基本入口
    命名空间:默认
    地址:35.227.220.186
    默认后端:cs-ui:80 (10.32.0.32:80)
    TLS:
      tls 证书终止
    规则:
      主机路径后端
      ---- ---- --------
      * * cs-ui:80 (10.32.0.32:80)
    注释:
      https-转发规则:k8s-fws-default-basic-ingress--f5fde3efbfa51336
      https-target-proxy:k8s-tps-default-basic-ingress--f5fde3efbfa51336
      ssl 证书:k8s-ssl-default-basic-ingress--f5fde3efbfa51336
      目标代理:k8s-tp-default-basic-ingress--f5fde3efbfa51336
      网址映射:k8s-um-default-basic-ingress--f5fde3efbfa51336
      后端:{“k8s-be-30272--f5fde3efbfa51336”:“不健康”}
      转发规则:k8s-fw-default-basic-ingress--f5fde3efbfa51336
      静态 IP:k8s-fw-default-basic-ingress--f5fde3efbfa51336
    事件:
      类型原因年龄来自消息
      ---- ------ ---- ---- --------
      正常 ADD 12m loadbalancer-controller default/basic-ingress
      正常 CREATE 11m loadbalancer-controller ip: 35.227.220.186
      正常服务 6m (x4 over 11m) loadbalancer-controller 默认后端设置为 cs-ui:30272
  1. 3-5 分钟后,我变得不健康,我不知道为什么,因为设置几乎与他们的设置完全相同。

我已经阅读了无数关于当你得到不健康的后端状态时该怎么做的帖子,但没有一个有帮助。在本教程中提到添加防火墙规则提及:https ://cloud.google.com/compute/docs/load-balancing/health-checks我已添加,但没有帮助。

如果您有任何建议,我很乐意对其进行测试。

4

1 回答 1

4

原来我们的 Angular 应用程序在“/”上有一个重定向,这给了它一个 302 响应。此响应使运行状况检查失败并导致 UNHEALTHY 状态。

一旦我们设置了自定义健康检查,它就起作用了。

于 2018-01-26T12:27:47.117 回答