概述

service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每一个service其实就是我们经常提起的微服务架构中的一个微服务,之前讲解Pod,RC等资源对象其实都是为讲解Kubernetes Service做铺垫的,下图为Pod,RC与Service的逻辑关系

可以看到上面的架构图,service服务通过标签选择器定位后端pod,前提是service的selector必须和后端Pod标签对应上才能找到相对应的Pod,而前段frontend通过service就可以访问到后端提供服务的pod了,而service默认IP类型为主要分为:

  • ClusterIP:主要是为集群内部提供访问服务的
  • NodePort:可以被集群外部所访问,访问方式为    宿主机:端口号

kube-proxy一直监控api service所管理的service规则,一旦监视到有变动,kube-proxy会将变动反映至规则当中,而请求的规则有3中:

  • userspace

  • iptables

  • ipvs

下面我创建了一个nginx服务和一个对外提供服务的service,如下:

  1. [root@master ~]# cat nginx.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: serivce-mynginx
  6. namespace: default
  7. spec:
  8. type: NodePort
  9. selector:
  10. app: mynginx
  11. ports:
  12. - name: nginx
  13. port:
  14. targetPort:
  15. nodePort:
  16.  
  17. ---
  18. apiVersion: apps/v1
  19. kind: Deployment
  20. metadata:
  21. name: deploy
  22. namespace: default
  23. spec:
  24. replicas:
  25. selector:
  26. matchLabels:
  27. app: mynginx
  28. template:
  29. metadata:
  30. labels:
  31. app: mynginx
  32. spec:
  33. containers:
  34. - name: nginx
  35. image: lizhaoqwe/nginx:v1
  36. ports:
  37. - name: nginx
  38. containerPort:

执行yaml文件

  1. [root@master ~]# kubectl create -f test.yaml
  2. service/serivce-mynginx created
  3. deployment.apps/deploy created

查看pod和service状态

  1. [root@master ~]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. deploy-696bccb9fd-9zk2f / Running 138m
  4. deploy-696bccb9fd-vcgs5 / Running 138m
  5.  
  6. [root@master ~]# kubectl get svc
  7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  8. kubernetes ClusterIP 10.96.0.1 <none> /TCP 5d23h
  9. serivce-mynginx NodePort 10.103.92.182 <none> :/TCP 138m

验证

headless service

headless service就是无头service(也就是没有ip的service),这种无头服务对于有状态应用来说很重要,我们可以利用service的labels关联后端pod,我们访问的流量就可以直接到达pod而不再需要service负载均衡至后端pod

定义无头服务如下:

  1. -rw-r--r-- root root 3 : redis.yaml
  2. [root@master redis]# cat redis-svc.yaml
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: redis-service
  7. labels:
  8. app: redis
  9. spec:
  10. ports:
  11. - name: redis-port
  12. port:
  13. clusterIP: None
  14. selector:
  15. app: redis
  16. appCluster: redis-cluster

查看service对应pod的ip地址

  1. [root@master redis]# kubectl get pods -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. redis-app- / Running 13m 10.244.2.28 node2 <none> <none>
  4. redis-app- / Running 16h 10.244.1.24 node1 <none> <none>
  5. redis-app- / Running 16h 10.244.2.25 node2 <none> <none>
  6. redis-app- / Running 16h 10.244.1.25 node1 <none> <none>
  7. redis-app- / Running 16h 10.244.2.27 node2 <none> <none>
  8. redis-app- / Running 16h 10.244.1.23 node1 <none> <none>

查看无头服务

  1. [root@master redis]# kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes ClusterIP 10.96.0.1 <none> /TCP 17h
  4. redis-service ClusterIP None <none> /TCP 16h

解析service服务,可以看到解析的ip都是后端关联的pod A记录

  1. [root@master redis]# dig redis-service.default.svc.cluster.local @10.96.0.10
  2.  
  3. ; <<>> DiG 9.11.-P2-RedHat-9.11.-.P2.el7 <<>> redis-service.default.svc.cluster.local @10.96.0.10
  4. ;; global options: +cmd
  5. ;; Got answer:
  6. ;; WARNING: .local is reserved for Multicast DNS
  7. ;; You are currently testing what happens when an mDNS query is leaked to DNS
  8. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id:
  9. ;; flags: qr aa rd; QUERY: , ANSWER: , AUTHORITY: , ADDITIONAL:
  10. ;; WARNING: recursion requested but not available
  11.  
  12. ;; OPT PSEUDOSECTION:
  13. ; EDNS: version: , flags:; udp:
  14. ;; QUESTION SECTION:
  15. ;redis-service.default.svc.cluster.local. IN A
  16.  
  17. ;; ANSWER SECTION:
  18. redis-service.default.svc.cluster.local. 30 IN A 10.244.2.27
  19. redis-service.default.svc.cluster.local. 30 IN A 10.244.1.23
  20. redis-service.default.svc.cluster.local. 30 IN A 10.244.1.25
  21. redis-service.default.svc.cluster.local. 30 IN A 10.244.2.28
  22. redis-service.default.svc.cluster.local. 30 IN A 10.244.1.24
  23. redis-service.default.svc.cluster.local. 30 IN A 10.244.2.25
  24.  
  25. ;; Query time: msec
  26. ;; SERVER: 10.96.0.10#(10.96.0.10)
  27. ;; WHEN: 3 :: CST
  28. ;; MSG SIZE rcvd:

外部访问service的问题

为了更加深刻理解kubernetes,我们需要弄明白kubernetes里的3中IP

  • NodeIP:NodeIP是kubernetes中每个节点的物理网卡IP地址,是一个真实存在的物理网络,所有属于这个网络的服务器都能通过这个网络直接通讯,包括集群外的主机访问集群内的主机也需要NodeIP
  • PodIP:PodIP是每个Pod地址,它是docker engine根据docker0网桥的IP地址进行分配的,通常是一个虚拟的二层网络,所以kubernetes里的一个Pod里的容器访问另外一个Pod里的容器时,就是通过PodIP所在的虚拟二层网络进行通讯的,而真实的TCP/IP流量是通过NodeIP所在的物理网卡流出的
  • ClusterIP:他是一个虚拟的IP,但更像是一个“伪造”的IP网络,原因有以下几点:
  1. ClusterIP仅仅作用于kubernetes service这个对象,并由kubernetes管理和分配ip地址
  2. ClusterIP无法被Ping,因为没有一个实体网络对象来响应
  3. ClusterIP只能结合service Port组成一个具体的通讯端口,如果集群外想访问需要做一些额外的操作
  4. 在kubernets集群内,NodeIP、PodIP和ClusterIP网之间通讯,采用的是kubernets自己设计的一种编程方式的特殊路由规则

k8s service对象(三)的更多相关文章

  1. k8s service对象

    k8s service对象   概述 service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每一个service其实就是我们经常提起的微服务架构中的一个微服务,之前讲解 ...

  2. [转] Bound Service的三种方式(Binder、 Messenger、 AIDL)

    首先要明白需要的情景,然后对三种方式进行选择: (一)可以接收Service的信息(获取Service中的方法),但不可以给Service发送信息 (二) 使用Messenger既可以接受Servic ...

  3. android Service Activity三种交互方式(付源码)(转)

    android Service Activity三种交互方式(付源码) Android应用服务器OSBeanthread  android Service Binder交互通信实例 最下边有源代码: ...

  4. kubernetes命令式容器应用编排/部署应用/探查应用详情/部署service对象/扩缩容/修改删除对象

    部署Pod应用 创建delpoyment控制器对象 [root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 ...

  5. [置顶] 使用kube-proxy让外部网络访问K8S service的ClusterIP

    配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是: 修改master的/etc/kubernetes/proxy,把KUBE_ ...

  6. K8S API对象

    POD Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的.Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合 ...

  7. k8s记录-使用kube-proxy让外部网络访问K8S service的ClusterIP (转载)

    配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是:修改master的/etc/kubernetes/proxy,把KUBE_P ...

  8. k8s Service学习

    service的概念 kubernetes service定义了一个抽象概念,一个pod的逻辑分组,一种可以访问的策略---通常称为服务.这组pod能够被service访问到,通常通过label se ...

  9. service对象

    Service 对象 提供用于创建服务程序的一组工具 语法 Shell.Service[.property|method] 属性 Description 服务描述,仅限于 Windows 2000 及 ...

随机推荐

  1. vue中如何使用echarts,使用axios获取数据

    1==>首先准备一个容器 <div id="echartContainer" style="width:400px; height:400px"&g ...

  2. bootstrap如何去除自带的样式----导航栏中的菜单实现平滑的过渡到对应的菜单区域-------动态跟换模态框中的内容

    问题1:如何去除bootstap中css中自带的overflow:hidden这个样式 今天遇见在bootstap中轮播图上的  附带图  片不能够显示出来,图片始终有一部分的高度  被隐藏了 后来通 ...

  3. 数据库连接池 DBUtils:

    import pymysqlfrom DBUtils.PooledDB import PooledDB, SharedDBConnectionPOOL = PooledDB ( creator=pym ...

  4. github 入门教程之 github 访问速度太慢怎么办

    github 是全世界最流行的开源项目托管平台,其代表的开源文化从根本上改变了软件开发的方式. 基本上所有的需求都能从 github 上或多或少找到现成的实现方案,再也不用重头开始造轮子而是自定义轮子 ...

  5. [LOJ 6432][PKUSC 2018]真实排名

    [LOJ 6432][PKUSC 2018]真实排名 题意 给定 \(n\) 个选手的成绩, 选中其中 \(k\) 个使他们的成绩翻倍. 对于每个选手回答有多少种方案使得他的排名不发生变化. \(n\ ...

  6. JavaScript计算日期前一天和后一天

    1.页面排版 <button onclick="before()">上一天</button> <button onclick="after( ...

  7. SuperSocket 2.0 发布第一个预览版, 另寻找Yang Fan哥哥

    昨天,SuperSocket的作者发布了2.0版本的第一个预览版.SuperSocket 2.0 是一个经过全新设计的,第一个完全基于.NET Core的版本.作者正在积极尝试提供更简单易用的API的 ...

  8. 1+x 证书 web 前端开发 HTML5 - 新增的元素,删除的元素

    官方QQ群 1+x 证书 web 前端开发 HTML5 - 新增的元素,删除的元素 http://blog.zh66.club/index.php/archives/197/

  9. sqlplus简单使用

    登录 C:\Users\inmeditation>sqlplus 请输入用户名: scott 输入口令: 查看当前行长 SQL> show linesize; linesize 80 查看 ...

  10. $.Ajax、$.Get、$.Post代码实例参数解析

    $.ajax 语法: $.ajax({name:value, name:value, ... }) 示例: $.ajax({ url: "/testJson", type: &qu ...