在AWS上使用NodePort部署Kubernetes服务

77次阅读
没有评论

问题描述

在AWS EC2上使用kops创建了一个包含主节点和两个工作节点的集群,所有节点都分配了公共IPv4地址。现在,他希望创建一个使用NodePort的部署,以将应用程序公开给公众。

在创建了服务之后,他检索到以下信息,显示它正确地识别了他的三个Pod:

Name:                     hello-svc
Namespace:                default
Labels:                   app=hello
Annotations:              kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"hello"},"name":"hello-svc","namespace":"default"},"spec"...
Selector:                 app=hello-world
Type:                     NodePort
IP:                       100.69.62.27
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30001/TCP
Endpoints:                100.96.1.5:8080,100.96.2.3:8080,100.96.2.4:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

然而,当他尝试访问任何一个公共IPv4地址的30001端口时,服务器没有响应。他已经创建了一个允许所有实例的入站流量访问端口30001的安全组。在Docker Desktop for Mac中,一切正常,而在输出中,存在以下服务字段:

LoadBalancer Ingress:     localhost

用户已经学习过Kubernetes的文档,并认为NodePort应该满足他的需求。他希望得到帮助来解决这个问题。

解决方案

请注意以下操作可能涉及AWS配置、Kubernetes配置和应用程序代码的更改,务必在进行之前备份数据和配置。

在AWS上使用NodePort在某些情况下可能不是最佳选择,特别是当你想要将应用程序公开给外部网络时。AWS提供了更适合的选项,比如使用Ingress资源或LoadBalancer服务类型。

方案1:使用Ingress资源

Ingress资源允许你将HTTP和HTTPS流量路由到Kubernetes集群中的服务。以下是使用Ingress在AWS上将应用程序暴露给公共网络的步骤:

  1. 首先,确保你的Kubernetes集群已经启用了Ingress控制器。你可以使用kubectl get pods -n <ingress-controller-namespace>来检查Ingress控制器的运行状态。

  2. 创建一个Ingress资源。在你的应用程序的命名空间中创建一个Ingress资源,定义路径和后端服务。以下是一个示例Ingress资源的定义:
    “`yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: my-ingress
    annotations:
    kubernetes.io/ingress.class: nginx # 替换为你的Ingress控制器类名
    spec:
    rules:

    • host: your-domain.com # 替换为你的域名
      http:
      paths:
      – path: /
      pathType: Prefix
      backend:
      service:
      name: your-service-name # 替换为你的后端服务的名称
      port:
      number: 80
      ``
      将上面的YAML保存为
      ingress.yaml文件,然后使用kubectl apply -f ingress.yaml`来创建Ingress资源。
  3. 配置DNS解析。在域名服务提供商处配置域名解析,将你的域名解析到集群的Ingress控制器的外部IP地址。

方案2:使用LoadBalancer服务类型

如果你只是想将应用程序暴露给公共网络,并且不需要进行复杂的路由和转发,你可以考虑使用LoadBalancer服务类型。这将在AWS上创建一个负载均衡器,并将流量转发到你的服务。

  1. 更新你的服务定义。将你的服务的类型更改为LoadBalancer。以下是一个示例服务定义:
    “`yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: your-service-name
    spec:
    type: LoadBalancer
    ports:

    • port: 80
      targetPort: 8080 # 替换为你的应用程序的端口
      selector:
      app: your-app-label # 替换为你的应用程序的标签
      ``
      更新你的服务定义并使用
      kubectl apply -f service.yaml`来应用更改。
  2. 等待LoadBalancer创建。Kubernetes会在AWS上创建一个负载均衡器,并分配一个外部IP地址。使用kubectl get svc your-service-name来查看服务的外部IP地址。

  3. 配置DNS解析。在域名服务提供商处配置域名解析,将你的域名解析到负载均衡器的外部IP地址。

请注意,使用Ingress或LoadBalancer可能涉及额外的费用和AWS资源配置。在进行更改之前,务必阅读相关文档并了解各种选项的适用性。

使用NodePort可能不是最佳选择,特别是在AWS上。考虑使用Ingress资源或LoadBalancer服务类型来更好地将你的应用程序暴露给公共网络。

希望这些解决方案能够帮助你解决问题。如果你有更多疑问或需要进一步的帮助,请随时提问。

正文完