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. 第五届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 小明带两个妹妹参加元宵灯会.别人问她们多大了,她们调皮地说:"我们俩的年龄之积是年龄之和的6倍" ...

  2. Java实现LeetCode_0027_RemoveElement

    package javaLeetCode.primary; import java.util.Scanner; public class RemoveElement_27 { public stati ...

  3. 用户管理命令-passwd

    passwd可以给用户设置密码或者修改密码,超级用户可以修改任何用户的密码,而且可以不遵守密码的复杂性原则,普通用户只能修改自己的密码,必须遵守密码的复杂性原则 passwd [选项] 用户名 常用选 ...

  4. 在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext())

    在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function   imagettftext()) install g ...

  5. js数组的常见操作( push、pop、unshift、shift、splice、concat、 join)的用法

    1.数组添加删除 头部或尾部( push().pop().unshift().shift() ) 例2.数组尾部添加 push()方法可向数组的末尾添加一个或多个元素,并返回新的长度 语法:array ...

  6. 浏览器端如何使用VConsole.js调试代码?

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. STM32的ADC采样时间

    STM32的ADC采样时间与其ADC的时钟频率密不可分. 例:STM32F103系列的ADC的时钟是在APB2(最大72MHZ)上.我们可以对其分频: RCC_PCLK2_Div2: ADC cloc ...

  8. 基础拾遗---委托,匿名函数,lambda

    前言: C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托(Delegate)特别用于实现事件和回调方法. ...

  9. JVM 之 Linux定位CPU过高问题及优化

    项目部署以后出行卡顿现象,所以对问题进行了排查,记录一下排查过程 (从CSDN编辑器贴过来的,图有水印) 1.找进程 top 可以发现,是Java进程导致的CPU过高,致使系统卡顿 2.找线程 ps ...

  10. post请求头的常见类型

    1.application/json(JSON数据格式) xhr.setRequestHeader("Content-type","application/json; c ...