码迷,mamicode.com
首页 > Web开发 > 详细

kubernetes1 4 基础篇 Learn Kubernetes 1 4 by 6 steps(5) Step 4

时间:2019-01-20 15:53:08      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:负载均衡   scribe   键值   oar   yam   ready   集群   str   人工智能   

在上一篇文章中我们了解了如何在kubectl get/describe等确认进一步的信息以进行故障排除等,本文我们将围绕kubernetes中的lable和service两个概念展开。

Kubernetes Services

Pod在整个集群中有他们自己的惟一IP,但是这些IP是不对Kubernetes外部暴露的,换句话说,外部是无法直接访问它们的.
而且我们还需要考虑在使用的过程中,这些pod有可能会发生很多变化,被停止,被删除,被其他pod替换等,比如被删除之后IP就不存在了,如何访问呢?加之总体的pod的量可能会非常之大,因此我们需要一种方式让pod和应用能够自动的发现彼此.

Kubernetes使用service的概念将pod分组,service是一个逻辑上的抽象层,然后在此基础上进行对外提供访问的接口同时使得负载均衡和服务发现变得可能.

Kubernetes支持如下LoadBalancer和NodePort两种方式对外提供服务访问

类型说明
LoadBalancer 此种应用场景一般在于当部署kubernetes到云上得时候为最多。一般云服务商会提供外接的负载均衡器(LoadBalancer), 这种方式需要指定一个公共的IP地址。
NodePort 在所有的node上使用相同的port暴露服务,最为直接的可以理解的结果是使用任何一个Node的IP加此Port的URL即可访问

理解了这些之后,我们再来重新审视一下service在kubernetes中的使用方式. 如下图所示我们有Service A和Service B两个服务. Service A由一个pod组成,而Service B由3个port分别在两个node上所组成,每个pod都有集群内部所提供的唯一IP,但是对外则通过Service层所提供的对外接口的IP. 在前面讲过的Deployment和Service的关系在此也可以看得更加清楚,Service A和Deployment A之间实现互关联的,在使用yaml文件创建kubernetes的Deployment时候为什么同时也创建了一个service,就是希望能够访问dashboard而已。现在再看一下kubernetes-dashboard.yaml的内容你会发现其实那里面就是kind: Deployment和kind: Service的定义而已,自然会两个都创建。

技术分享图片

service职责

负载均衡

Service是一组pod在逻辑意义上所组成的抽象层,它能够在这一层上进行整体的协调,负载均衡是其中的一个作用。在service由多个pod组成的时候这个功能变得非常有用。

服务发现

service同时也负责在整个集群之内的服务发现,后面我们会进一步展开相关内容。

Lable

Service在kubernetes中扮演的这样重要的一个角色,Service是一组pod在逻辑意义上所组成的抽象层,它是如何将pod进行分组的,答案就是Lable。

Label是key/value的可以设定到pod上的键值对,使用Lable对pod进行分组,而Service使用Lable Selector对其所用到的lable进行选择,这样就将pod进行了分组和设定。
使用lable可以使得这些pod逻辑意义上的组合更具实际意义,更加可读,比如:

  • 环境:production, test, dev
  • 版本:beta, v1.3
  • service/server类型:frontend, backend, database

下面这张图则非常清晰地描述了Lable是在service中尽职尽责的。

技术分享图片

sonarqube是在很多项目中都会用到的一个可以完成代码审查等功能的开源平台,lable和service在kubernetes中是如何使用的,接下来我们将会利用kubectl来演示一下如何将sonarqube导入进去。

事前确认

没有任何sonar相关的deployment和service以及pod在运行

[root@host31 ~]# kubectl get pods
[root@host31 ~]# kubectl get deployments
[root@host31 ~]# kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.0.0.1     <none>        443/TCP   11h
[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

创建一个Deployment

注意label在此处的使用,–lables指定要设定到其上的Label为app=sonarqube

[root@host31 ~]# kubectl run sonar --replicas=2 --labels="app=sonarqube" --image=docker.io/sonarqube  --port=9000
deployment "sonar" created
[root@host31 ~]#
  • 1
  • 2
  • 3

创建后确认,此时生成了pod和deployment,但是还没有生成service

[root@host31 ~]# kubectl get pods
NAME                     READY     STATUS              RESTARTS   AGE
sonar-2095694103-eqyxe   1/1       Running             0          7s
sonar-2095694103-htvml   0/1       ContainerCreating   0          7s
[root@host31 ~]# kubectl get deployments
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
sonar     2         2         2            2           14s
[root@host31 ~]# kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.0.0.1     <none>        443/TCP   11h
[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

生成service

[root@host31 ~]# kubectl expose deployment/sonar --type="NodePort" --port 9000
service "sonar" exposed
[root@host31 ~]#
  • 1
  • 2
  • 3

生成后确认

[root@host31 ~]# kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.0.0.1       <none>        443/TCP    11h
sonar        10.0.186.102   <nodes>       9000/TCP   16s
[root@host31 ~]#
[root@host31 ~]# kubectl describe services
Name:                   kubernetes
Namespace:              default
Labels:                 component=apiserver
                        provider=kubernetes
Selector:               <none>
Type:                   ClusterIP
IP:                     10.0.0.1
Port:                   https   443/TCP
Endpoints:              192.168.32.31:6443
Session Affinity:       ClientIP
No events.

Name:                   sonar
Namespace:              default
Labels:                 app=sonarqube
Selector:               app=sonarqube
Type:                   NodePort
IP:                     10.0.186.102
Port:                   <unset> 9000/TCP
NodePort:               <unset> 30097/TCP
Endpoints:              10.42.0.1:9000,10.44.0.1:9000
Session Affinity:       None
No events.[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

使用label确认

[root@host31 ~]# kubectl get pods -l app=sonarqube
NAME                     READY     STATUS    RESTARTS   AGE
sonar-2095694103-eqyxe   1/1       Running   0          3m
sonar-2095694103-htvml   1/1       Running   0          3m
[root@host31 ~]#
[root@host31 ~]#
[root@host31 ~]# kubectl get services -l app=sonarqube
NAME      CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
sonar     10.0.186.102   <nodes>       9000/TCP   3m
[root@host31 ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Sonarqube画面

技术分享图片

Dashboard确认

技术分享图片

技术分享图片

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

kubernetes1 4 基础篇 Learn Kubernetes 1 4 by 6 steps(5) Step 4

标签:负载均衡   scribe   键值   oar   yam   ready   集群   str   人工智能   

原文地址:https://www.cnblogs.com/firsttry/p/10295017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!