我是Kubernetes的新手,目前正在使用Kubeadm在AWS中部署集群。容器部署得很好,但是我似乎无法通过浏览器访问它们。当我以前通过Docker Swarm进行此操作时,我可以仅使用AWS节点的IP地址通过浏览器访问和登录我的应用程序,但这似乎不适用于我当前的Kubernetes设置。
因此,我的问题是如何在这些新设置下访问正在运行的应用程序?
答案 0 :(得分:1)
您应该阅读如何在Kubernetes中使用Services:
Kubernetes服务是一种抽象,它定义了一组逻辑 Pod和访问它们的策略-有时称为 微服务。
基本服务允许从群集内部或外部访问部署(或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
您可以在AWS EC2控制台的“弹性负载平衡器”下或使用kubectl describe service myApp
答案 1 :(得分:1)
这两个答案都有助于我寻求解决问题的方法,但最终我迷失了细节。这是一个可以帮助其他类似情况的人的例子:
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)我决定采用Node Port(感谢@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之间。
3)最后一步是确保AWS中的安全组允许所选my-web-app:Service:nodePort
的入站流量,在这种情况下为30036(如果未添加规则)。
按照这些步骤操作后,我可以通过aws-node-ip:30036/my-web-app
访问我的应用程序。
答案 2 :(得分:0)
基本上,构建kubernetes的方式是不同的。首先,除非您创建了一个服务来暴露它们,即负载均衡器或nodePort,否则您的容器始终对世界隐藏。如果您创建了clusterIP类型的服务,则该服务仅在群集内部可用。为简单起见,请使用端口预载来测试您的容器,如果一切正常,则创建一个服务来暴露它们(节点端口或负载平衡器)。最好且更困难的方法是创建一个入口,以处理入站流量和路由到服务。
港口禁运示例:
kubectl port-forward redis-master-765d459796-258hz 6379:6379
将redis更改为您的Pod名称和容器的相应端口。