系列链接

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向外暴露服务相关推荐

  1. kubernetes实践之五:深入理解Service及内部DNS搭建

    一.Service存在的意义: 防止Pod失联(服务发现) 定义一组Pod的访问策略(负载均衡) 支持ClusterIP,NodePort以及LoadBalancer三种类型 Service的底层实现 ...

  2. kubernetes系列之五:IPVS概览

    一.前言 IPVS是基于TCP四层(IP+端口)的负载均衡软件. IPVS会从TCP SYNC包开始为一个TCP连接所有的数据包建立状态跟踪机制,保证一个TCP连接中所有的数据包能到同一个后端.所以I ...

  3. 使用yaml文件创建deployment来部署一个应用程序到k8s集群

    作者: wucong60 原文: https://blog.csdn.net/wucong60/article/details/81586272 系列链接 Kubernetes系列之一:在Ubuntu ...

  4. Kubernetes 系列(三):Kubernetes使用Traefik Ingress暴露服务

    一.Kubernetes 服务暴露介绍 从 kubernetes 1.2 版本开始,kubernetes提供了 Ingress 对象来实现对外暴露服务:到目前为止 kubernetes 总共有三种暴露 ...

  5. Kubernetes系列之理解K8s Service的几种模式

    原文地址:Kubernetes系列之理解K8s Service的几种模式 今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0 ...

  6. Kubernetes生产实践系列之二十三:Service Mesh之在Kubernetes部署Istio进行service mesh

    一.前言 演进到今天,Istio已经明确了作为ServiceMesh基础设施,它的主要服务能力包括: 在之前的文章<kubernetes系列之十八:使用helm安装istio>中,基于Is ...

  7. kubernetes系列五之service管理

    目录 Service基本概念 定义 Pod的特征 解决方案​编辑 service模型 Endpoint Controller Kube-proxy iptables Kube-proxy IPVS 服 ...

  8. ANR系列之五:Service类型ANR原理讲解

    前言: ANR系列文章一共有有若干篇, 遵循这样的一个顺序依次讲解: 1.先讲ANR的基本概念以及ANR发生后的流程: 2.四种类型的ANR是如何发生的: 3.该如何排查和解决ANR类型问题. 想看整 ...

  9. k8s三 | 使用YAML文件创建k8s资源对象

    参考资料:从Docker到Kubernetes进阶-阳明 目录标题 一.YAML基础 1. Maps 2. Lists 二.使用Yaml创建k8s资源对象 1. 使用Yaml创建创建Pod 2. 使用 ...

最新文章

  1. 零基础怎么学习Java?
  2. 使用pt-online-schema-change 修复主从数据表数据不一致
  3. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
  4. 享元模式源码解析(jdk+tomcat)
  5. linux下ora 01110,ORA-01003ORA-01110
  6. 中国计算机学会第七届全国Web信息系统及其应用学术会议(WISA2010)征文通知
  7. Java集合框架源码解读(1)——ArrayList、LinkedList和Vector
  8. easyui datagrid 表格不让选中(双层嵌套)
  9. math_等式不等式:平方开根号绝对值绝对值不等式放缩基本不等式均值不等式_一元二次方程复根
  10. 2020武理计专上岸,拿下一等奖学金的曲折经历分享
  11. java 向量 内积_向量内积(点乘)和外积(叉乘)概念及几何意义
  12. Android reboot那点事儿
  13. FAI自动部署debian
  14. 齐次式的相关知识【初级中阶辅导】
  15. 用Python写随机密码生成
  16. codeforces 596E Wilbur and Strings(DFS)
  17. 孙溟㠭篆刻作品《叶》
  18. 创作者基金 11 月亮点
  19. DTOJ 4745. 进制转换
  20. 中国港口码头市场运营分析及“十四五”规划建议报告2022年版

热门文章

  1. 使用elasticsearch文件搜索系统助力亚马逊解决方案架构师认证考试
  2. python:textwrap --文本自动换行与填充
  3. Holt Winter 指数平滑模型
  4. 趋势预测方法(五)Holt-Winters模型_时序递推预测
  5. python画图如何调整图例位置_python图例参数
  6. C++正则表达式(regex_match、regex_search与regex_replace)
  7. 想做价值数万的可视化图表?这款免费软件不能错过!
  8. excel查找命令_快速查找Excel功能区命令
  9. 其他——dhtmlxGantt甘特图API精华总结
  10. 数据交换技术:OPC技术工作原理简述