k8s学习-Service
4.4、Service
可能会用到ipvs,先安装:
yum install -y openssl openssl-devel popt popt-devel libnl-devel kenel-devel
yum install -y ipvsadm
4.4.1、概念
说明
kubernetes的Service(简称svc)定义了一种抽象,一个Pod的逻辑分组,一种可以访问他们的策略,通过Label Selector选择对应的一组Pod。简单来说就是服务发现;

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

代理的分类
1)namespace

频繁的和kubeproxy交互,性能不高。
2)iptables

使用iptables继续转发,提高了性能。
3)ipvs
在该模式下kube-proxy会监视kubernetes的Service对象和Endpoints,调用netlink接口已以响应的创建ipvs规则并定期与Service对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被定重定向到其中一个后端Pod。
与iptables类似,ipvs于netfilter的hook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快的重定向流量,并且在同步代理规则时具有更好的性能。此外ipvs为负载均衡算法做出了更多的选项:
rr:轮询调度lc:最小连接dn:目标哈希sh:源哈希sed:最短期望延迟nq:不排队调度

4.4.2、使用
ClusterIp
clusterIp在每个node节点使用iptables,将发向clusterIp对饮端口的数据转发到kube-proxy中,然后kube-proxy自己内部实现由负载均衡的方法,并且可以查询到这个service下对应的pod地址和端口,然后把数据转发给这个pod的地址和端口;

- apiServer用户通过kubectl命令想apiServer发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
- kube-proxy kubernetes的每个节点中都有一个kube-proxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入到本地的iptables规则中
- iptables使用NAT等技术将virtualIP的流量转至endpoint中
测试
mkdir -p /usr/local/docker/kubernetes/plugins/test/service/clusterip
cd /usr/local/docker/kubernetes/plugins/test/service/clusterip
1)创建deployment
vim myapp-deploy.yml
apiVersion: apps/v1
kind: Deployment # 类型为Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3 # 副本数 3
selector:
matchLabels:
app: myapp
release: stabel
template:
metadata: # 必须和上面定义的label匹配
labels:
app: myapp
release: stabel
env: test
spec:
containers:
- name: myapp
image: habor-repo.com/library/nginx:v1
imagePullPolicy: IfNotPresent # 如果本地没有才拉取
env: # 容器添加环境变量(这里没用,只是有这个功能)
- name: GET_HOST_FROM
value: dns
ports:
- name: http # 端口的名字定义为 http
containerPort: 80 # 容器的端口
2)创建service
vim myapp-service.yml
apiVersion: v1
kind: Service # 类型为 Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP # service类型为 ClusterIP
selector: # 这里的labels匹配上面的 matchLabels 用来发现deployment
app: myapp
release: stabel
ports:
- name: http # 端口的名字定义为 http
port: 8000 # 暴露的svc外部端口
targetPort: 80 # 容器内部端口
# 创建 deployment
kubectl apply -f myapp-deploy.yml
kubectl get deploy
kubectl get pod
# 创建 svc
kubectl apply -f myapp-service.yml
kubectl get svc
# 通过 curl 访问 svc 的ip:8000负载均衡访问
HeadlessService
和ClusterIP一样只不过不会暴露service的IP和端口,只能通过域名方式访问:
测试
vim myapp-headless-service.yml
apiVersion: v1
kind: Service # 类型为 Service
metadata:
name: myapp-headless
namespace: default
spec:
clusterIP: "None" # 表示为一个headless服务
selector: # 这里的labels匹配上面的 matchLabels 用来发现deployment
app: myapp
release: stabel
ports:
- name: http # 端口的名字定义为 http
port: 80 # 容器内部端口
targetPort: 8000 # 暴露的svc外部端口
# 创建 svc
kubectl apply -f myapp-headless-service.yml
# 查看 svc 发现为 None
[root@k8s-master clusterip]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h
myapp ClusterIP 10.101.230.183 <none> 8000/TCP 5m13s
myapp-headless ClusterIP None <none> 80/TCP 5s
# 查看 dns 任意找一个,例如: coredns-bccdc95cf-m4jg5 10.244.0.16
kubectl get pod -n kube-system -o wide
# 通过headless自带的域名解析访问
yum install -y bind-utils
# 使用 dig 命令指定dns域名解析
# service名.命名空间.集群域名(默认svc.cluster.local)
dig -t A myapp-headless.default.svc.cluster.local @10.244.0.16
NodePort
在每个节点上开启一个端口,将该端口的流量导入kube-proxy,然后由kube-proxy进一步给对应的pod
vim nodeport.yml
apiVersion: v1
kind: Service # 类型为 Service
metadata:
name: myapp-nodeport
namespace: default
spec:
type: NodePort # service类型为 NodePort
selector: # 这里的labels匹配上面的 matchLabels 用来发现deployment
app: myapp
release: stabel
ports:
- name: http # 端口的名字定义为 http
port: 9000 # 暴露的svc外部端口
targetPort: 80 # 容器内部端口
kubectl apply -f nodeport.yml
# 查看 svc
[root@k8s-master clusterip]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h
myapp ClusterIP 10.101.230.183 <none> 8000/TCP 34m
myapp-headless ClusterIP None <none> 80/TCP 29m
myapp-nodeport NodePort 10.106.39.25 <none> 9000:31714/TCP 6s
# 访问
# 9000:31714/TCP 9000 是这个service自己ip的端口,31714是每个节点上暴露的端口
curl 10.106.39.25:9000
curl k8s-master:31714
curl k8s-node1:31714
curl k8s-node2:31714
LoadbBlancer
和nodeport其实是同一种,只不过添加了负载均衡的功能。这个是收费的功能。
ExternalName
将服务映射到externalName字段(可以是域名或者IP)。ExternalName是Service的特例,他没有selector,也没有定义任何的端口和Endpoint。相当于将外部流量导入到内部。
vim external-name.yml
apiVersion: v1
kind: Service # 类型为 Service
metadata:
name: myapp-external-name
namespace: default
spec:
type: ExternalName # service类型为 ExternalName
externalName: habor-repo.com
kubectl apply -f external-name.yml
# 查看
kubectl get svc
# 查看 dns 任意找一个,例如: coredns-bccdc95cf-m4jg5 10.244.0.16
kubectl get pod -n kube-system -o wide
# 测试域名解析
dig -t A myapp-external-name.default.svc.cluster.local @10.244.0.16
k8s学习-Service的更多相关文章
- k8s的service
1.service简介 本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 c ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...
- ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览
在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...
- k8s学习 - 概念 - master/node
k8s学习 - 概念 - master/node 在k8s中,有各种各样的概念和术语.这些概念是必须要学习和掌握的.我们先罗列下所有概念,然后再一个个看具体实例. 大概说一下这些概念: Master: ...
- k8s学习 - 概念 - Pod
k8s学习 - 概念 - Pod 这篇继续看概念,主要是 Pod 这个概念,这个概念非常重要,是 k8s 集群的最小单位. 怎么才算是理解好 pod 了呢,基本上把 pod 的所有 describe ...
- k8s学习 - 概念 - ReplicationController
k8s学习 - 概念 - ReplicationController 我们有了 pod,那么就需要对 pod 进行控制,就是同一个服务的 podv我需要启动几个?如果需要扩容了,怎么办?这里就有个控制 ...
- .NET Core on K8S学习实践系列文章索引(Draft版)
一.关于这个系列 自从去年(2018年)底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发 ...
- ASP.NET Core on K8S学习之旅(12)Ingress
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...
- ASP.NET Core on K8S学习之旅(13)Ocelot API网关接入
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使 ...
随机推荐
- yield与park的区别
yield表示放弃本次cpu的时间片,但是操作系统在下一个时间片依旧可能会调用该线程/进程 park表示线程/进程睡眠,需要让其他线程/进程唤醒,才有可能重新被操作系统分配时间片, 非自旋锁,底层一般 ...
- 微信小程序上传文件时弹出当前系统代理不是安全代理,是否信任
我的开发环境是.net core 启用了https,而微信的开发者工具不认这个证书. 解决办法1:关闭https 然后在 Startup.cs 中关闭注释掉 app.UseHttpsRedirecti ...
- css概述五
十一.显示 1.显示方式 决定元素在网页中的表现形式(块级,行内,行内块,table) 语法: display: 取值: 1.display:block: 让元素以块级的方式显示 2.display: ...
- Java并发:线程安全分析
java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...
- java中的redis常用操作
https://blog.csdn.net/lixiaoxiong55/article/details/81592800 超详细版 常规操作 public class TestReidsComm ...
- 一文带你学会基于SpringAop实现操作日志的记录
前言 大家好,这里是经典鸡翅,今天给大家带来一篇基于SpringAop实现的操作日志记录的解决的方案.大家可能会说,切,操作日志记录这么简单的东西,老生常谈了.不! 网上的操作日志一般就是记录操作人, ...
- RESTful api 功能测试
0 为什么要写测试代码 代码写好了,如果能点或者能看,开发人员一般会自己点点或看看,如果没有发现问题就提交测试:更进一步,代码写好后,运行测试代码,通过后提交测试.将流程抽象下: 功能1编码-> ...
- 微信小程序开发 -- 通过云函数下载任意文件
微信小程序开发 -- 通过云函数下载任意文件 1.云开发介绍 微信小程序开发者众所周知,小程序开发拥有许多限制,当我还是一个菜鸟入门的时候,第一关就卡在了没有备案域名的HTTP请求上面,那时候云开 ...
- 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行
错误 Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率.其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再 ...
- PowerDesigner使用教程(二)
在PowerDesigner使用教程(一)中已经介绍了基本用法,下面介绍一些使用技巧. 1. 生成sql脚本 Database→Generate Database 选择要输出的文件路径,即文件存储路 ...