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. SpringBoot项目启动执行任务的几种方式

    1.直接在启动类下面调用方法 @SpringBootApplication public class TestApplication { public static void main(String[ ...

  2. C++使用gnuplot-cpp库绘制图像

    最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用gnuplot这个工具. sudo apt-get install gnuplot sudo apt-get install gnuplot- ...

  3. CF1915B Not Quite Latin Square 题解

    CF1915B 题意 给出一个 \(3\) 行 \(3\) 列的字符矩形,其中每行都有字符 ABC 各一个组成,现有一个字符未知,求出未知字符. 思路 就是说每个字符都应该出现 \(3\) 次,所以我 ...

  4. CF1934B Yet Another Coin Problem 题解

    CF1934B Yet Another Coin Problem 题解 题意 目前有 \(5\) 种硬币,面值分别为 \(1,3,6,10,15\).给你一个数字 \(n\),求出可以凑出 \(n\) ...

  5. 洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

    [NOIP2001 普及组] 最大公约数和最小公倍数问题 题目描述 洛谷题目链接:https://www.luogu.com.cn/problem/P1029 输入两个正整数 x, y,求出满足下列条 ...

  6. UML各类基础知识总结

    1.UML关系 泛化(也就是我们传统意义上的继承关系) 子类继承父类,关系用extend关键字标识: 关联 可以说是一种属于关系,图中即说的是PhoneNumber类属于Master类,同时,除了一对 ...

  7. RHCA rh442 004 加载模块 ulimit cgroup

    模块调优 lsmod 可以看到内核加载的模块 [root@servera ~]# lsmod | grep usb [root@servera ~]# modprobe usb_storage [ro ...

  8. 【Vue2】金额范围查询项

    Element 只提供了DatePicker,没有做金额的Picker 这个东西就只能自己做了,实现效果: 后台接口条件: 因为有可能只有起始值,只有结束值,或者起始值结束值都有三种情况 1.如果有起 ...

  9. 【Java】Reflection 反射机制 02获取类的一切

    先创建一个可演示的类 注解类 package cn.dai.Reflection.demo; import java.lang.annotation.ElementType; import java. ...

  10. 【Layui】03 按钮 Button

    文档位置: https://www.layui.com/doc/element/button.html 01.[按钮主题] <div> <button type="butt ...