k8s实战之Service

一、概述

  为了适应快速的业务需求,微服务架构已经逐渐成为主流,微服务架构的应用需要有非常好的服务编排支持,k8s中的核心要素Service便提供了一套简化的服务代理和发现机制,天然适应微服务架构,任何应用都可以非常轻易地运行在k8s中而无须对架构进行改动;

k8s分配给Service一个固定IP,这是一个虚拟IP(也称为ClusterIP),并不是一个真实存在的IP,而是由k8s虚拟出来的。虚拟IP的范围通过k8s API Server的启动参数 --service-cluster-ip-range=19.254.0.0/16配置;

虚拟IP属于k8s内部的虚拟网络,外部是寻址不到的。在k8s系统中,实际上是由k8s Proxy组件负责实现虚拟IP路由和转发的,所以k8s Node中都必须
运行了k8s Proxy,从而在容器覆盖网络之上又实现了k8s层级的虚拟转发网络。

服务代理:

  在逻辑层面上,Service被认为是真实应用的抽象,每一个Service关联着一系列的Pod。在物理层面上,Service有事真实应用的代理服务器,对外表现为一个单一访问入口,通过k8s Proxy转发请求到Service关联的Pod。

Service同样是根据Label Selector来刷选Pod进行关联的,实际上k8s在Service和Pod之间通过Endpoint衔接,Endpoints同Service关联的Pod;相对应,可以认为是Service的服务代理后端,k8s会根据Service关联到Pod的PodIP信息组合成一个Endpoints。

  #kubectl get service my-nginx
  #kubectl get pod --selector app=nginx
  k8s创建Service的同时,会自动创建跟Service同名的Endpoints:
  #kubectl get endpoints my-nginx -o yaml
  #kubectl describe service my-nginx

  Service不仅可以代理Pod,还可以代理任意其他后端,比如运行在k8s外部的服务。加速现在要使用一个Service代理外部MySQL服务,不用设置Service的Label Selector。
Service的定义文件: mysql-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
targetPort: 3306
protocol: TCP

同时定义跟Service同名的Endpoints,Endpoints中设置了MySQL的IP:192.168.3.180;
Endpoints的定义文件mysql-endpoints.yaml:
apiVersion: v1
kind: Endpoints
metadata:
name: mysql
subsets:
- addresses:
- ip: 192.168.3.180
ports:
- port: 3306
protocol: TCP

#kubectl create -f mysql-service.yaml -f mysql-endpoints.yaml

微服务化应用的每一个组件都以Service进行抽象,组件与组件之间只需要访问Service即可以互相通信,而无须感知组件的集群变化。
这就是服务发现;

#kubectl exec my-pod -- nslookup my-service.my-ns --namespace=default
#kubectl exec my-pod -- nslookup my-service --namespace=my-ns

发布Service

  k8s提供了NodePort Service、 LoadBalancer Service和Ingress可以发布Service;

  NodePort Service

    NodePort Service是类型为NodePort的Service, k8s除了会分配给NodePort Service一个内部的虚拟IP,另外会在每一个Node上暴露端口NodePort,外部网络可以通过[NodeIP]:[NodePort]访问到Service。

  LoadBalancer Service   (需要底层云平台支持创建负载均衡器,比如GCE)

  LoadBalancer Service是类型为LoadBalancer的Service,它是建立在NodePort Service集群基础上的,k8s会分配给LoadBalancer;Service一个内部的虚拟IP,并且暴露NodePort。除此之外,k8s请求底层云平台创建一个负载均衡器,将每个Node作为后端,负载均衡器将转发请求到[NodeIP]:[NodePort]。

apiVersion: v1
kind: Service
metadata:
name: my-nginx
spec:
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
负载均衡器由底层云平台创建提供,会包含一个LoadBalancerIP, 可以认为是LoadBalancer Service的外部IP,查询LoadBalancer Service:
#kubectl get svc my-nginx

Ingress

  k8s提供了一种HTTP方式的路由转发机制,称为Ingress。Ingress的实现需要两个组件支持, Ingress Controller和HTTP代理服务器。HTTP代理服务器将会转发外部的HTTP请求到Service,而Ingress Controller则需要监控k8s API,实时更新HTTP代理服务器的转发规则;

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: my.example.com
http:
paths:
- path: /app
backend:
serviceName: my-app
servicePort: 80
    Ingress 定义中的.spec.rules 设置了转发规则,其中配置了一条规则,当HTTP请求的host为my.example.com且path为/app时,转发到Service my-app的80端口;

#kubectl create -f my-ingress.yaml; kubectl get ingress my-ingress
NAME     RULE    BACKEND    ADDRESS
my-ingress    -    
      my.example.com
      /app      my-app:80

当Ingress创建成功后,需要Ingress Controller根据Ingress的配置,设置HTTP代理服务器的转发策略,外部通过HTTP代理服务就
可以访问到Service;

时间: 2024-10-05 01:47:11

k8s实战之Service的相关文章

K8S实战-构建Django项目-03-使用共享存储

上篇博文,发布之后,正好跟着双十一,不知道大家剁手了没~~.好啦,言归正传先声明一下,每周1,3,5更新教程,大家如果想要了解更多的教程可以重温一下之前的教程或者,关注崔格拉斯 公众号,大家想要源码的可以私信我~ 每日解析(11.9 每日一题解析) 昨天的教程中留下了一个问题:如何实现数据持久化,确保django project和数据库文件不随pod的销毁而销毁. 解析: 在上一篇教程中,我们已经使用了emptyDir 数据卷.这种数据卷对于当个容器来说是持久的,但是对于Pod来说并不是持久的.

K8S实战-构建Django项目-06-持续构建

今天是K8S实战-构建Django项目,最后一讲.前面5将我们一步步通过k8s构建了一个django项目,通过考虑实际生产环境,我们添加了初始化功能,自动化构建功能,共享存储,数据加密,监控方案,日志方案.从无到有,我们一同走了一遍.最后一讲,我将带着大家利用现有的资源实现最简单的持续构建. 持续构建 设计 gitlab+jenkins+node+dockerfile+k8s gitlab作为仓库,jenkins设置触发器,node作为执行节点,dockerfile生产镜像,k8s构建资源. 实

k8s实战读书笔记

一.概述 kubernetes中Service是真实应用的抽象,将用来代理Pod,对外提供固定IP作为访问入口,这样通过访问Service便能访问到相应的Pod,而对访问者来说只需知道Service的访问地址,而不需要感知Pod的变化: Service是通过Label来关联Pod的,在Service的定义中,设置 .spec.selector为name=redis-master,将关联上Pod: #kubectl get service redis-master NAME  CLUSTER_IP

idou老师教你学Istio 14:如何用K8S对Istio Service进行流量健康检查

Istio利用k8s的探针对service进行流量健康检查,有两种探针可供选择,分别是liveness和readiness: liveness探针用来侦测什么时候需要重启容器.比如说当liveness探针捕获到程序运行时出现的一个死锁,这种情况下重启容器可以让程序更容易可用. readiness探针用来使容器准备好接收流量.当所有容器都ready时被视为pod此时ready.比如说用这种信号来控制一个后端服务,当pod没有到ready状态时,服务会从负载均衡被移除. 使用场景: liveness

访问k8s内部pod service网络

kafa部署在k8s中,并且使用statefulset 方式部署,应用pod连接kafka 使用  kafka-0.kafka-hs.sy-platform-demo.svc.cluster.local.:9093, 如果k8s 外部开发测试,无法连接,所以需要外部网络与pod service网络打通 #kafka注册到zk中[zk: localhost:2181(CONNECTED) 5] get /brokers/ids/0 {"jmx_port":-1,"timesta

K8S实践Ⅳ(Service)

一.Service概念 通过创建service可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求负载分发到后端的各个容器应用上. 二.Service基本用法 1.定义一个web服务的RC,由两个tomcat容器副本组成 # cat webapp-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: webapp spec: replicas: 2 template: metadata: name: we

kubernetes简单介绍和实战

kubernetes简单介绍和实战 在本文中,我们从技术细节上对kubernetes进行简单运用介绍,利用一些yaml脚本层面上实例告诉大家kubernetes基本概念.Kubernetes以及它呈现出的编程范式值得你去使用和整合到自己的技术栈中. kubernetes简单介绍 kubernetes起源 Kubernetes最初认为是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg或Omega的开源版本.准确来说的话,kubernetes更是一个全新的平台,一个全新的平台

Kubernetes(k8s)底层网络原理刨析

目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问service 5.2 ingress 附 扩展实战 附A 用service实现DB的管理 附B 用NetworkPolicy实现访问权限隔离 附C 用secret对象管理账户密码 1 典型的数据传输流程图 ? 一个外部的business-manager请求,首先进入集群的入口(ingress),i

【K8S】K8S-网络模型、POD/RC/SVC YAML 语法官方文档

K8S-网络模型.POD/RC/SVC YAML 语法官方文档 Kubernetes - Production-Grade Container Orchestration kubernetes/kubernetes: Production-Grade Container Scheduling and Management Posts containing 'yaml' - Stack Overflow how to pass a configuration file thought yaml o