Knativeサービスは、ポートとプロトコルを指定されている方法

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/yunqiinsight/article/details/102742310

あなたがサービスを展開サービングnginxのKnativeを使用している場合は、それを見つけることが、サービスにnginxのにアクセスできない場合があります。Knativeコンテナ港のための要件が​​あるので、もちろん、これは、nginxの問題ではありません。nginxのデフォルトのサービス・ポートは80で、Knativeサービングキュー8012は、コンテナへのデフォルトポート8080プロキシです。コンテナ事業では、ポート8080のデフォルトの設定に待機していないのであれば、外部サービスにさらされることはできません。

注意:複数のポートでリッスンしたい場合はもちろん、コンテナが正常に起動することができますが、十分に、Istioゲートウェイを介して外部に露出することができないサービスを通じてサービスを公開されていないされていないので、サービスを提供することはできません。

あなたは上記で定義された仕様を表示すると、ときに次の2行はコメントです気づいているかもしれません。なぜ、これらのポートは、それを保持しますか?

私はKnativeは、トラフィック転送リンクをサービングについての絵で説明しましょう:

上記のように、トラフィックが直接ゲートウェイサービス船を襲ったが、コンテナの転送キュー後にしません。デフォルトのキュー・コンテナはHTTP1のトラフィック転送とHTTP2の流れのために、それぞれ、8012および8013をリッスンします。特定のコードを参照してください。

queue 容器在创建的时候会设定一个叫做 USER_PORT 的环境变量,queue 是通过这个环境变量来获取应该转发到业务容器的哪个端口的。所以只要我们能够修改 USER_PORT 这个环境变量我们就能自定义监听端口了。 USER_PORT 是通过 getUserPort 函数获取的,具体函数定义如下:

代码读到这里就已经很明朗了,创建 Knative Service 的时候可以指定 Ports 端口,然后可以通过端口的 containerPort 字段指定自定义端口。不过需要注意的是 Knative 只支持一个容器端口,所以虽然 Ports 是一个数组,但也只能设置一个。

实例如下:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: wordpress-serving
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: wordpress
      annotations:
        autoscaling.knative.dev/target: "100"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/wordpress:5.2-20190524100810
          ports:
            - name: http1
              containerPort: 80
          env:
          - name: WORDPRESS_DB_HOST
            value: rm-2xx.mysql.rds.aliyuncs.com:3306
          - name: WORDPRESS_DB_USER
            value: wordpress
          - name: WORDPRESS_DB_PASSWORD
            value: xxx
          imagePullPolicy: Always

上面在分析的过程中提到了 HTTP2 协议,如果当前提供的是 grpc 类型的服务就需要使用 http2 协议。

如果使用的是 HTTP2 协议那么也去请求就需要转发到 queue 的 8013 端口上,然后由 8013 转发给容器的业务端口。那么如何指定我们使用的协议呢?

在前面的分析中我们得出的结论是通过 port[0].containerPort 来指定自定义端口,其实也可以指定 port[0].name 字段。而 Revision Controller 生成 Deployment 部署服务的时候就是这个 name 字段来判断应该使用 http1(8012端口) 协议还是 http2(8013端口) 协议的。

  • http1 代表使用 http1(8012端口) 协议,同时 http1 也是默认策略,也就是说如果未指定那么默认也是 http1 协议
  • h2c 代表使用 http2(8013端口) 协议

代码分析如下:

https://github.com/kubedemo/serving/blob/release-0.6/pkg/apis/serving/v1alpha1/revision_lifecycle.go#L104

 

那么怎样才能指定容器的自定义端口呢?通过查阅代码可知

https://github.com/kubedemo/serving/blob/release-0.6/pkg/reconciler/serverlessservice/resources/services.go#L32

小结

Knative Service 可以给容器添加 ports 字段,并且 ports 只能设置一个端口。ports 有两个关键字段 Name 和 ContainerPort

          ports:
            - name: http1
              containerPort: 80
  • name 字段表示使用的协议,有效值有 http1 和 h2c 两个,其中:

    • http1 表示使用 http1 协议,比如 web 服务和 websock 都可以使用 http1
    • grpc 需要设置成 h2c
  • containerPort 字段就是容器提供服务的唯一端口。业务端口可以设置 1-65535 这个范围中除了 8012、8013、8022、8091 和 8092 以外的任意端口


阿里云双11亿元补贴提前领,进入抽取iPhone 11 Pro:https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110

原文链接
本文为云栖社区原创内容,未经允许不得转载。

おすすめ

転載: blog.csdn.net/yunqiinsight/article/details/102742310