问题描述
在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上将应用程序暴露给公共网络的步骤:
-
首先,确保你的Kubernetes集群已经启用了Ingress控制器。你可以使用
kubectl get pods -n <ingress-controller-namespace>
来检查Ingress控制器的运行状态。 -
创建一个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
``
ingress.yaml
将上面的YAML保存为文件,然后使用
kubectl apply -f ingress.yaml`来创建Ingress资源。
- host: your-domain.com # 替换为你的域名
-
配置DNS解析。在域名服务提供商处配置域名解析,将你的域名解析到集群的Ingress控制器的外部IP地址。
方案2:使用LoadBalancer服务类型
如果你只是想将应用程序暴露给公共网络,并且不需要进行复杂的路由和转发,你可以考虑使用LoadBalancer服务类型。这将在AWS上创建一个负载均衡器,并将流量转发到你的服务。
-
更新你的服务定义。将你的服务的类型更改为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`来应用更改。
更新你的服务定义并使用
- port: 80
-
等待LoadBalancer创建。Kubernetes会在AWS上创建一个负载均衡器,并分配一个外部IP地址。使用
kubectl get svc your-service-name
来查看服务的外部IP地址。 -
配置DNS解析。在域名服务提供商处配置域名解析,将你的域名解析到负载均衡器的外部IP地址。
请注意,使用Ingress或LoadBalancer可能涉及额外的费用和AWS资源配置。在进行更改之前,务必阅读相关文档并了解各种选项的适用性。
使用NodePort可能不是最佳选择,特别是在AWS上。考虑使用Ingress资源或LoadBalancer服务类型来更好地将你的应用程序暴露给公共网络。
希望这些解决方案能够帮助你解决问题。如果你有更多疑问或需要进一步的帮助,请随时提问。