在上一篇文章中我们了解了如何在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 servicesNAME ????????CLUSTER-IP ??EXTERNAL-IP ??PORT(S) ??AGEkubernetes ??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=9000deployment "sonar" created[root@host31 ~]#
- 1
- 2
- 3
创建后确认,此时生成了pod和deployment,但是还没有生成service
[root@host31 ~]# kubectl get podsNAME ????????????????????READY ????STATUS ?????????????RESTARTS ??AGEsonar-2095694103-eqyxe ??1/1 ??????Running ????????????0 ?????????7ssonar-2095694103-htvml ??0/1 ??????ContainerCreating ??0 ?????????7s[root@host31 ~]# kubectl get deploymentsNAME ?????DESIRED ??CURRENT ??UP-TO-DATE ??AVAILABLE ??AGEsonar ????2 ????????2 ????????2 ???????????2 ??????????14s[root@host31 ~]# kubectl get servicesNAME ????????CLUSTER-IP ??EXTERNAL-IP ??PORT(S) ??AGEkubernetes ??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 9000service "sonar" exposed[root@host31 ~]#
- 1
- 2
- 3
生成后确认
[root@host31 ~]# kubectl get servicesNAME ????????CLUSTER-IP ????EXTERNAL-IP ??PORT(S) ???AGEkubernetes ??10.0.0.1 ??????<none> ???????443/TCP ???11hsonar ???????10.0.186.102 ??<nodes> ??????9000/TCP ??16s[root@host31 ~]#[root@host31 ~]# kubectl describe servicesName: ??????????????????kubernetesNamespace: ?????????????defaultLabels: ????????????????component=apiserver ???????????????????????provider=kubernetesSelector: ??????????????<none>Type: ??????????????????ClusterIPIP: ????????????????????10.0.0.1Port: ??????????????????https ??443/TCPEndpoints: ?????????????192.168.32.31:6443Session Affinity: ??????ClientIPNo events.Name: ??????????????????sonarNamespace: ?????????????defaultLabels: ????????????????app=sonarqubeSelector: ??????????????app=sonarqubeType: ??????????????????NodePortIP: ????????????????????10.0.186.102Port: ??????????????????<unset> 9000/TCPNodePort: ??????????????<unset> 30097/TCPEndpoints: ?????????????10.42.0.1:9000,10.44.0.1:9000Session Affinity: ??????NoneNo 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=sonarqubeNAME ????????????????????READY ????STATUS ???RESTARTS ??AGEsonar-2095694103-eqyxe ??1/1 ??????Running ??0 ?????????3msonar-2095694103-htvml ??1/1 ??????Running ??0 ?????????3m[root@host31 ~]#[root@host31 ~]#[root@host31 ~]# kubectl get services -l app=sonarqubeNAME ?????CLUSTER-IP ????EXTERNAL-IP ??PORT(S) ???AGEsonar ????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
原文地址:https://www.cnblogs.com/firsttry/p/10295017.html