service简称svc,在k8s集群中主要提供集群对内、外部,提供针对于一组pod的访问规则
一. service访问原理
1. 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
2. kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入"本地的iptables/(ipvs)"规则中
3. iptables 使用NAT等技术将virtualIP(VIP)的流量转至endpoint(端点信息)中
二. 常见的几种service类型
1. ClusterIP #提供集群内部可以访问,默认规则
2. NodePort #将运行pod节点的服务暴露到集群所有节点上来提供访问
3. LoadBalancer #和nodeport类似,不过是采用公有云代理的来进行调度访问,类似nginx
4. ExternalName #把集群外部的服务引入到集群内部来使用
1.ClusterIP (默认)
clusterip是默认规则,只允许集群内部的pod直接互相访问
案例
#创建一个nginx的pod
kubectl create deployment web --image=nginx:1.15
#获取service的yaml文件
kubectl expose deployment web --port=80 --target-port=80 --dry-run -o yaml > service.yaml
返回
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
status:
loadBalancer: {}
部署
kubectl create -f service.yaml
查看
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 40d
web ClusterIP 10.0.0.23 <none> 80/TCP 40s
#可以看到type类型默认为ClusterIP
#用户或者容器都可以通过svc地址+端口进行访问
使用ClusterIp 会创建一个集群内部的vip,通过虚拟ip去调度后端pod节点来提供访问
2. NodePort
NodePort 的原理在于给node节点上开一个端口,将向该端口的流量导入到kube-proxy
然后由kube-proxy根据转发规则进一步转发到运行pod的节点
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
type: NodePort #添加,类型NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 30000 #添加要暴露的端口,如果不配置则为随机端口
selector:
app: web
status:
loadBalancer: {}
更新
kubectl apply -f service.yaml
查看
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 40d
web NodePort 10.0.0.23 <none> 80:30000/TCP 7m43s
#类型被修改为NodePort,对外暴露的端口是30000
#该类型的svc会在集群内所有节点上暴露一个相同的端口
#访问集群任意节点的该端口都有效
nodeport模式会在集群内每个节点上都占用一个端口,这样是很浪费资源的。官方有默认的一个端口使用范围
如下:
The Service "web" is invalid: spec.ports[0].nodePort: Invalid value: 11111: provided port is not in the valid range. The range of valid ports is 30000-32767
NodePort的端口范围默认是有限制的30000-32767,如果超出则不可用,
3. loadbalancer
在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到 <NodeIP>:NodePort
与NodePort的区别:
#不需要我们自己去搭建前端负载均衡器(nginx)
#只需要引用云供应商,让供应商帮助我们实现一个调度,不过是要收费的
没用过,案例以后补上