繁体   English   中英

访问运行Kubernetes的AWS集群终端节点

[英]Access AWS cluster endpoint running Kubernetes

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

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

您应该阅读有关如何在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 describe service myApp检查是否已成功创建kubectl describe 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

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访问我的应用aws-node-ip:30036/my-web-app

基本上,kubernetes的构建方式是不同的。 首先,除非您创建了一个服务来暴露它们,即负载均衡器或nodePort,否则您的容器始终对世界隐藏。 如果您创建了clusterIP类型的服务,则该服务仅在群集内部可用。 为简单起见,请使用端口预载来测试您的容器,如果一切正常,则创建一个服务来暴露它们(节点端口或负载平衡器)。 最好且更困难的方法是创建一个入口,以处理入站流量和路由到服务。

Forwading端口示例:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM