乐趣区

关于kubernetes:Docker与k8s的恩怨情仇七-服务发现大法让你的内外交互原地起飞

转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。

在上节中咱们介绍了活字格私有云版在 k8s 上部署,以及如何实现容器之间的编排与管理控制。为了进一步实现内外交互调用,则须要实现服务发现的性能。也就是咱们后面提到“人与狗”之间的关系。

做过微服务的同学可能理解过什么叫服务发现,spring cloud 我的项目中的 Eureka 框架就是实现这个性能的,其次要工作就是注册外部的服务,以供其余集群的服务能够调用、拜访这个服务。

 

咱们正当猜想 Kubernetes 的存在很有可能激发了各种微服务框架产生服务发现机制。

在 Kubernetes 中服务发现对应的模块是 Service 与 Ingress,接下来,咱们别离来说说这两个性能。

Service 与 Ingress

Service 相似于服务的注册性能。

 

其逻辑很简略,在 kubernetes 申明一个服务,从而生成一个 VIP(虚构网络),所有 Kubernetes 集群中的其余组件,都能够通过这个 VIP 来拜访这个服务,并且这个服务是不会随 Service 的扭转而扭转的,只有创立就是终生存在。

Service

而服务的内容是什么呢?这部分和上述的 Deployment 一样,是通过 selector 选择器确定的。咱们能够通过下述 yaml 来创立一个服务:

apiVersion: v1

kind: Service

metadata:

  name: hostnames

spec:

  selector:

    app: hostnames

  ports:

  - name: default

    protocol: TCP

    port: 80

    targetPort: 9376

通过上一篇的介绍,咱们能够理解这个服务所须要代理的内容是 app==hostnames 的 Pod。同时这里也有一个新的字段 ports,这个字段是阐明该代理的服务的申请形式(protocol)、对外裸露的端口(port)、外部的端口(targetPort)别离是什么。

 

咱们能够通过这个 sample-service.yaml 的文件创建一个 Service 并且查看一个 Service:


# 创立

kubectl apply -f sample-service.yaml

 

# 查看

kubectl get services hostnames

在这个 service 中存在一个 ClusterIP,这个 IP 就是这个 Service 生成的 VIP,在集群外部的其余成员,都能够通过这个 VIP 来拜访这个 Service。然而因为咱们当初没有任何的具体服务让这个 Service 代理,因而当初申请这个 IP 是不会胜利的。

 

那么,咱们须要为这个 Service 创立一个具体实现:以下的 sample-deployment.yaml 文件是创立一个多正本的 Pod,其 Pod 的性能是返回本人的 podname:


apiVersion: apps/v1

kind: Deployment

metadata:

  name: hostnames

spec:

  selector:

    matchLabels:

      app: hostnames

  replicas: 3

  template:

    metadata:

      labels:

        app: hostnames

    spec:

      containers:

      - name: hostnames

        image: k8s.gcr.io/serve_hostname

        ports:

        - containerPort: 9376

          protocol: TCP

~

在这段代码中,咱们把容器的 9376 端口裸露的进去,因为这个 Pod 是通过这个端口与内部通行的。同样咱们执行以下命令创立和查看这个 pod 正本:

# 创立

kubectl apply -f sample-deployment.yaml

 

# 查看

kubectl get pods -l app=hostnames

在这部分内容中能够看到这个 pod 正本曾经创立胜利了。此时,依据我上一节所说的控制器模式,Service 也有对应的解决 Service 的控制器,其外部发现了有满足 app==hostnames 的服务,行将这个服务和 Service 进行了绑定。此时,咱们就能够通过任意一台集群内的主机来申请方才上文中的 ClusterIP:

在这一部分能够看到,咱们进行了很屡次申请,然而每次返回的后果都不同,这是因为 Service 在其外部通过网络插件(CNI)做了负载平衡解决,所以咱们能够通过 Service 来实现的负载平衡性能。

学习过程中的“误入歧路”

在学习理解这部分内容的时候,我始终有一个误会:认为 Service 是必须对应 Deployment 这种 Pod 的编排控制器对象能力工作的,所以把 Service –> Deployment –> Pods 这条逻辑关系熟记于心,但这种了解其实是谬误的。

 

在 Kubernetes 中,每个性能组件各司其职,他们只会解决本人该做的事,比方这里,Service 绑定 Pod 所依赖的是选择器中的 app==hostnames,而这个定义是呈现在 Deployment 中定义在 Pod 中的,因而 Service 和 Deployment 齐全没有关系,它们俩谁也不意识谁,关系能够用下图来形容:

并且,在之前的学习中还谬误地认为负载平衡服务是由 Deployment 提供的,其实这个性能是 Service 中的网络插件来解决的,并且用户同样也能够自定义应用的网络查件或者负载平衡算法是什么,Kubernetes 给了用户足够大的自由度。

Ingress

有了 Service 之后,咱们的服务就能够在集群中随便拜访达到服务之间的交换关系了,然而要想让咱们的服务让最终的用户拜访到,咱们还须要最初一个组件 Ingress。

 

Ingress 是 Kubernetes 中的反向代理服务,它能够解析配置的域名指向到咱们外部的 Service 中,其定义能够通过下述的 yaml 来实现:

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: sample-ingress

spec:

  rules:

  - host: hostname.sample.com

    http:

      paths:

      - path: /

        backend:

          serviceName: hostnames

          servicePort: 80

上述代码中,咱们将 hostname.sample.com 这个域名指向了方才定义的 hostnames 这个 Service。通过这样的操作,咱们的服务便就能够通过定义域名配置供内部的服务进行拜访了。而 Ingress 的创立命令,也和后面所说的一样:

kubectl apply -f sample-ingress.yaml

 

有了这部分配置,咱们的性能原则上就可能让内部拜访了。但在理论利用中咱们本地没有可供测试的环境,本地的 Kubernetes 环境是通过 kindD 生成的,其外围是多个 Docker Container 而不是多台机器。上述内容在 Container 外部运行,是应用 Docker 模仿 Kubernetes 的性能,因而这也是本文中惟一无奈验证胜利的一个功能模块。

残缺部署一个活字格利用

通过上节咱们一起学习了 Pod 间的编排控制器的应用,本节中实现了内外交互调用,进一步实现服务发现的性能,咱们当初就能够再次回到之前提出的问题:到底如何胜利部署一个活字格利用。

 

通过介绍整个 Kubernetes 的根底应用的流程,咱们能够看到一个服务在 Kubernetes 变成 Pod,通过 Deployment 部署,通过 Service 服务发现,通过 Ingress 反向代理的全过程,通过这些模块的协力配合之后,咱们的活字格利用终于能够部署在这个 Kubernetes 集群中了。

心愿这张图片展现,可能为大家带来更加直观的感觉。

 

总结

截止到本章,咱们曾经残缺介绍了活字格私有云版做 k8s 部署的全过程。下一节将会为大家带来本系列文章的最初一篇——Kubernetes 总览,让大家对 Kubernetes 集群内容局部有一个整体性印象,对一些深层次性能做一个总结。

 

感兴趣的小伙伴不要错过~ 咱们下篇接着聊。

退出移动版