几个月前我开始使用 kubernetes,我为不同的后端应用程序创建服务和复制集。
现在我想使用入口服务通过我的域名从外部访问我不同的应用程序。由于它尚未投入生产,并且我仅在节点上使用,因此我不想使用负载均衡器。
是否可以使用 NodePort 设置服务并将其附加到入口而无需使用负载均衡器?
这是我的配置:
kind: Service
metadata:
name: nginx-replicaset-service
labels:
app: nginx-demo
spec:
externalIPs:
- XXX.XXX.XXX.XXX
selector:
app: nginx-replica
type: NodePort
ports:
- name: http
port: 80
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.mydomain.com
http:
paths:
- path: /
backend:
serviceName: nginx-replicaset-service
servicePort: 80
- host: test.mydomain.com
http:
paths:
- path: /test
backend:
serviceName: other-service
servicePort: 80
当我检查集群上的入口信息时,我有以下内容:
NAME HOSTS ADDRESS PORTS AGE
my-ingress www.mydomain.com,test.mydomain.com 80 4d22h
地址始终为空
如果您的集群在 GCP 或 GKE 上运行,您可以
1( 创建全局 IP 地址
gcloud compute addresses create ingress-static-ip --global
2( 在入口配置上设置 kubernetes.io/ingress.global-static-ip-name 注释
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: ingress-static-ip
labels:
app: nginx-replica
3(和服务
apiVersion: v1
kind: Service
metadata:
name: nginx-replicaset-service
labels:
app: nginx-demo
spec:
selector:
app: nginx-replica
type: NodePort
ports:
- name: http
port: 80
https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip
不是直接的,或者至少会很尴尬。出于安全原因,NodePort 服务仅限于一系列高端口,因此这需要http://externalip:43210
或它选择的任何端口。不使用负载均衡器的更常见方法是使用 DaemonSet 和 hostNetwork 模式部署入口控制器,以便它可以侦听 80 和 443。不过,这仍然留下了将IP提供给用户的问题。出于开发目的,您可以为节点选择任何 IP 并使用它。对于生产,它更难,这就是为什么通常不推荐它的原因。
是的,你可以,但你不应该使用外部IP指定NodePort。使用外部IP,您可以直接指定端口,如下所示:
kind: Service
metadata:
name: nginx-replicaset-service
labels:
app: nginx-demo
spec:
externalIPs:
- XXX.XXX.XXX.XXX
selector:
app: nginx-replica
ports:
- name: http
port: 80
这意味着您可以使用 XXX.XXX.XXX.XXX:80 访问该服务
在描述入口时看不到任何地址是很正常的事情,入口将仅包含您在 ingress.yaml 中指定的内容:您只在入口中使用了主机名。
如果你执行"kubectl get svc">,你将看到你的服务与外部IPs。
此外,为了使您的入口正常工作,这意味着 www.domain.com,test.domain.com 需要指向 XXX.XXX.XXX.XXX。