这两个答案都有助于我寻求解决我的问题,但我最终迷失在细节中。这是一个可以帮助其他类似情况的例子:
1)考虑以下应用程序yaml:
apiVersion: apps/v1 kind: StatefulSet metadata: name: my-web-app labels: app: my-web-app spec: serviceName: my-web-app replicas: 1 selector: matchLabels: app: my-web-app template: metadata: labels: app: my-web-app spec: containers: - name: my-web-app image: myregistry:443/mydomain/my-web-app imagePullPolicy: Always ports: - containerPort: 8080 name: cp
2)我决定采用节点端口(感谢@Leandro指出它)来公开我的服务,因此我将以下内容添加到我的应用程序yaml中:
--- apiVersion: v1 kind: Service metadata: name: my-web-app labels: name: my-web-app spec: type: NodePort ports: - name: http1 port: 80 nodePort: 30036 targetPort: 8080 protocol: TCP selector: name: my-web-app
我缺少的一件事是两个集合中的标签名称必须匹配才能链接 my-web-app:StatefulSet (1)到 my-web-app:Service (2)。然后, my-web-app:StatefulSet:containerPort 必须是一样的 my-web-app:Service:targetPort (8080)。最后, my-web-app:Service:nodePort 是我们公开公开的端口,它必须是30000-32767之间的值。
my-web-app:StatefulSet
my-web-app:Service
my-web-app:StatefulSet:containerPort
my-web-app:Service:targetPort
my-web-app:Service:nodePort
3)最后一步是确保AWS中的安全组允许所选的入站流量 my-web-app:Service:nodePort ,在这种情况下为30036,如果没有添加规则。
按照这些步骤后,我可以通过访问我的应用程序 aws-node-ip:30036/my-web-app 。
aws-node-ip:30036/my-web-app
基本上kubernetes的构建方式是不同的。首先,除非您创建一个服务来公开它们,负载均衡器或nodePort,否则您的容器将被隐藏在世界之外。如果您创建clusterIP类型的服务,它将仅在群集内部可用。为简单起见,使用端口转发来测试容器,如果一切正常,则创建一个服务来公开它们(节点端口或负载平衡器)。最好和更困难的方法是创建入口来处理入站流量和路由到服务。
端口转发示例:
kubectl port-forward redis-master-765d459796-258hz 6379:6379
更改容器名称的redis和容器的相应端口。
您应该阅读有关如何使用的内容 服务 在Kubernetes:
Kubernetes服务是一个定义逻辑集的抽象 Pods和访问它们的策略 - 有时称为 微服务。
基本上,服务允许从集群内部或外部访问部署(或Pod)。
在您的情况下,如果您想在AWS中公开单个服务,则它非常简单:
apiVersion: v1 kind: Service metadata: name: myApp labels: app: myApp spec: ports: - port: 80 #port that the service exposes targetPort: 8080 #port of a container in "myApp" selector: app: myApp #your deployment must have the label "app: myApp" type: LoadBalancer
您可以在“Elastic Load Balancers”下的AWS EC2控制台中检查服务是否已成功创建或使用 kubectl describe service myApp
kubectl describe service myApp