kubernetes使用 (十)常见service使用

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)
    #只需要引用云供应商,让供应商帮助我们实现一个调度,不过是要收费的

没用过,案例以后补上

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值