1.概述

通过Deployment来创建一组Pod来提供具有高可用性的服务。每个Pod都会分配一个单独的Pod IP,却存在如下两问题:

1.pod ip仅仅集群内部可见的虚拟IP,外部无法访问

2.pod ip会随着pod的销毁而消失,ip可能会随时变化,导致访问服务不方便

k8s中的service就是解决以上问题的实现服务发现的核心关键。service能够提供负载均衡能力,但是在使用上有以下限制:

只提供4层负载均衡能力,没有7层功能。

2.service类型详解

2.1 service的类型

ClusterIp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP

NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过 :NodePort 来访问该服务

LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到NodePort。(是付费服务,而且价格不菲)

ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持

2.2 ClusterIP

类型为ClusterIP的service,这个service有一个Cluster-IP,其实就一个VIP。具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现.这种类型的service 只能在集群内访问。

演示案例

使用tomcat镜像演示

docker pull tomcat:9.0.20-jre8-alpine

资源文件

apiVersion: apps/v1kind: Deploymentmetadata:  name: clusterip-demo  labels:    app: clusterip-demospec:  replicas: 1  template:    metadata:      name: clusterip-demo      labels:        app: clusterip-demo    spec:      containers:        - name: clusterip-demo          image: tomcat:9.0.20-jre8-alpine          imagePullPolicy: IfNotPresent          ports:            - containerPort: 8080      restartPolicy: Always  selector:    matchLabels:      app: clusterip-demo---apiVersion: v1kind: Servicemetadata:  name: clusterip-sevcice-demospec:  #service管理pod是通过标签来管理的,所以这里选择必须和pod的标签一样  selector:    app: clusterip-demo  ports:    - port: 8080      targetPort: 8080  type: ClusterIP

部署service:

#部署service[root@k8s-master01 service]# kubectl apply -f clusterip-demo.yml deployment.apps/clusterip-demo createdservice/clusterip-sevcice-demo created#查看service 注意虚拟ip 10.1.92.52[root@k8s-master01 service]# kubectl get svcNAME                     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGEclusterip-sevcice-demo   ClusterIP   10.1.92.52           8080/TCP   23skubernetes               ClusterIP   10.1.0.1             443/TCP    4d#在集群内部同过curl 访问能访问tomcat[root@k8s-master01 service]# curl 10.1.92.52:8080                    Apache Tomcat/9.0.20                        ........#service 删除,deployment、pod一并删除[root@k8s-master01 service]# kubectl delete -f clusterip-demo.yml deployment.apps "clusterip-demo" deletedservice "clusterip-sevcice-demo" deleted[root@k8s-master01 service]# kubectl get podNo resources found in default namespace.

2.3 NodePort

实际应用中我们不可能全部都是集群内部访问,肯定也需要集群外部访问,ClusterIP无法满足需求,而NodePort 可以通过实现方案。其原理是在node上开一个端口,将向该端口的流量导入到kube-proxy,然后由 kube-proxy 进一步到给对应的 pod.

案例演示:

资源文件:

apiVersion: apps/v1kind: Deploymentmetadata:  name: nodeport-demo  labels:    app: nodeport-demospec:  replicas: 1  template:    metadata:      name: nodeport-demo      labels:        app: nodeport-demo    spec:      containers:        - name: nodeport-demo          image: tomcat:9.0.20-jre8-alpine          imagePullPolicy: IfNotPresent          ports:            - containerPort: 8080      restartPolicy: Always  selector:    matchLabels:      app: nodeport-demo---apiVersion: v1kind: Servicemetadata:  name: nodeport-service-demospec:  selector:    app: nodeport-demo #注意与pod的标签保持一致(编写时忘了,坑了15分钟)  ports:    - port: 9090 #集群内部访问ip      targetPort: 8080 #映射pod内容器端口      nodePort: 30088 #集群外部访问端口  type: NodePort

部署service

#部署[root@k8s-master01 service]# kubectl apply -f nodeport-demo.yml deployment.apps/nodeport-demo createdservice/nodeport-service-demo created#查看service 注意虚拟ip 10.1.253.107[root@k8s-master01 service]# kubectl get serviceNAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGEkubernetes              ClusterIP   10.1.0.1               443/TCP          4d1hnodeport-service-demo   NodePort    10.1.253.107           9090:30088/TCP   8s#集群内部通过curl访问,能访问到tomcat首页[root@k8s-master01 service]# curl 10.1.253.107:9090                    Apache Tomcat/9.0.20                .....

集群外部通过浏览器访问 http://192.168.223.131:30088(master)和http://192.168.223.132:30088/(work)

2.3 LoadBalancer(收费的没法玩了)

LoadBalancer类型的service 是可以实现集群外部访问服务的另外一种解决方案。不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型。负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过Service的status.loadBalancer字段被发布出去。

apiVersion: v1kind: Servicemetadata: name: service-davidspec: ports:  - port: 3000    protocol: TCP    targetPort: 443    nodePort: 30080 selector:   run: pod-david  type: LoadBalancer

2.4 ExternalName(很少用)

类型为 ExternalName 的service将服务映射到 DNS 名称,而不是典型的选择器,例如my-service或者cassandra。可以使用spec.externalName参数指定这些服务。

kind: ServiceapiVersion: v1metadata: name: service-davidspec: ports:  - port: 3000    protocol: TCP    targetPort: 443   type: ExternalName   externalName: www.david.com

k8s nodeport无法访问_k8s学习之service详解相关推荐

  1. k8s拉取镜像规则_【大强哥-k8s从入门到放弃13】Service详解

    一.何为ServiceService 是一个应用服务抽象,定义了 Pod 逻辑集合和访问这个 Pod 集合的策略. Service 代理 Pod 集合对外表现是为一个访问入口,分配一个集群 IP 地址 ...

  2. 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard

    笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...

  3. awk命令详解_python学习之利用urllib和urllib2访问http的GET/POST详解

    前言 本文主要给大家介绍了关于python如何学习访问http的GET/POST的相关内容,使用urllib和urllib2,可以轻松实现对http的访问,下面话不多说了,来一起看看详细的介绍吧. 示 ...

  4. Kubernetes Service详解(概念、原理、流量分析、代码)

    Kubernetes Service详解(概念.原理.流量分析.代码) 作者: liukuan73 原文:https://blog.csdn.net/liukuan73/article/details ...

  5. kubernetes,service详解下

    kubernetes,service详解下 HeadLiness类型的Service 在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,k ...

  6. 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) By 李泽南2017年6月26日 15:57 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:Te

    深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) 机器之心 2017-06-25 12:27 阅读:108 摘要:参与:李泽南.李亚洲本周一(6月19日)机器之心发表文章<我的深 ...

  7. mysql dba系统学习-数据库事务详解

    mysql dba系统学习-数据库事务详解 上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉, ...

  8. android service是什么,Android service是什么 Android service详解

    Android service是什么 Android service详解 时间:2017-04-06     来源:Android开发学习网 什么是Android Service? service是A ...

  9. java stopself_Android Service详解(二)---StartService

    一丶概述 启动服务由另一个组件通过调用 startService() 启动,这会导致调用服务的 onStartCommand() 方法. 服务启动之后,其生命周期即独立于启动它的组件,并且可以在后台无 ...

最新文章

  1. Keepalived Nginx 高可用性配置
  2. Gini指数、Gini系数、Gini不纯是一回事吗?
  3. 除了芯片 我们还应关注哪些核心技术
  4. GTK+ VS MFC
  5. php判断数组是否存在字符串中,php判断数组元素中是否存在某个字符串的方法_php技巧...
  6. Silverlight 布局控件
  7. 公众号第三方平台开发 - 教程五 代公众号发起网页授权源码
  8. 【Android自定义View】Bitmap的绘制和颜色滤镜
  9. 马云等第一代互联网创始人退休,BAT 谁来接手?| 畅言
  10. java属性定义_Java管理扩展指南--几分钟带你理解MBean
  11. 寒假作业1 打印沙漏
  12. Java后台开发入门
  13. Mysql 纵表转换为横表
  14. java 实现:求有序数组绝对值最小的数
  15. 2017-08-25阿里校招笔试题---菜鸟仓库
  16. Python学习(3)计算个人所得税
  17. 基于RBAC 的SAAS系统权限设计
  18. c语言课设菜单,c语言课程设计菜单
  19. Codeforces Round #552 (Div. 3) E stl模拟 F dp G gcd
  20. DailyFi - 9.23|Dapper Labs 完成2.5亿美元融资,Vera 在 Polkastarter 上启动IDO

热门文章

  1. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
  2. LeetCode简单题之最长和谐子序列
  3. LeetCode简单题之拥有最多糖果的孩‭子
  4. Laravel Dcat Admin 安装
  5. Lumen框架多数据库连接配置方法
  6. [JAVA EE]ajax 方式提交数据
  7. 整数n的倒数第k个数字
  8. python 中 is 与 == 的区别
  9. 004_常用词汇句子翻译记录
  10. Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...