07 . Kubernetes之Service
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的更多相关文章
- kubernetes进阶(04)kubernetes的service
		
一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...
 - [Kubernetes]说说 Service 与 Ingress
		
在 Kubernetes 中, Service 有三种对外暴露的方法,但是由于每个 Service 都要有一个负载均衡的服务,所以采用 Service 的话,会造成既浪费成本又高的现象.对于用户来说, ...
 - 【Kubernetes】Kubernetes的Service外部访问方式:NodePort和LoadBalancer
		
Kubernetes的Pod的寿命是有限的,它们不会复活,因此尽管每个Pod都有自己的IP地址,但是这些IP地址是不可靠的,会随着Pod的消亡而消失. 这就带来一个问题,如果一些Pod的集合(称之为b ...
 - Kubernetes的Service运行原理
		
一.为什么Servcie能定位到Pod 因为Pod的IP是不固定的,所以Kubernetes需要Service,除此之外它还可以在多个Pod间负载均衡 Service的访问入口,其实是宿主机的kube ...
 - Kubernetes中Service的使用
		
目录 简介 1. Service资源定义 1.1 Service Type ClusterIP 无头service NodePort sessionAffinity实现源地址session绑定 简介 ...
 - kubernetes  简单service的例子
		
首先建一个Deployment: apiVersion: apps/v1beta1 kind: Deployment metadata: name: httpd spec: replicas: 3 t ...
 - kubernetes的Service Account和secret
		
系列目录 Service Account Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它 ...
 - kubernetes学习Service之headless和statefulSet结合
		
一.首先说headless Service和普通Service的区别 headless不分配clusterIP headless service可以通过解析service的DNS,返回所有Pod的地址 ...
 - kubernetes之service
		
service出现的动机 Kubernetes Pods 是有生命周期的.他们可以被创建,而且销毁不会再启动. 如果您使用 Deployment 来运行您的应用程序,则它可以动态创建和销毁 Pod. ...
 
随机推荐
- Java实现 LeetCode 354 俄罗斯套娃信封问题
			
354. 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一 ...
 - Java实现 蓝桥杯VIP 算法提高 计算时间
			
算法提高 计算时间 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个t,将t秒转化为HH:MM:SS的形式,表示HH小时MM分钟SS秒.HH,MM,SS均是两位数,如果小于10用0补到 ...
 - java实现迷宫走法
			
** 迷宫走法** 迷宫问题 对于走迷宫,人们提出过很多计算机上的解法.深度优先搜索.广度优先搜索是使用最广的方法.生活中,人们更愿意使用"紧贴墙壁,靠右行走"的简单规则. 下面的 ...
 - PAT D进制的A+B
			
输入两个非负 10 进制整数 A 和 B ( <=230-1 ) ,输出 A+B 的 D (1<D<=10) 进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 D. ...
 - 深入剖析AQS
			
目录 摘要 AbstractQueuedSynchronizer实现一把锁 ReentrantLock ReentrantLock的特点 Synchronized的基础用法 ReentrantLock ...
 - Android Studio自定义签名文件
			
在项目多人开发的时候,如果使用到第三方框架,需要keystore的sha1值的时候,则需要共享debug签名才能进行程序调试 可以在gradle文件中配置如下选项,并且把keystore文件放到项目m ...
 - Android数据库框架-ORMLite
			
参考资料 Android ORMLite 框架的入门用法 Android 快速开发系列 ORMLite 框架最佳实践 添加依赖 compile 'com.j256.ormlite:ormlite-an ...
 - 【MySQL】究竟什么是MVCC呢?
			
MVCC是什么呢? MVCC其实就是一个多版本并发控制,即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据, 在读数据时选择不同版本的数据即可以实现对事务结果的完整性读 ...
 - php5.5下安装pdflib的步骤
			
php5.5下安装pdflib的步骤 1. 下载pdflib 下载地址为:http://www.pdflib.com/download/pdflib-family/pdflib/ 然后选择对应的版本, ...
 - (八)easyexcel的使用
			
使用手册:https://www.yuque.com/easyexcel/doc/easyexcel 主要注意的点就是修改监听器为通用的监听器 原监听器: package read; import j ...