这是我参与更文挑战的第24天,活动详情查看:更文挑战。web
咱们一直在说K8s具有服务发现以及配置管理的能力,K8s是如何实现服务的注册与发现,而后如何作到服务的转发、实现负载均衡的。spring
其实服务在K8s中,也定义了一种资源:Service,Service,顾名思义是一个服务,什么样的服务呢?它是定义了一个服务的多种 pod 的逻辑合集以及一种访问 pod 的策略。ubuntu
service 的类型有四种:后端
从上面讲的 Service,咱们能够看到一种场景:全部的微服务在一个局域网内,或者说在一个 K8s 集群下,那么能够经过 Service 用于集群内 Pod 的访问,这就是 Service 默认的一种类型 ClusterIP,ClusterIP 这种的默认会自动分配地址。api
那么问题来了,既然能够经过上面的 ClusterIp 来实现集群内部的服务访问,那么如何注册服务呢?其实 K8s 并无引入任何的注册中心,使用的就是 K8s 的 kube-dns 组件。而后 K8s 将 Service 的名称当作域名注册到 kube-dns 中,每个Service在kube-dns中都有一条DNS记录,同时,若是有服务的ip更换,kube-dns自动会同步,对服务来讲是不须要改动的。经过 Service 的名称就能够访问其提供的服务。那么问题又来了,若是一个服务的 pod 对应有多个,那么如何实现 LB?其实,最终经过 kube-proxy,实现负载均衡。也就是说kube-dns经过 servicename 找到指定 clusterIP,kube-proxy完成经过 clusterIP 到 PodIP 的过程。markdown
说到这,咱们来看下 Service 的服务发现与负载均衡的策略,Service 负载分发策略有两种:app
下面写一个很简单的例子:负载均衡
apiVersion: v1
kind: Service
metadata:
name: cas-server-service
namespace: default
spec:
ports:
- name: cas-server01
port: 2000
targetPort: cas-server01
selector:
app: cas-server
复制代码
能够看到执行 kubectl apply -f service.yaml 后:微服务
root@ubuntu:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
admin-web-service ClusterIP 10.16.129.24 <none> 2001/TCP 84d
cas-server-service ClusterIP 10.16.230.167 <none> 2000/TCP 67d
cloud-admin-service-service ClusterIP 10.16.25.178 <none> 1001/TCP 190d
复制代码
这样,咱们能够看到默认的类型是 ClusterIP,用于为集群内 Pod 访问时,能够先经过域名来解析到多个服务地址信息,而后再经过 LB 策略来选择其中一个做为请求的对象。oop
接下来咱们看看微服务中场景的居多配置该如何来利用K8s实现统一管理。其实,在K8s中,定义了一种资源:ConfigMap,咱们来看看这种资源。
ConfigMap,看到这个名字能够理解:它是用于保存配置信息的键值对,能够用来保存单个属性,也能够保存配置文件。对于一些非敏感的信息,好比应用的配置信息,则可使用 ConfigMap。
建立一个 ConfigMap 有多种方式以下。
kubectl create configmap test-config --from-literal=baseDir=/usr
复制代码
上面的命令建立了一个名为 test-config,拥有一条 key 为 baseDir,value 为 "/usr" 的键值对数据。
apiVersion: v1
kind: ConfigMap
metadata:
name: test-config
data:
baseDir: /usr
复制代码
也能够这样,建立一个 yml 文件,选择不一样的环境配置不一样的信息:
kind: ConfigMap
apiVersion: v1
metadata:
name: cas-server
data:
application.yaml: |-
greeting:
message: Say Hello to the World
---
spring:
profiles: dev
greeting:
message: Say Hello to the Dev
spring:
profiles: test
greeting:
message: Say Hello to the Test
spring:
profiles: prod
greeting:
message: Say Hello to the Prod
复制代码
注意点:
固然,还有其余更多用途,具体能够参考官网(kubernetes.io/zh/docs/con…
前面讲述了几种建立ConfigMap的方式,其中有一种在 Java 中经常用到:经过建立 yml 文件来实现配置管理。好比:
kind: ConfigMap
apiVersion: v1
metadata:
name: cas-server
data:
application.yaml: |-
greeting:
message: Say Hello to the World
---
spring:
profiles: dev
greeting:
message: Say Hello to the Dev
spring:
profiles: test
greeting:
message: Say Hello to the Test
spring:
profiles: prod
greeting:
message: Say Hello to the Prod
复制代码
这样,当咱们启动容器时,经过 --spring.profiles.active=dev 来指定当前容器的活跃环境,便可获取 ConfigMap 中对应的配置。是否是感受跟 Java 中的 Config 配置多个环境的配置有点相似呢?可是,咱们不用那么复杂,这些通通能够交给 K8s 来处理。只须要你启动这一命令便可,是否是很简单?