Kubernetes --(k8s) service +7层 ingress-nginx

service

  • Kubernete Service 是一个定义了一组Pod的策略的一种抽象:这个抽象是一个pod的逻辑分组,一种可以访问他们的策略。我们也有时候叫做宏观服务。
  • 这一组pod能够被service访问到,通常是通过Label Selector;我们知道pod的endpoint(pod ip+containerPort)会随着pod的销毁和重新创建而发生改变,新的pod的ip和旧的pod的ip不同,而label不会变,service会通过label selector 找到后端pod 。如下图:

  • service一旦被创建kunernetes就会为它创建一个可用的cluster ip,而且在service的整个生命周期内,它的cluster ip 不会发生改变;通过分析、识别并建模系统中所有服务为微服务----kubernetes service 我们系统最终有多个提供不同服务而又彼此独立的微服务单元组成的,服务之间通过TCP/IP进行通信;

  • 对于Kubernete原生的应用,Kubernete提供了一个简单的Endpoints API,这个Endpoints api的作用就是当一个服务中的pod发生变化时,Endpoints API随之变化,对于哪些不是原生的程序,Kubernetes提供了一个基于虚拟IP的网桥的服务,这个服务会将请求转发到对应的后台pod

service的类型

service在k8s中有以下4种类型
1、ClusterIp:默认类型,自动分配一个仅在Cluster内部可以访问的虚拟Ip (最常用)
2、NodePort:在ClusterIp基础上为service在每台机器(node)上绑定一个端口,这样就可以通过:Nodeport来访问该服务
3、LoadBalancer:在NodePort的基础上借助cloude provider 创建一个外部负载均衡器,并将请求转发到NodePort
4、ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型的代理被创建,这只有k8s1.7版本及以上的kube-dns支持


实验

第一步:编写部署nginx-svc的yml文件

╭─root@node1 ~  
╰─➤  vim nginx-svc.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
   name: nginx1
spec:
   replicas: 2
   template:
      metadata:
         labels:
           name: web # 标签 service  
      spec:
         containers:
         - name: nginx
           image: nginx
           ports:
           - containerPort: 80 # 暴露在pod的ip上的端口
---
apiVersion: v1
kind: Service
metadata:
   name: my-svc  
spec:
   selector:
      name: web  # 标签 labels
   ports:
   - port: 80 # service暴露的端口
     targetPort: 80  # pods的端口

第二步:运行yml文件

╭─root@node1 ~  
╰─➤  kubectl apply -f nginx-svc.yml 

第三步:查看标签

╭─root@node1 ~  
╰─➤  kubectl get po -o wide --show-labels
NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES   LABELS
nginx1-7f56c7b7f8-qxqbg   1/1     Running   0          2m33s   10.244.1.6    node2   <none>           <none>            name=web,pod-template-hash=7f56c7b7f8
nginx1-7f56c7b7f8-zjt9m   1/1     Running   0          2m33s   10.244.2.11   node3   <none>           <none>            name=web,pod-template-hash=7f56c7b7f8


指定namespace

查看namespace

╭─root@node1 ~  
╰─➤  kubectl get namespace
NAME              STATUS   AGE
default           Active   2d19h
kube-node-lease   Active   2d19h
kube-public       Active   2d19h
kube-system       Active   2d19h

编辑yml文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
   name: nginx1
   namespace: kube-system  # 指定namespace
spec:
   replicas: 2
   template:
      metadata:
         labels:
           name: web
      spec:
         containers:
         - name: nginx
           image: nginx
           ports:
           - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
   name: my-svc
   namespace: kube-system  # 指定namespace
spec:
   selector:
      name: web
   ports:
   - port: 80

其中:

  1. 通过DNS名称访问,只能在同一名称空间
  2. 如果不是同一名称空间,需要指定namespace

外网访问

第一步:修改yml文件

kind: Deployment
metadata:
   name: nginx1
spec:
   replicas: 2
   template:
      metadata:
         labels:
           name: web
      spec:
         containers:
         - name: nginx
           image: nginx
           ports:
           - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
   name: my-svc
spec:
   type: NodePort    # 选择service端口暴露方式
   selector:
      name: web
   ports:
   - port: 80
     targetPort: 80
     nodePort: 30007   #  端口选择范围 30000-32767

第二步:执行yml文件

╭─root@node1 ~  
╰─➤  kubectl apply -f nginx-svc.yml

第三步:查看svc

╭─root@node1 ~  
╰─➤  kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        2d19h
my-svc       NodePort    10.109.183.148   <none>        80:30007/TCP   9s

第四步:查看主机端口

╭─root@node1 ~  
╰─➤  ss -ntl |grep 30007
LISTEN     0      128         :::30007                   :::*  

ingress-nginx

service没有提供7层负载的能力,但是可以通过ingress-nginx实现

k8s-Ingress:HTTP7层路由机制:https://www.cnblogs.com/du-z/p/16164031.html

官 网:https://kubernetes.github.io/ingress-nginx/

posted @ 2019-08-21 15:00  du-z  阅读(360)  评论(0编辑  收藏  举报