Service

Kubernetes 的Service定义了这样一种抽象:一个 Pod 的逻辑分组,一种可以访问他们的策略 —— 微服务,这一组Pod能够被Service访问到,通常是通过tabel Selector匹配。

Service 能够提供负载均衡的能力,但是在使用上有以下的限制:

  • 只提供四层负载均衡,不存在七层负载

  • 负载的方式有通过 userspace、iptables转发 和 ipvs 转发三种,如果系统不支持 ipvs 模块,则会自动降级为iptables转发模式

    userspace:client端访问Server Pod时需要将请求转发给kube-proxy,再有kube-proxy进行调度,同时apiServer也通过Porxy获取Node节点信息,这种模式下kube-proxy的压力非常大。

    iptables:client端访问Server Pod直接通过iptables进行转发,无需经过kube-Proxy

    ipvs:client端访问Server Pod直接通过ipvs进行转发,前提ipvs模块必须加载

Service的类型

  • ClusterIP:默认类型,自动分配一个仅Cluster内部能访问的虚拟ip
  • NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,这样外网就可以通过<NodeIP>:NodePort来访问该服务
  • LoadBalancer:在NodePort的基础上,借助cloud provide创建一个外部负载均衡器,并将请求转发到<NodeIP>:NodePort
  • ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用,没有任何代理被创建,只有kubernetes1.7以上版本支持

示例

clusterIP

vim svc-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stabel
template:
metadata:
labels:
app: myapp
release: stabel
version: v1
spec:
containers:
- name: myapp
image: hub.vfancloud.com/test/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-cluster
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80

创建、测试

[root@Centos8 k8sYaml]# kubectl create -f svc-deployment.yml
deployment.apps/myapp-deploy created
service/svc-cluster created [root@Centos8 k8sYaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
myapp-deploy 3/3 3 3 2m38s
[root@Centos8 k8sYaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49d
svc-cluster ClusterIP 10.102.16.24 <none> 80/TCP 78s [root@Centos8 k8sYaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-deploy-b4d49f555-czbb5 1/1 Running 0 2m47s
myapp-deploy-b4d49f555-p97dk 1/1 Running 0 2m47s
myapp-deploy-b4d49f555-zcjtq 1/1 Running 0 2m47s [root@Centos8 k8sYaml]# curl http://10.102.16.24/hostname.html
myapp-deploy-b4d49f555-zcjtq
[root@Centos8 k8sYaml]# curl http://10.102.16.24/hostname.html
myapp-deploy-b4d49f555-czbb5
[root@Centos8 k8sYaml]# curl http://10.102.16.24/hostname.html
myapp-deploy-b4d49f555-p97dk

不需要负载以及单独的ClusterIP时

vim svc-cluNone.yml

apiVersion: v1
kind: Service
metadata:
name: svc-clunone
spec:
clusterIP: "None"
selector:
app: myapp
release: stabel
ports:
- port: 80
targetPort: 80

NodePort

vim svc-nodeport.yml

apiVersion: v1
kind: Service
metadata:
name: svc-nodePort
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80 # 用于k8s集群内部服务之间相互访问端口
targetPort: 80 # 实际web容器expose的端口
nodePort: 30001 # 用于外部client访问,其会在k8s每个node节点开启30001

创建、测试

[root@Centos8 k8sYaml]# kubectl create -f svc-nodeport.yml
service/svc-nodeport created
[root@Centos8 k8sYaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49d
svc-clunone ClusterIP None <none> 80/TCP 7m37s
svc-cluster ClusterIP 10.102.16.24 <none> 80/TCP 29m
svc-nodeport NodePort 10.98.165.226 <none> 80:30001/TCP 6s [root@Centos8 k8sYaml]# ipvsadm -ln | grep -A5 10.98.165.226
TCP 10.98.165.226:80 rr
-> 10.244.3.78:80 Masq 1 0 0
-> 10.244.3.79:80 Masq 1 0 0
-> 10.244.3.80:80 Masq 1 0 0 ### 外网访问可以在浏览器中输入nodeip+端口即可
### 若网络不可达,在确认自己的svc创建全部正确的情况下,执行:
iptables -P FORWARD ACCEPT ### 执行完毕后,再次测试

LoadBalancer

此Service类型主要功能为在Node的外部做一个负载均衡器,但是需要收费,了解即可。

ExternalName

apiVersion: v1
kind: Service
metadata:
name: svc-external
namespace: default
spec:
type: ExternalName
externalName: hub.vfancloud.com

Pod访问svc的方式

当有需求Pod需要访问svc时,可以通过直接访问svc ip和svc name两种方式访问。

但由于svc ip是不固定的,当svc删除或者重建的时候,ip会发生改变,所以如果想固定的访问此svc,要使用coredns的方式,也就是访问svc name。

注意:使用coredns解析svc name时,要在Pod的资源清单中加入dnsPolicy: ClusterFirstWithHostNet 这个配置,该设置是使POD使用的k8s的dns,pod默认使用所在宿主主机使用的DNS(踩过的坑,不知道其他版本如何)

## 当前svc
[root@Centos8 http]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-svc1 ClusterIP 10.102.201.28 <none> 80/TCP 25m
ingress-svc2 ClusterIP 10.104.176.12 <none> 8080/TCP 11m ## 当前pod
[root@Centos8 http]# kubectl get pod
NAME READY STATUS RESTARTS AGE
ingress-http1-549f9d6cdf-5d5wf 1/1 Running 0 25m
ingress-http1-549f9d6cdf-9bhkx 1/1 Running 0 25m
ingress-http1-549f9d6cdf-t75tw 1/1 Running 0 25m
ingress-http2-84b79f86c8-55hhw 1/1 Running 0 11m
ingress-http2-84b79f86c8-6jhl4 1/1 Running 0 11m
ingress-http2-84b79f86c8-7bf8w 1/1 Running 0 11m ### 前往ingress-svc2的pod内,访问ingress-svc1
## 第一种,访问ip
[root@Centos8 http]# kubectl exec -it ingress-http2-84b79f86c8-55hhw -- ping 10.102.201.28
PING 10.102.201.28 (10.102.201.28): 56 data bytes
64 bytes from 10.102.201.28: seq=0 ttl=64 time=0.114 ms
64 bytes from 10.102.201.28: seq=1 ttl=64 time=0.091 ms
64 bytes from 10.102.201.28: seq=2 ttl=64 time=0.082 ms ## 第二种,访问svc name,访问通,并成功解析到ip
[root@Centos8 http]# kubectl exec -it ingress-http2-84b79f86c8-55hhw -- ping ingress-svc1
PING ingress-svc1 (10.102.201.28): 56 data bytes
64 bytes from 10.102.201.28: seq=0 ttl=64 time=0.103 ms
64 bytes from 10.102.201.28: seq=1 ttl=64 time=0.149 ms
64 bytes from 10.102.201.28: seq=2 ttl=64 time=0.087 ms

Kubernetes-9:Service介绍及演示的更多相关文章

  1. K8s - Kubernetes重要概念介绍(Cluster、Master、Node、Pod、Controller、Service、Namespace)

    K8s - Kubernetes重要概念介绍(Cluster.Master.Node.Pod.Controller.Service.Namespace)       Kubernetes 是目前发展最 ...

  2. kubernetes进阶(04)kubernetes的service

    一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...

  3. Kubernetes中StatefulSet介绍

    StatefulSet 是Kubernetes1.9版本中稳定的特性,本文使用的环境为 Kubernetes 1.11.如何搭建环境可以参考kubeadm安装kubernetes V1.11.1 集群 ...

  4. 二十三、Pod的service介绍

    Pod 的 Service 介绍 一.Service 介绍 Kubernetes Service 定义了这样一种抽象: 一个 Pod 的逻辑分组,一种可以访问它们的策略,通常称为微服务. 这一组 Po ...

  5. Service介绍(MediaPlayer应用)

    一.Service介绍 Service类似于Windows中的服务,没有界面,只是在后台运行:而服务不能自己运行,而是需要调用Context.startService(Intent intent);或 ...

  6. [Kubernetes]说说 Service 与 Ingress

    在 Kubernetes 中, Service 有三种对外暴露的方法,但是由于每个 Service 都要有一个负载均衡的服务,所以采用 Service 的话,会造成既浪费成本又高的现象.对于用户来说, ...

  7. Android Service总结02 service介绍

    Android Service总结02 service介绍 版本 版本说明 发布时间 发布人 V1.0 介绍了Service的种类,常用API,生命周期等内容. 2013-03-16 Skywang ...

  8. 【Kubernetes】Kubernetes的Service外部访问方式:NodePort和LoadBalancer

    Kubernetes的Pod的寿命是有限的,它们不会复活,因此尽管每个Pod都有自己的IP地址,但是这些IP地址是不可靠的,会随着Pod的消亡而消失. 这就带来一个问题,如果一些Pod的集合(称之为b ...

  9. Kubernetes的Service运行原理

    一.为什么Servcie能定位到Pod 因为Pod的IP是不固定的,所以Kubernetes需要Service,除此之外它还可以在多个Pod间负载均衡 Service的访问入口,其实是宿主机的kube ...

  10. Kubernetes中Service的使用

    目录 简介 1. Service资源定义 1.1 Service Type ClusterIP 无头service NodePort sessionAffinity实现源地址session绑定 简介 ...

随机推荐

  1. C#数据结构与算法入门教程,值得收藏学习!

    前言 最近看到DotNetGuide技术社区交流群有不少小伙伴提问:想要系统化的学习数据结构和算法,不知道该怎么入门,有无好的教程推荐的?,今天大姚给大家推荐2个开源.免费的C#数据结构与算法入门教程 ...

  2. ajax - 接口、表单、模板引擎

    1. 今天继续ajax的一个学习,首先明确一个观念,接口,什么是接口,当使用ajax请求数据时,被请求的url就叫做数据接口也就是接口,注意每个接口必须有请求方式,这里有一个接口的测试工具,postm ...

  3. 【ClickHouse】0:clickhouse学习2之数据类型

    一 :如何查看clickhouse具体支持哪些数据类型? 1:查看官方文档:https://clickhouse.tech/docs/en/sql-reference/data-types/ 2:查看 ...

  4. React项目国际化-React-intl

    npx create-react-app react-intl-demo && cd react-intl-demo,创建react-intl-demo项目.npm install r ...

  5. VulnHub_DC-6渗透流程

    DC-6 kali:192.168.157.131 靶机:192.168.157.150 修改host文件,添加192.168.157.150 wordy不然解析不了域名 信息收集 发现是WordPr ...

  6. Java 面向对象编程之继承的super关键词

    java 继承里面的super关键词 super关键词 一个引用变量,用于引用父类对象 父类和子类都具有相同的命名属性,要调用父类中的属性时使用 super也是父类的构造函数,格式super(参数) ...

  7. 分享一个国内可用的ChatGPT网站,免费无限制,支持AI绘画

    背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾. 作为一个AI爱好者,翻遍了各大基于ChatGPT的网站,终于找到一个免费!免登陆!手机电脑通用!国内可直接对话的C ...

  8. 学习笔记--Java方法基础

    Java方法基础 那么什么是方法呢? public class MethodTest01{ public static void main(String[] args){ // 需求1:编写程序计算 ...

  9. Django Template层之自定义tag

    Django Template层之自定义tag by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 实践 步骤1 应用根目录下,新建templatetags包目录(注意 ...

  10. Linux中&&、&、|、||等特殊符号

    && 和 & & 表示任务后台执行,与nohup命令功能差不多. # 运行jar包,并且置于后台执行,执行的日志重定向到当前默认的log.txt文件中 [root@lo ...