k8s service对象 k8s service对象

k8s service对象

 

概述

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

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

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

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

复制代码
[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文件

[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中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自己设计的一种编程方式的特殊路由规则

概述

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

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

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

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

复制代码
[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文件

[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中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自己设计的一种编程方式的特殊路由规则

猜你喜欢

转载自www.cnblogs.com/it-peng/p/11584448.html