Kubernetes系列之五:使用yaml文件创建service向外暴露服务
系列链接
Kubernetes系列之一:在Ubuntu上快速搭建一个集群Demo
Kubernetes系列之二:将Slave节点加入集群
Kubernetes系列之三:部署你的第一个应用程序到k8s集群
Kubernetes系列之四:使用yaml文件创建deployment来部署一个应用程序到k8s集群
Kubernetes系列之五:使用yaml文件创建service向外暴露服务
Kubernetes系列之六:安装k8s通用的Web UI(Dashboard)
Kubernetes系列之N:使用K8s遇到的问题
Service和Pod的理论介绍,方便继续下去
Pod是有生命周期的,使用凡人皆有一死来描述pod很贴切,当一个工作节点(node)销毁时,节点上运行的pods也会被销毁, ReplicationController会动态地在其他节点上创建Pod来保持应用程序的运行,每一个Pod都有一个独立的IP地址,甚至是同一个节点上的Pod,可以看出Pod的IP是动态的,它随Pod的创建而创建,随Pod的销毁而消失,这就引出一个问题:如果由一组Pods组合而成的集群来提供服务,那如何访问这些Pods呢?
Kubenetes的Service就是用来解决这个问题的。一个Service可以看作一组提供相同服务的Pods的对外访问接口,Service作用于哪些Pods是通过label selector来定义的,这些Pods能被Service访问,Pod之间的发现和路由(如应用中的前端和后端组件)由Kubernetes Service处理。
Service有四种type: ClusterIP(默认)、NodePort、LoadBalancer、ExternalName. 其中NodePort和LoadBalancer两类型的Services可以对外提供服务。
使用yaml文件创建Service(NodePort)
这里使用yaml文件来创建NodePort类型的Service,service.yaml文件内容如下:
---
apiVersion: v1
kind: Service
metadata:name: kube-node-servicelabels:name: kube-node-service
spec:type: NodePort #这里代表是NodePort类型的ports:- port: 80 #这里的端口和clusterIP(10.97.114.36)对应,即10.97.114.36:80,供内部访问。targetPort: 8081 #端口一定要和container暴露出来的端口对应,nodejs暴露出来的端口是8081,所以这里也应是8081protocol: TCPnodePort: 32143 # 所有的节点都会开放此端口,此端口供外部调用。selector:app: web #这里选择器一定要选择容器的标签,之前写name:kube-node是错的。
执行命令创建一个service,并列出所有的services
root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl create -f service.yaml
service/kube-node-service createdroot@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-node-service NodePort 10.97.114.36 <none> 80:32143/TCP 7s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d
我们来验证一下创建的service是否正确,执行如下命令
root@kube-master:/home/cong/Desktop/NodeDemo1# curl localhost:32143
Hello World!# 由于定义的port是80,所以直接访问clusterIP
root@kube-master:/home/cong/Desktop/NodeDemo1# curl 10.97.114.36
Hello World!
可以看到以上这些端口都可以访问我们的应用程序,在每个节点查看端口执行netstat -ntlp,发现每个节点都开放出了端口32143,此端口主要是给外部分用户调用的。尝试访问两个slave节点试试,他们都可以显示出Hello World!,命令如下:
#在master节点上查看slave node的ip
root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kube-master Ready master 7d v1.11.1 192.168.29.138 <none> Ubuntu 16.04.4 LTS 4.13.0-36-generic docker://17.3.2
kube-slave-1 Ready <none> 1d v1.11.1 192.168.29.141 <none> Ubuntu 16.04.4 LTS 4.13.0-36-generic docker://17.3.2
kube-slave-3 Ready <none> 7d v1.11.1 192.168.29.139 <none> Ubuntu 16.04.4 LTS 4.15.0-30-generic docker://17.3.2#在master节点上,查看所有pods
root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kube-node-64f4f68d4b-sttz2 1/1 Running 0 15m 10.244.1.71 kube-slave-3
kube-node-64f4f68d4b-vwwt2 1/1 Running 0 1d 10.244.1.69 kube-slave-3#在master节点上,访问两个pods,端口都是8081
root@kube-master:/home/cong/Desktop/NodeDemo1# curl 10.244.1.71:8081
Hello World!
root@kube-master:/home/cong/Desktop/NodeDemo1# curl 10.244.1.69:8081
Hello World!#在slave节点kube-slave-1上访问32143端口
root@kube-slave-1:/home/cong# curl 192.168.29.141:32143
Hello World!#在slave节点kube-slave-3上访问32143端口
root@kube-slave-3:/home/cong# curl 192.168.29.139:32143
Hello World!
至此,我们的service就创建并验证成功了,此时你可能迷惑在service.yaml中定义的port(80), tartget port(8081), nodePort(32143)这三个端口是什么关系呢,这里有点绕,先看下图:
注意上图里面的IP和端口和笔者用的端口不一致,但此图大致描述了上面三个端口之间的关系。首先外部使用load balancer访问我们的两个slave节点(192.168.29.141:32143) 和 (192.168.29.139:32143),接着它会访问Service,即ClusterIP(10.97.114.36:80), Service再通过load balancer访问到某一个pod(端口8081)里的container(端口8081)。 这里第二个load balancer是由kube-proxy来负责的,官方的描述是:kube-proxy负责为service提供cluster内部的服务发现和负载均衡。
实际上,我们还另一种创建service的方式,更快更便捷,即使用expose命令来创建service,如下:
root@kube-master:/home/cong# kubectl expose deployment kube-node --type=NodePort
service/kube-node exposedroot@kube-master:/home/cong# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-node NodePort 10.107.247.158 <none> 8081:31195/TCP 10s
kube-node-service NodePort 10.97.114.36 <none> 80:32143/TCP 1d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
nginx NodePort 10.99.22.64 <none> 80:32322/TCP 2droot@kube-master:/home/cong# curl localhost:31195
Hello World!root@kube-master:/home/cong# curl 10.107.247.158:8081
Hello World!root@kube-master:/home/cong# kubectl describe services/kube-node
Name: kube-node
Namespace: default
Labels: app=web
Annotations: <none>
Selector: app=web
Type: NodePort
IP: 10.107.247.158
Port: <unset> 8081/TCP
TargetPort: 8081/TCP
NodePort: <unset> 31195/TCP
Endpoints: 10.244.1.71:8081,10.244.2.81:8081 #这里podIp+端口号就是endpoint
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>root@kube-master:/home/cong# kubectl describe services/kube-node-service
Name: kube-node-service
Namespace: default
Labels: name=kube-node-service
Annotations: <none>
Selector: app=web
Type: NodePort
IP: 10.97.114.36
Port: <unset> 80/TCP
TargetPort: 8081/TCP
NodePort: <unset> 32143/TCP
Endpoints: 10.244.1.71:8081,10.244.2.81:8081 #虽然暴露了两个service,但endpoint是一样滴。
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
可以看出,expose命令这里并没有指定clusterIP,说明它是K8S系统中的虚拟IP地址,由系统动态分配。Pod的IP地址是由flannel插件来分配的,而不再由Docker Daemon根据docker0网桥的IP地址进行分配。可以在任意节点上输入ifconfig可以看到。
使用yaml文件创建Service(LoadBalancer)
这里我们继续expose命令创建loadBalancer类型的service,命令如下:
service "kube-node" deleted
root@kube-master:/home/cong# kubectl expose deployment kube-node --type=LoadBalancer
service/kube-node exposedroot@kube-master:/home/cong# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-node LoadBalancer 10.99.201.195 <pending> 8081:31585/TCP 10s
kube-node-service NodePort 10.97.114.36 <none> 80:32143/TCP 1d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
nginx NodePort 10.99.22.64 <none> 80:32322/TCP 2droot@kube-master:/home/cong# curl localhost:31585
Hello World!root@kube-master:/home/cong# curl 10.99.201.195:8081
Hello World!root@kube-master:/home/cong# kubectl describe services/kube-node
Name: kube-node
Namespace: default
Labels: app=web
Annotations: <none>
Selector: app=web
Type: LoadBalancer
IP: 10.99.201.195
Port: <unset> 8081/TCP
TargetPort: 8081/TCP
NodePort: <unset> 31585/TCP
Endpoints: 10.244.1.71:8081,10.244.2.81:8081
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
当然我们也可以使用yaml文件来创建,service-lb.yaml文件如下:
---
apiVersion: v1
kind: Service
metadata:name: kube-node-service-lblabels:name: kube-node-service-lb
spec:type: LoadBalancerclusterIP: 10.99.201.198ports:- port: 80targetPort: 8081protocol: TCPnodePort: 32145selector:app: web
status:loadBalancer:ingress:- ip: 192.168.174.127 #这里是云服务商提供的负载匀衡器的IP地址
执行命令:
root@kube-master:/home/cong/Desktop/NodeDemo1# kubectl create -f service-lb.yaml
service/kube-node-service-lb createdroot@kube-master:/home/cong/Desktop/NodeDemo1# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-node LoadBalancer 10.99.201.195 <pending> 8081:31585/TCP 21m
kube-node-service NodePort 10.97.114.36 <none> 80:32143/TCP 1d
kube-node-service-lb LoadBalancer 10.99.201.198 <pending> 80:32145/TCP 9s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8d
nginx NodePort 10.99.22.64 <none> 80:32322/TCP 2droot@kube-master:/home/cong/Desktop/NodeDemo1# curl 10.99.201.195:8081
Hello World!root@kube-slave-3:/home/cong# curl localhost:31585
Hello World!
好了,到这里,你已经掌握了service及yaml的基本用法了,加油
Kubernetes系列之五:使用yaml文件创建service向外暴露服务相关推荐
- kubernetes实践之五:深入理解Service及内部DNS搭建
一.Service存在的意义: 防止Pod失联(服务发现) 定义一组Pod的访问策略(负载均衡) 支持ClusterIP,NodePort以及LoadBalancer三种类型 Service的底层实现 ...
- kubernetes系列之五:IPVS概览
一.前言 IPVS是基于TCP四层(IP+端口)的负载均衡软件. IPVS会从TCP SYNC包开始为一个TCP连接所有的数据包建立状态跟踪机制,保证一个TCP连接中所有的数据包能到同一个后端.所以I ...
- 使用yaml文件创建deployment来部署一个应用程序到k8s集群
作者: wucong60 原文: https://blog.csdn.net/wucong60/article/details/81586272 系列链接 Kubernetes系列之一:在Ubuntu ...
- Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务
一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...
- Kubernetes系列之理解K8s Service的几种模式
原文地址:Kubernetes系列之理解K8s Service的几种模式 今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0 ...
- Kubernetes生产实践系列之二十三:Service Mesh之在Kubernetes部署Istio进行service mesh
一.前言 演进到今天,Istio已经明确了作为ServiceMesh基础设施,它的主要服务能力包括: 在之前的文章<kubernetes系列之十八:使用helm安装istio>中,基于Is ...
- kubernetes系列五之service管理
目录 Service基本概念 定义 Pod的特征 解决方案编辑 service模型 Endpoint Controller Kube-proxy iptables Kube-proxy IPVS 服 ...
- ANR系列之五:Service类型ANR原理讲解
前言: ANR系列文章一共有有若干篇, 遵循这样的一个顺序依次讲解: 1.先讲ANR的基本概念以及ANR发生后的流程: 2.四种类型的ANR是如何发生的: 3.该如何排查和解决ANR类型问题. 想看整 ...
- k8s三 | 使用YAML文件创建k8s资源对象
参考资料:从Docker到Kubernetes进阶-阳明 目录标题 一.YAML基础 1. Maps 2. Lists 二.使用Yaml创建k8s资源对象 1. 使用Yaml创建创建Pod 2. 使用 ...
最新文章
- 零基础怎么学习Java?
- 使用pt-online-schema-change 修复主从数据表数据不一致
- 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
- 享元模式源码解析(jdk+tomcat)
- linux下ora 01110,ORA-01003ORA-01110
- 中国计算机学会第七届全国Web信息系统及其应用学术会议(WISA2010)征文通知
- Java集合框架源码解读(1)——ArrayList、LinkedList和Vector
- easyui datagrid 表格不让选中(双层嵌套)
- math_等式不等式:平方开根号绝对值绝对值不等式放缩基本不等式均值不等式_一元二次方程复根
- 2020武理计专上岸,拿下一等奖学金的曲折经历分享
- java 向量 内积_向量内积(点乘)和外积(叉乘)概念及几何意义
- Android reboot那点事儿
- FAI自动部署debian
- 齐次式的相关知识【初级中阶辅导】
- 用Python写随机密码生成
- codeforces 596E Wilbur and Strings(DFS)
- 孙溟㠭篆刻作品《叶》
- 创作者基金 11 月亮点
- DTOJ 4745. 进制转换
- 中国港口码头市场运营分析及“十四五”规划建议报告2022年版
热门文章
- 使用elasticsearch文件搜索系统助力亚马逊解决方案架构师认证考试
- python:textwrap --文本自动换行与填充
- Holt Winter 指数平滑模型
- 趋势预测方法(五)Holt-Winters模型_时序递推预测
- python画图如何调整图例位置_python图例参数
- C++正则表达式(regex_match、regex_search与regex_replace)
- 想做价值数万的可视化图表?这款免费软件不能错过!
- excel查找命令_快速查找Excel功能区命令
- 其他——dhtmlxGantt甘特图API精华总结
- 数据交换技术:OPC技术工作原理简述