kubernetes暴露服务

k8s的dns实现了服务在集群“内”被自动发现,那么在生产环境下,服务在k8s集群”外“被使用和访问呢?

我们来看一下kubernetes暴露服务的方式

一:kube-proxy转发的两种模式

一个简单的网络代理和负载均衡器,负责service的实现,Service都会在所有的Kube-proxy节点上体现。具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。kube-proxy在转发时主要有两种模式Userspace和Iptables。

1.userspace

userspace是在用户空间,通过kuber-proxy实现LB的代理服务。在K8S1.2版本之前,是kube-proxy默认方式,所有的转发都是通过kube-proxy实现的。这个是kube-proxy的最初的版本,较为稳定,但是效率也自然不太高。
在这里插入图片描述

2.iptables

另外一种方式是iptables方式(如下图)。是纯采用iptables来实现LB。在K8S1.2版本之后,kube-proxy默认方式。所有转发都是通过Iptables内核模块实现,而kube-proxy只负责生成相应的Iptables规则。

在这里插入图片描述

注意:
使用Userspace模式(k8s版本为1.2之前默认模式),外部网络可以直接访问cluster IP。
使用Iptables模式(k8s版本为1.2之后默认模式),外部网络不能直接访问cluster IP。

二:转发K8S后端服务的四种方式

方式1:ClusterIP

此类型会提供一个集群内部的虚拟IP(与Pod不在同一网段),以供集群内部的pod之间通信使用。ClusterIP也是Kubernetes service的默认类型。
在这里插入图片描述

为了实现图上的功能主要需要以下几个组件的协同工作:

apiserver:在创建service时,apiserver接收到请求以后将数据存储到etcd中。

kube-proxy:k8s的每个节点中都有该进程,负责实现service功能,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables中。

iptables:使用NAT等技术将virtualIP的流量转至endpoint中。
在这里插入图片描述

具体实现方法:

  1. 使用userspace模式,修改master的/etc/kubernetes/proxy
    把KUBE_PROXY_ARGS="“改为KUBE_PROXY_ARGS=”–proxy-mode=userspace"

2.重启kube-proxy服务

3.在核心路由设备或者源主机上添加一条路由,访问cluster IP段的路由指向到master上。

在客戶端上添加如下路由条目:

[root@vm20 ~]# route add -net 10.254.244.0/24 gw 192.168.245.250

注:10.254.244.0/24是创建service之后的cluster ip所在网段

方式2:NodePort

NodePort模式除了使用cluster ip外,也将service的port映射到每个node的一个指定内部port上,映射的每个node的内部port都一样。

为每个节点暴露一个端口,通过nodeip + nodeport可以访问这个服务,同时服务依然会有cluster类型的ip+port。内部通过clusterip方式访问,外部通过nodeport方式访问。
在这里插入图片描述

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  ports:
  - port: 88
    targetPort: 80
  selector:
    app: nginx

apiVersion: v1
kind: Service
metadata:
  name: nginx-services
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 88
    targetPort: 80
    nodePort: 30010
  selector:
    app: nginx

方式3:loadbalance

LoadBalancer在NodePort基础上,K8S可以请求底层云平台创建一个负载均衡器,将每个Node作为后端,进行服务分发。

[root@master nginx]# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
[root@master nginx]# kubectl create -f nginx-deploy.yaml
[root@master nginx]# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
nginx-deployment-585449566-9459t1/1 Running   0    3m49s
nginx-deployment-585449566-pn8w5 1/1Running   0  3m49s
[root@master nginx]# kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer

方式4:Ingress

Ingress,是一种HTTP方式的路由转发机制,由Ingress Controller和HTTP代理服务器组合而成。Ingress Controller实时监控Kubernetes API,实时更新HTTP代理服务器的转发规则。HTTP代理服务器有GCE Load-Balancer、HaProxy、Nginx等开源方案。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐