kubernetes 入门(五)----暴露Nginx服务端口

143 阅读3分钟

经过一段时间的忙碌,k8s庄园的party终于开启来了。随着友人们的到场,新的问题又出现了,由于黑奴服务员只能够完成一种服务,找到对应服务的黑奴变得异常麻烦。这时候我不得不搭建起来一个服务咨询台,里面的每一个接待生(Service)对应一种服务,他会指引我的友人们找到需要的服务员。

k8s中的Pod是一种'临时'资源,随时有可能发生销毁、创建。使用集群分配的不稳定的IP进行访问显然是不合理的。所以k8s提供了Service, 为服务访问提供了统一的接口,同时还兼顾了服务发现、负载均衡、端口暴露等功能。

Service 将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pod 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。

使用Node端口暴露Nginx服务

目标:

  1. 构建一个Service并关联到Niginx服务
  2. 通过Service暴露的Node端口访问服务

本实验中使用NodePort暴露Nginx服务,在生产环境中并不推荐。

  1. 对于Web服务,NodePort无法指定常用端口80 443,此时可以使用Ingress进行接口暴露。
  2. 对于为微服务,除了网关服务外一般不需要对外暴露端口,通常使用ExternalName或者ClusterIP。 生产环境中还需要集合实际情况进行选择。

构建

本节需要修改上一节提供的yaml,只需要添加一个Service的描述yaml即可。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  # 与nginx服务的Pod关联
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080
  • type:serice类型,目前有以下几个类型:
    • ClusterIP:默认值,通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。
    • NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。
    • LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。
    • ExternalName:通过返回 CNAME 记录和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。
  • port:指定要暴露的端口
    • protocol: 协议,可以选择TCP、UDP 或 SCTP 。
    • port: 为了方便,默认情况下和targetPort使用相同值
    • nodePort:暴露的节点端口,取值30000-32767 另外如果想使用80 443端口需要使用ingress。
$ kubectl apply -f service.yaml 
service/my-service created

$ kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
...
nginx-service   NodePort    10.96.69.160   <none>        80:30080/TCP   3s
...

验证

可以直接访问127.0.0.1进行验证,注意端口匹配。

$ curl 127.0.0.1:30080
hello world

至此本节内容结束,更多Service相关内容请参考官方文档