kubernetes有三种网络

1. Node Network
2. Pod Network
3. Cluster Network

Service-网络代理模式

**userspce: 1.1-

**三种代理模式

1.1版本使用的userspace,性能低,因为用户请求先要到内核空间,然后到主机用户空间Kube-Proxy,由kube-proxy封装报文再返回到内核空间,再到iptables分发.

2.iptables

1.10版本就开始使用iptables,因为他直接工作在内核,性能相比之前提升了很多,他是基于四层的转发,不会经过用户层kube-proxy,直接调度给相关的Pod

3.ipvs

1.11版本默认ipvs,如果没激活降级为iptables

1.8版本增加了ipvs为了能最大的发挥转发的性能,client请求到达了直接调度给Pod网络地址范围.

Service类型

类型

ExternalName: # 把集群外部服务引入到集群内部直接使用
ClusterIP: # 默认,仅用于集群内部通信,如果要接入外部需要NodePort;
NodePort:
LoadBalancer: # 表示我们把kubernetes集群部署在虚拟机上,虚拟机工作在云环境上,云环境支持LBAAS,负载均衡一键调用.

资源记录

SVC_NAME,NS_NAME,DOMAIN,LTD

svc.cluster.local

redis.default.svc.cluster.local

Example1.使用清单创建SVC

cat pod-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: 10.96.122.10
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30000 cat pod-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
kubectl describe svc redis
kubectl get endpoints

使用集群外的机器访问看下什么效果

while true; do curl 172.19.0.26:30000/hostname.html ; sleep 2;done
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-2tsdx kubectl patch svc redis -p '{"spec":{"sessionAffinity":"ClientIP"}}'
# sessionAffinity,让同一个客户端IP访问固定的一个Pod
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-hcw8s kubectl patch svc redis -p '{"spec":{"sessionAffinity":"None"}}'
# 修改成默认值None
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-hcw8s
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-2tsdx
myapp-deploy-7d574d56c7-hcw8s # Service到Pod是有一个中间层,Endpoints,他也是一个标准Kubernetes对象,地址加端口,关联到后端的Pod

创建一个无头IP

cat pod-svc-head.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: "None"
ports:
- port: 80
targetPort: 80 kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d17h
myapp-svc ClusterIP None <none> 80/TCP 8m16s

使用清单定义Service服务代理

Example

cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
# 通过svc的ClusterIP地址加上端口就能访问此处app指定的服务 kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29h
my-service ClusterIP 10.96.87.66 <none> 80/TCP,443/TCP 61s kubectl get endpoints my-service
NAME ENDPOINTS AGE
my-service <none> 3m25s

因为匹配不到MyApp标签的Pod,我们去修改下my-service里面标签为已有Pod的标签

kubectl edit svc/my-service
28 selector:
29 app: nginx
30 sessionAffinity: None
31 type: ClusterIP # 然后我们去查看service后面有不有代理的Pod
kubectl get ep
kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.78.7:6443 29h
my-service 10.244.2.11:80,10.244.3.13:80,10.244.3.14:80 + 3 more... 6m37s
nginx-service <none> # 接下来访问svc里面的IP+端口即可

服务发现(环境变量与KubeDNS)

环境变量

当一个Pod运行在Node,kubelet会为每个容器添加一组环境变量,Pod容器中程序就可以使用这些环境变量发现Service。这些环境变量格式如下:

(SVCNAME)_SERVICE_HOST
(SVCNAME)_SERVICE_PORT
其中服务名和端口名转为大写,连字符转换为下划线.

限制

# 1. Pod和Service的创建顺序是由要求的,Service必须在Pod创建之前被创建,否则环境变量不会设置到Pod上.
# 2. Pod只能获取同个NameSpace中的Service环境变量.

DNS

DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析,这样Pod中可以通过DNS域名获取Service的访问地址.

Example1

我们先创建一个busybox的pod

 cat busybox.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always kubectl exec -it busybox /bin/sh
/ # env |head -6
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
MY_SERVICE_PORT_443_TCP_ADDR=10.96.87.66
MY_SERVICE_PORT_80_TCP=tcp://10.96.87.66:80
HOSTNAME=busybox
SHLVL=1
# 我们每创建一个Pod都会在env里面创建这些环境变量
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29h
my-service ClusterIP 10.96.87.66 <none> 80/TCP,443/TCP 22m
nginx-service ClusterIP 10.96.60.189 <none> 8080/TCP 24m
[root@master ~]# kubectl exec -it busybox /bin/sh
/ # echo ${MY_SERVICE_SERVICE_HOST_PORT}
10.96.87.66
# 我们可以通过一些变量获取相应的值
# 但是我们要先创建service,后面的Pod才能获取service那些环境变量.

Example2(DNS)

DNS可以抛去上面的那种Pod先后创建顺序限制

https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/deployments/kube-dns.yaml

# 到这个网址下载yaml文件创建kube-dns
# 注意修改配置文件的clusterIP: 通过ps -ef |grep kubelet查看
# 注意配置文件是要访问外国源的,注意换成国内源.

07 . Kubernetes之Service的更多相关文章

  1. kubernetes进阶(04)kubernetes的service

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

  2. [Kubernetes]说说 Service 与 Ingress

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

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

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

  4. Kubernetes的Service运行原理

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

  5. Kubernetes中Service的使用

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

  6. kubernetes 简单service的例子

    首先建一个Deployment: apiVersion: apps/v1beta1 kind: Deployment metadata: name: httpd spec: replicas: 3 t ...

  7. kubernetes的Service Account和secret

    系列目录 Service Account Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它 ...

  8. kubernetes学习Service之headless和statefulSet结合

    一.首先说headless Service和普通Service的区别 headless不分配clusterIP headless service可以通过解析service的DNS,返回所有Pod的地址 ...

  9. kubernetes之service

    service出现的动机 Kubernetes Pods 是有生命周期的.他们可以被创建,而且销毁不会再启动. 如果您使用 Deployment 来运行您的应用程序,则它可以动态创建和销毁 Pod. ...

随机推荐

  1. Java实现 蓝桥杯VIP 算法提高 大数加法

    算法提高 大数加法 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个正整数a,b,输出a+b的值. 输入格式 两行,第一行a,第二行b.a和b的长度均小于1000位. 输出格式 一行, ...

  2. Java实现九阶数独

    你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...

  3. Java实现约瑟夫环问题

    约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...

  4. java实现控制台表格

    画表格 在图形环境中很容易做出漂亮的表格.但在控制台环境中就比较困难了.有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看) +-------+------+ |abc | ...

  5. 阿里云专有网络配置以及交换机配置+ip、子网掩码、ip网段计算原理讲解

    在阿里云上购买ECS或者其他服务,如redis.polardb时,需要配置专有网络,阿里的文档写的总体上还是比较抽象的,没有一定的网络基础,会一脸懵. 所以这里我来进行专有网络和交换机的配置,以及ip ...

  6. IDEA2020年激活码

    若出现无法使用,激活失败的情况,可以关注公众号:凌晨四点的程序员,回复消息"IDEA"持续更新最新激活码 2020年05月26更新(2020年6月份) OI7FTW2137-eyJ ...

  7. 视频处理之OSD

    欲观原文,请君移步 OSD简介 OSD,on-screen display的简称,即屏幕菜单式调节方式.一般我们按一下Menu键后屏幕弹出的显示器各项调节项目信息的矩形菜单,比如调亮度,色调,饱和度等 ...

  8. 搭建手机web服务器-----内网穿透(无需Root)

    搭建手机web服务器-----内网穿透(无需Root) 一.内网穿透部分 前言: 网上内网穿透的方法很多,像花生壳.Ngrok.Frp等等,但是大多都需要获取手机root权限 本文使用的软件是Term ...

  9. Vue3 新特性

    一.vue3 为什么要重写 两个主要原因考虑重写vue新版本主要功能: 1.主流浏览器对新的JavaScript语言特性的普遍支持. 2.当前Vue代码库随着时间的推移而暴露出来的设计和体系架构问题. ...

  10. jQuery实现购物车商品数量及总价的计算

    记录一下项目中遇到的计算购物车商品数量和总价的jQuery代码,重点在于选择器以及.text()命令的使用. 先上效果图,点击加减,商品数量以及总价会发生相应变化. html代码: <div c ...