• 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查看
    # 注意配置文件是要访问外国源的,注意换成国内源.
    

  • 相关阅读:
    21天打造分布式爬虫-房天下全国658城市房源(十一)
    21天打造分布式爬虫-简书整站爬取(十)
    21天打造分布式爬虫-下载汽车之家图片(九)
    21天打造分布式爬虫-Crawl类爬取小程序社区(八)
    21天打造分布式爬虫-Spider类爬取糗事百科(七)
    21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)
    21天打造分布式爬虫-多线程下载表情包(五)
    21天打造分布式爬虫-中国天气网和古诗文网实战(四)
    21天打造分布式爬虫-豆瓣电影和电影天堂实战(三)
    3.使用Selenium模拟浏览器抓取淘宝商品美食信息
  • 原文地址:https://www.cnblogs.com/you-men/p/13225606.html
Copyright © 2020-2023  润新知