什么是service和服务发现

什么是service

经过建立service,能够为一组具备相同功能的容器应用提供一个统一的入口地址,而且将请求负载到后端的各个容器上。将多个提供同一中服务的容器web

# kubectl create -f webapp.yaml
# kubectl get pods -l app=webapp -o yaml | grep podIP
复制代码

为了可使客户端可以访问到多个pod实列,须要建立一个service来提供服务。查看新建立的service,会发现其中生成一个虚拟的IP,而端口号测试从pod中复制而来,经过“vip:port”便可以对服务进行访问。请求则会被自动负载到后端的pod上。数据库

# kubectl expose rc webapp
# kebectl get svc 
复制代码

经过文件的建立也能够实现上述建立service,而文件中的端口也能够制定,但须要注意指定后端的端口,后端

# kebectl create -f webapp-svc.yaml
# kubectl get svc
复制代码

webapp-svc.yamlapi

apiVersion:v1
kind:Service
metadata:
    name: webapp
spec:
    ports: 
        - port: 8081
         targetPort: 8080
    selector:
        app: webapp

复制代码

多端口的service

有时一个服务须要对外提供多个端口,k8s容许在service对象上定义多个端口bash

apiVersion:v1
kind:Service
metadata:
    name: webapp
spec:
    ports: 
        - name: http
          protocol: TCP
          port: 80
          targetPort: 9999
        - name: https
          protocol: TCP
          port: 443
          targetPort: 9998
    selector:
        app: webapp

复制代码
注意:端口名称只能包含 小写字母数字字符 和 `-`。 端口名称还必须以字母数字字符开头和结尾。
复制代码

外部服务的service

在一些环境中,须要将数据库做为后端服务进行链接,或者将另外一个集群中的服务做为服务的后端,这时能够经过建立一个无lable selector的service来实现,即建立的service没法选择后端的pod,系统不会自动建立endpoint,须要手动建立一个和该service同名的endpoint,用来指向实际的后端地址。服务器

apiVersion:v1
kind:Service
metadata:
    name: myland
spec:
    ports: 
        - protocol: TCP 
          port: 80
          targetPort: 80

====================
endpoint配置文件
====================

apiVersion:v1
kind: Endpoints
metadata:
    name: myland
subsets:
- addresses: 
  - IP: 200.200.200.201 
  ports:
  - port: 80

复制代码

image

服务发现

两种基本的服务发现模式:环境变量和DNSmarkdown

环境变量

当pod运行在Node,kubelet为每个活跃的service添加环境变量。app

例如:一个名为“webapp-master”的service暴露TCP端口:8888,同时分配一个集群IP为10.0.0.101,其环境变量以下:webapp

WEBAPP_MASTER_SERVICE_HOST=10.0.0.101
WEBAPP_MASTER_SERVICE_PORT=8888
WEBAPP_MASTER_PORT=tcp://10.0.0.101:8888
WEBAPP_MASTER_PORT_8888_TCP=tcp://10.0.0.101:8888
WEBAPP_MASTER_PORT_8888_TCP_PROTO=tcp
WEBAPP_MASTER_PORT_8888_TCP_PORT=8888
WEBAPP_MASTER_PORT_8888_TCP_ADDR=10.0.0.101
复制代码

DNS

可使用组件为k8s集群设置DNS服务。支持集群的DNS服务器监视k8s API的新服务,并为每一个服务建立一组DNS记录。若是集群中都启用了DNS,则全部的pod均可以经过其DNS名称自动解析。k8s 还支持命名端口的 DNS SRV(服务)记录。k8s DNS 服务器是惟一的一种可以访问 ExternalName 类型的 Service 的方式。tcp

相关文章
相关标签/搜索