Amazon web services 访问运行Kubernetes的AWS群集终结点

Amazon web services 访问运行Kubernetes的AWS群集终结点,amazon-web-services,kubernetes,Amazon Web Services,Kubernetes,我是Kubernetes的新手,目前正在AWS中使用Kubeadm部署一个集群。容器部署得很好,但我似乎无法通过浏览器访问它们。当我以前通过Docker Swarm这样做时,我可以简单地使用AWS节点的IP地址通过浏览器访问和登录我的应用程序,但这似乎不适用于我当前的Kubernetes设置 因此,我的问题是如何在这些新设置下访问正在运行的应用程序?基本上kubernetes的构造方式是不同的。首先,你的容器是隐藏的,除非你创建了一个服务来公开它们,负载平衡器或节点端口。如果创建clusterI

我是Kubernetes的新手,目前正在AWS中使用Kubeadm部署一个集群。容器部署得很好,但我似乎无法通过浏览器访问它们。当我以前通过Docker Swarm这样做时,我可以简单地使用AWS节点的IP地址通过浏览器访问和登录我的应用程序,但这似乎不适用于我当前的Kubernetes设置


因此,我的问题是如何在这些新设置下访问正在运行的应用程序?

基本上kubernetes的构造方式是不同的。首先,你的容器是隐藏的,除非你创建了一个服务来公开它们,负载平衡器或节点端口。如果创建clusterIP类型的服务,则它将仅从集群内部可用。为了简单起见,请使用PortForWading测试您的容器,如果一切正常,则创建一个服务来公开它们(节点端口或负载平衡器)。最好且更困难的方法是创建入口来处理入站流量和服务路由

涉水港示例:

kubectl port-forward redis-master-765d459796-258hz 6379:6379

将redis更改为pod名称和容器的相应端口

基本上kubernetes的构造方式是不同的。首先,你的容器是隐藏的,除非你创建了一个服务来公开它们,负载平衡器或节点端口。如果创建clusterIP类型的服务,则它将仅从集群内部可用。为了简单起见,请使用PortForWading测试您的容器,如果一切正常,则创建一个服务来公开它们(节点端口或负载平衡器)。最好且更困难的方法是创建入口来处理入站流量和服务路由

涉水港示例:

kubectl port-forward redis-master-765d459796-258hz 6379:6379

将redis更改为pod名称和容器的相应端口

您应该了解如何在Kubernetes中使用:

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 description Service myApp
检查服务是否成功创建。您应该了解如何在Kubernetes中使用:

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 Descripte Service myApp

检查该服务是否成功创建。这两个答案都有助于我找到问题的解决方案,但我最终迷失在细节中。下面是一个可以帮助其他类似情况的示例:

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
---
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
2) 我决定采用节点端口(感谢@Leandro指出这一点)来公开我的服务,因此我在应用程序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
---
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
我缺少的一点是,两个集合中的标签名称必须匹配,才能将
我的web app:StatefulSet
(1)链接到
我的web app:Service
(2)。然后,
mywebapp:StatefulSet:containerPort
必须与
mywebapp:Service:targetPort
(8080)相同。最后,
myweb应用程序:Service:nodePort
是我们公开的端口,它的值必须介于30000-32767之间

3) 最后一步是确保AWS中的安全组允许所选
my web app:Service:nodePort
(在本例中为30036)的入站流量,如果不允许,则添加规则


遵循这些步骤后,我能够通过aws节点ip:30036/我的web应用程序访问我的应用程序

这两个答案都有助于我寻求问题的解决方案,但我最终迷失在细节中。下面是一个可以帮助其他类似情况的示例:

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
---
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
2) 我决定采用节点端口(感谢@Leandro指出这一点)来公开我的服务,因此我在应用程序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
---
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
我缺少的一点是,两个集合中的标签名称必须匹配,才能将
我的web app:StatefulSet
(1)链接到
我的web app:Service
(2)。然后,
mywebapp:StatefulSet:containerPort
必须与
mywebapp:Service:targetPort
(8080)相同。最后,
myweb应用程序:Service:nodePort
是我们公开的端口,它的值必须介于30000-32767之间

3) 最后一步是确保AWS中的安全组允许所选
my web app:Service:nodePort
(在本例中为30036)的入站流量,如果不允许,则添加规则


完成这些步骤后,我可以通过aws节点ip:30036/我的web应用程序访问我的应用程序

谢谢Leandro。执行该命令后,我将能够访问我的应用程序,如::8090/myapp?此命令将允许您访问localhost:8090。你可以这样测试你的应用程序。它不定义路径。是否要在节点ip上公开?如果是这样,您需要为它创建一个服务,NodeIP会为您解决。启动该命令,然后它会将所有流量转发到您的计算机。您正在使用该命令吗?kubectl港口前吊舱名称港口集装箱:港口本地。可能您使用了错误的端口。另外,您的应用程序应该在浏览器上显示什么?尝试在localhost上卷曲应用程序地址。谢谢Leandro。一旦我执行了命令,