概述
service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每个service其实就是咱们常常提起的微服务架构中的一个微服务,以前讲解Pod,RC等资源对象其实都是为讲解Kubernetes Service作铺垫的,下图为Pod,RC与Service的逻辑关系html
能够看到上面的架构图,service服务经过标签选择器定位后端pod,前提是service的selector必须和后端Pod标签对应上才能找到相对应的Pod,而前段frontend经过service就能够访问到后端提供服务的pod了,而service默认IP类型为主要分为:node
- ClusterIP:主要是为集群内部提供访问服务的
- NodePort:能够被集群外部所访问,访问方式为 宿主机:端口号
下面我建立了一个nginx服务和一个对外提供服务的service,以下:nginx
[root@master ~]# cat nginx.yaml apiVersion: v1 kind: Service metadata: name: serivce-mynginx namespace: default spec: type: NodePort selector: app: mynginx ports: - name: nginx port: 80 targetPort: 80 nodePort: 30080 --- apiVersion: apps/v1 kind: Deployment metadata: name: deploy namespace: default spec: replicas: 2 selector: matchLabels: app: mynginx template: metadata: labels: app: mynginx spec: containers: - name: nginx image: lizhaoqwe/nginx:v1 ports: - name: nginx containerPort: 80
执行yaml文件docker
[root@master ~]# kubectl create -f test.yaml service/serivce-mynginx created deployment.apps/deploy created
查看pod和service状态编程
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE deploy-696bccb9fd-9zk2f 1/1 Running 0 138m deploy-696bccb9fd-vcgs5 1/1 Running 0 138m [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h serivce-mynginx NodePort 10.103.92.182 <none> 80:30080/TCP 138m
验证后端
外部访问service的问题
为了更加深入理解kubernetes,咱们须要弄明白kubernetes里的3中IPapi
- NodeIP:NodeIP是kubernetes中每一个节点的物理网卡IP地址,是一个真实存在的物理网络,全部属于这个网络的服务器都能经过这个网络直接通信,包括集群外的主机访问集群内的主机也须要NodeIP
- PodIP:PodIP是每一个Pod地址,它是docker engine根据docker0网桥的IP地址进行分配的,一般是一个虚拟的二层网络,因此kubernetes里的一个Pod里的容器访问另一个Pod里的容器时,就是经过PodIP所在的虚拟二层网络进行通信的,而真实的TCP/IP流量是经过NodeIP所在的物理网卡流出的
- ClusterIP:他是一个虚拟的IP,但更像是一个“伪造”的IP网络,缘由有如下几点:
- ClusterIP仅仅做用于kubernetes service这个对象,并由kubernetes管理和分配ip地址
- ClusterIP没法被Ping,由于没有一个实体网络对象来响应
- ClusterIP只能结合service Port组成一个具体的通信端口,若是集群外想访问须要作一些额外的操做
- 在kubernets集群内,NodeIP、PodIP和ClusterIP网之间通信,采用的是kubernets本身设计的一种编程方式的特殊路由规则