从集群外部访问 Service
1 )概述
- 在前面我们一直实践的是在集群内部访问 Service,之前有2种方法
- 方法1:在一个node节点上,通过对创建的的时候,对port进行一个环境变量的注册
- 来保证Service能够正确对 不同的pod 访问到
- 就是在这个node节点上,也是在集群内部
- 方法2:另外一种方式呢是通过DNS记录
- 比如说静态的pod创建这种专有域名的方式来保证集群内部都能访问到这个pod,这个service
- 但是,有些服务,比如说前端的应用 nginx,它要对集群外部进行服务提供的
- 所以在这种情况下,需要集群提供对外部访问的这种机制
- K8s提供了ClusterIP, NodePort和 LoadBalancer 这三种方式提供集群外部的访问
- ClusterIP
- 仅仅使用一个集群内部的IP地址 - 这是默认值
- 选择这个值意味着你只想这个服务在集群内部才可以被访问到
- 像你创建这个 Service, 默认,它会给你创建一个集群内部的一个IP地址
- 它是一个相当于是一个内网的IP这个IP, 实际上, 外网(公网)它是访问不到的
- 如果你是在内网的话,不推荐用这种方式创建 Service
- NodePort
- 在集群内部IP的基础上,在集群的每一个节点的端口上开放这个服务
- 你可以在任意:NodePort地址上访问到这个服务
- 这里的node指的是 worknode,在这个node上开一个端口,任何在这个端口口的请求
- 它会会被转发到咱们的这个NodePort类型的service上
- 如果是自己实践的话,可以实现这种NodePort类型的方式
- LoadBalancer
- 在使用一个集群内部IP地址和在NodePort上开放一个Service的基础上
- 还可以向云提供者申请一个负载均衡器
- 将流量转发到已经以NodePort形式开发的Service上
- 在公网生产环境使用的时候,推荐是用这个LoadBalancer去负载均衡的方式
- 向云提供商申请一个负载均衡器,然后这个负载均衡器再把流量转发到咱们的集群内部
- 或者NodePort上开个放一个Service, 一般在公有云上上可以用 ELB 服务去构建Service域名
2 )基于NodePort来实践
- 首先还是创建Service, 用于pod的通信
- 之后创建这个deployment,创建deployment之后,它会创建一个nginx中的一个pod
- 新建 node-port-nginx.yaml
apiVersion: v1 kind: Service metadata:name: svc-node-port-nginxlabels:app: nginxname: nginx-deployment spec:type: NodePortselector:app: nginxports:- port: 80name: svc-nginx-30001protocol: TCPtargetPort: 80nodePort: 30001 --- apiVersion: apps/v1 kind: Deployment metadata:name: dep-node-port-nginx spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxresources:limits:memory: "64Mi"cpu: "500m"ports:- containerPort: 80
- $
kubectl apply -f node-port-nginx.yaml
service/svc-node-port-nginx created deployment.apps/dep-node-port-nginx created
- $
kubectl get all
NAME READY STATUS RESTARTS AGE pod/dep-node-port-nginx-854c74b9f4-96cmt 1/1 Running 0 51sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/svc-node-port-nginx NodePort 10.1.135.122 <none> 80:30001/TCP 51sNAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/dep-node-port-nginx 1/1 1 1 51sNAME DESIRED CURRENT READY AGE replicaset.apps/dep-node-port-nginx-854c74b9f4 1 1 1 51s
- 我们知道,这个服务的地址应该是这个Node的ip地址,而端口就是暴露出来的30001
- $
kubectl describe pod dep-node-port-nginx-854c74b9f4-96cmt | grep Node
查看部署到了哪台机器上Node: node2.k8s/10.211.55.12 Node-Selectors: <none>
- 从上面可知道,外网可访问的地址为: 10.211.55.12:30001
- 在浏览器上输入上述地址,呈现出: “Welcome to nginx!” 的页面,说明网络通畅了
- 因为这台WorkNode节点是可以被外网访问到的, 基于之前的Service, 在这个Node节点上开了 30001 的端口
- 访问这个 30001 端口会被路由到后端Service的80端口, 这个Service的80端口又会被转发到pod的80端口
- 基于这种层层转发,才能访问到这个 nginx