Service

说明:

Service 是作用于客户端可服务端(Pod)之间,作为一个固定的中间层
主要依赖于kubernetes中的DNS服务,1.11版本之前用的是kube-dns
而之后的版本使用的CoreDNS服务。

在kubernetes中有三种网络:

1. node network
2. pod network
3. cluster network (service network/virtual IP) 集群IP/虚拟IP

kube-proxy通过watch监视api service 有关Service的变动

kubernetes有三种工作模式:

1. userspace    1.1 之前
2. iptables 1.10 之前
3. ipvs 1.11 之后

Service 类型

ExternalName    # 关联集群外部的一个服务,用于集群内部有需求访问的资源通过Service去访问。
ClusterIP # 默认,配置一个集群IP,仅用于集群内部使用
NodePort # 集群外部
LoadBalancer # 把集群环境部署在云环境中,而云环境也支持LB

ClusterIP

有头 Service

手动创建清单文件

[root@master manifests]# cat svc-redis.yaml
apiVersion: v1
kind: Service # 指定类型
metadata:
name: redis
namespace: default
spec:
selector: # 标签选择器
app: redis
role: logstor
clusterIP: 10.97.97.97 # 这里的clusterIP 可以手动指定IP,如果不指定,则会自动获取一个IP
type: ClusterIP
ports:
- port: 6379 # 这里的端口表示Service暴露的端口
targetPort: 6379 # 这里表示匹配到的Pod 端口

创建

[root@master manifests]# kubectl apply -f svc-redis.yaml
service/redis created
[root@master manifests]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15d <none>
redis ClusterIP 10.97.97.97 <none> 6379/TCP 5s app=redis,role=logstor # 这里可以看出已经匹配到了对应的Pod
[root@master manifests]# kubectl describe svc redis
Name: redis
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"redis","namespace":"default"},"spec":{"clusterIP":"10.97.97.97","...
Selector: app=redis,role=logstor
Type: ClusterIP
IP: 10.97.97.97
Port: <unset> 6379/TCP
TargetPort: 6379/TCP
Endpoints: 10.244.1.24:6379
Session Affinity: None
Events: <none>
[root@master manifests]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-ds-8tvmc 1/1 Running 0 5h34m 10.244.1.25 node03.kubernetes <none> <none>
myapp-ds-cs2hw 1/1 Running 0 5h33m 10.244.3.27 node01.kubernetes <none> <none>
myapp-ds-f2pp8 1/1 Running 0 5h34m 10.244.2.20 node02.kubernetes <none> <none>
redis-5c998b644f-wnzrd 1/1 Running 0 5h59m 10.244.1.24 node03.kubernetes <none> <none> # 这里redis的Pod 和刚刚创建svc匹配的Pod的IP地址相同

资源记录:

SVC_NAME.NSNAME.DEMAIN.LTD.

svc.cluster.local.

手动测试集群内创建的DNS解析:

按照上面的记录,资源解析记录为: redis.default.svc.cluster.local.

进入到其中一台Pod中尝试解析:

[root@master manifests]# kubectl exec -it myapp-ds-8tvmc -- /bin/sh
/ # nslookup redis.default.svc.cluster.local.
nslookup: can't resolve '(null)': Name does not resolve Name: redis.default.svc.cluster.local.
Address 1: 10.97.97.97 redis.default.svc.cluster.local

无头 Service

与有头Service区别是 ClusterIP 为空,而解析到的Service 直接是后端的Pod的IP地址

[root@master manifests]# cat myapp-svc-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: "None" # 这里为None
ports:
- port: 80
targetPort: 80
[root@master manifests]# kubectl apply -f myapp-svc-headless.yaml
service/myapp-svc created
[root@master manifests]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16d
myapp NodePort 10.99.99.99 <none> 80:30080/TCP 17h
myapp-svc ClusterIP None <none> 80/TCP 3s
redis ClusterIP 10.97.97.97 <none> 6379/TCP 18h

下面手动解析测试:

[root@master manifests]# dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52484
;; flags: qr aa rd; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-svc.default.svc.cluster.local. IN A ;; ANSWER SECTION:
myapp-svc.default.svc.cluster.local. 30 IN A 10.244.1.20
myapp-svc.default.svc.cluster.local. 30 IN A 10.244.3.23
myapp-svc.default.svc.cluster.local. 30 IN A 10.244.3.22 # 这里解析的是匹配到的后端的Pod地址
myapp-svc.default.svc.cluster.local. 30 IN A 10.244.2.16
myapp-svc.default.svc.cluster.local. 30 IN A 10.244.2.15 ;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Fri Jul 26 10:04:24 CST 2019
;; MSG SIZE rcvd: 319
[root@master manifests]# kubectl get pods -o wide -l app=myapp
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-f4db5d79c-7hnfg 1/1 Running 0 46h 10.244.2.16 node02.kubernetes <none> <none>
myapp-deploy-f4db5d79c-85hpm 1/1 Running 0 46h 10.244.3.22 node01.kubernetes <none> <none>
myapp-deploy-f4db5d79c-b9h4s 1/1 Running 0 46h 10.244.2.15 node02.kubernetes <none> <none>
myapp-deploy-f4db5d79c-tm9mt 1/1 Running 0 46h 10.244.1.20 node03.kubernetes <none> <none>
myapp-deploy-f4db5d79c-xp8t6 1/1 Running 0 46h 10.244.3.23 node01.kubernetes <none> <none>

而解析有头的Service 则是Service自己的地址:

[root@master manifests]# dig -t A myapp.default.svc.cluster.local. @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-74.el7_6.1 <<>> -t A myapp.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14743
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp.default.svc.cluster.local. IN A ;; ANSWER SECTION:
myapp.default.svc.cluster.local. 30 IN A 10.99.99.99 ;; Query time: 0 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Fri Jul 26 10:05:33 CST 2019
;; MSG SIZE rcvd: 107

06-kubernetes service的更多相关文章

  1. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  2. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  3. Docker Kubernetes Service 代理服务创建

    Docker Kubernetes  Service 代理服务创建 创建Service需要提前创建好pod容器.再创建Service时需要指定Pod标签,它会提供一个暴露端口默会分配容器内网访问的唯一 ...

  4. CoreDNS for kubernetes Service Discovery

    一.CoreDNS简介 Kubernetes包括用于服务发现的DNS服务器Kube-DNS. 该DNS服务器利用SkyDNS的库来为Kubernetes pod和服务提供DNS请求.SkyDNS2的作 ...

  5. 浅谈 kubernetes service 那些事(上篇)

    一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8 ...

  6. 浅谈 kubernetes service 那些事 (下篇)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 五.K8s 1.8 新特性--ipvs ipvs与iptables的性能差异 随着服务的数量增长,IPTables 规则则会成倍增长,这样带来的问题 ...

  7. Kubernetes service 使用定义

    Kubernetes service 使用定义 介绍说明 • 防止Pod失联• 定义一组Pod的访问策略• 支持ClusterIP,NodePort以及LoadBalancer三种类型• Servic ...

  8. Kubernetes service 三种类型/NodePort端口固定

    Kubernetes service 三种类型 • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP(VIP)• NodePort:在每个Node上分配一个端口作为外部访问入口• Load ...

  9. Kubernetes service 代理模式

    Kubernetes service 代理模式 底层流量转发与负载均衡实现:• Iptables(默认)• IPVS IPVS 了解代理模式之IPVS工作原理LVS 基于 IPVS内核调度模块实现的负 ...

  10. Docker系列(十三):Kubernetes Service的负载均衡和网络路由的秘密

    Kubernetes Service设计分析 什么是单体程序?所有的模块都在一个进程中 微服务,每一个服务是一个进程的模式 kubernetes中的service其实只是一个概念,是一组相同lable ...

随机推荐

  1. 关于 Java 中多线程的面试问题 详解

    多线程细节: 1. 面试题: sleep 方法 和 wait 方法异同点是什么? 相同点: 可以让线程 处于 冻结状态. 不同点: 1. sleep 必须指定时间 wait 可以指定时间, 也可以不指 ...

  2. VIM编辑器的常用命令及使用!

    在热门Linux操作系统中都会默认安装一款超好用的文本编辑器——名字叫“vim”,vim是vi编辑器的升级版. Vim能够得到这么多厂商与用户的认可,原因就是在Vim编辑器中有三种模式——命令模式.末 ...

  3. 邵国际: C 语言对象化设计实例 —— 命令解析器

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 邵国际 来源: 微信公众号linux阅码场(id: linuxdev) 内容简介 单片机工程师常常疑惑为什么 ...

  4. php 开启微信公众号开发者模式

    php 开启微信公众号开发者模式<pre><?php/** * wechat php test */header('Content-type:text');//define your ...

  5. Apache Jmeter进行服务器压力测试

    1.前言 最近项目遇到一个问题:其他公司对接我们系统,请求量太大的时候,返回单给对方就是丢失格式,大概十几万中总有那么十几单会出现格式错误! 所以我们老大就叫我用apache jmeter来进行并发测 ...

  6. Jenkins+pipeline+参数构建+人工干预确定

    Jenkins+pipeline+参数构建+人工干预 实现了以下功能 1. 可以选择环境,单选:可以选择需要发布的项目,多选 2.发布过程可视化 3. 可以人工干预是否继续发布. 初始化配置需要很久, ...

  7. PHP Openssl 生成公钥私钥

    <?php //配置信息 $dn = array( "countryName" => "GB", "stateOrProvinceName ...

  8. 通过canvas合成图片

    通过canvas合成图片 效果图 页面布局部分 两个图片以及一个canvas画布 <img src="https://qnlite.gtimg.com/qqnewslite/20190 ...

  9. nyoj 324-猴子吃桃问题 (m[i] = (m[i-1] + 1) * 2)

    324-猴子吃桃问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:20 提交数:21 难度:0 题目描述: 有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法, ...

  10. 函数的prototype

    1.函数的prototype属性 每一个函数都有一个prototype属性,默认指向object空对象(原型对象),每一个原型对象都有一个constructor属性,指向函数对象 2.给原型对象添加属 ...