• kubernetes将集群外部流量引入集群内


    一、service:pod是有生命周期的,我们想给客户一个固定的访问端点,在客户端与服务端之间启动一个固定的中间层,依赖于kubernetes的一个附件CoreDns。kubernetes有三类网路地址

    1.node network           节点网路,实在存在的,配置在节点接口之上的

    2.pod network             pod网络,实在存在的,配置在pod资源之上的

    3.cluster network        集群地址,虚拟地址,仅出现service的规则当中

    service:有三种工作模式

        userspace:用户空间,用户请求到达service以后,先把他转为本地监听在某个套接字上的用户空间的kube-proxy,由kube-proxy负责处理。kube-proxy处理完成以后再转给service ip 最终代理至这个service管理的各pod实现调度。效率很低,先到内核空间--->用户空间--->内核空间.是kube-proxy负责调度的

        iptables:客户端ip请求时直接请求service ip,请求报文在本地内核空间的service规则截取,进而直接调度给相关的pod。由iptables规则直接负责调度。1.10-之前用

        ipvs:客户端ip请求时直接请求service ip,请求报文在本地内核空间的service ipvs截取,进而直接调度给相关的pod。由ipvs规则直接负责调度。1.1.1+用的是ipvs

        service的pod资源发生改变,例如标签选择器适用的pod增加。适用的信息会立即反映到api server中,kube-proxy watch到api server中的变化 ,立即转为ipvs的规则。动态实时转换

    使用清单创建service资源:

        获取service字段信息:kubectl explain service

    type格式是clusterIP

    apiVersion: v1
    kind: Service
    metadata:
      name: redis
      namespace: default
    spec:
      selector:
        app: redis
        role: logstor
      clusterIP: 10.97.97.97
      type: ClusterIP
      ports:
      - port: 6379
        targetPort: 6379

    type格式是nodeport,可以在集群外访问。通过访问每个节点的ip:nodeport

    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
      namespace: default
    spec:
      selector:
        app: myapp
        release: canary
      clusterIP: 10.98.98.98     #如果将clusterIP设置为None就是无头的service,没有ip地址,但是可以通过名称myapp.defalut.svc.cluster.local.进行访问
    sessionAffinity: ClientIP
    type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080
    红色字体表示设置选择session保持

    二、ingress Controller + service(仅用于对pod的分类,service关联的有几个pod,就是upstream后端pod) 实现

    ingress基于service分类,识别出有几个pod和pod信息。并且把pod的信息(ip地址)生成配置信息,注入到ingress Controller

    k8s还有yi一种引入集群外部流量的方式ingress,ingress资源是一种七层调度器,他利用一种七层pod来实现将外部流量引入到内部来。事实上他也脱离不了service的工作。 作为ingress 用于基于七层调度时,我们必须要用pod中的运行的七层服务功能的mirror调度。可用的解决方案nginx,haproxy等。

    nginx

    Traefik

    Envooy(适用于微服务)

    ingress的定义   kubectl explain ingress 

    安装ingress可以参照 https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

    用ingress-nginx代理到后端tomcat

    定义后端tomcat的deployment和service

    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat
      namespace: default
    spec:
      selector:
        app: tomcat
        release: canary
      ports:
      - name: http
        port: 8080
        targetPort: 8080
      - name: ajp
        port: 8009
        targetPort: 8009
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tomcat-deploy
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: tomcat
          release: canary
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      template:
        metadata:
          labels:
            app: tomcat
            release: canary
        spec:
          containers:
          - name: tomcat-container
            image: tomcat:8.5.32-jre8-alpine
            imagePullPolicy: IfNotPresent
            ports:
            - name: http
              containerPort: 8080
            - name: ajp
              containerPort: 8009

    vim ingress-tomcat.yaml 

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress-tomcat
      namespace: default
      annotations:
        kubernetes.io/ingress.clall: "nginx"
    spec:
      rules:
      - host: tomcat.yiruiduan.com
        http:
          paths:
          - path: /tomcat
            backend:
              serviceName: tomcat
              servicePort: 8080

    红色部分是想对应的,只有在同一个namespace才能找到后端的tomcat。ingress是通过service确定哪些是他的后端服务器的所以serviceName要和后端的service名称相同

    注:根据url路径代理,后端的tomcat必须存在真是的path路径。即tomcat的pod中/usr/local/tomcat/webapps的目录下有tomcat路径,否则会返回404

    构建https服务

    创建secret对象 kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key

    查看secret对象 kubectl get secret

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress-tomcat-tls
      namespace: default
      annotations:
        kubernetes.io/ingress.clall: "nginx"
    spec:
      tls:
      - hosts:
        - tomcat.yiruiduan.com
        secretName: tomcat-ingress-secret
      rules:
      - host: tomcat.yiruiduan.com
        http:
          paths:
          - path: /tomcat
            backend:
              serviceName: tomcat
              servicePort: 8080
          - path:
            backend:
              serviceName: tomcat
              servicePort: 8080

    访问测试:https://tomcat.yiruiduan.com:80443

  • 相关阅读:
    微信扫码登陆
    jquery的js代码兼容全部浏览器的解决方法
    如何才能成为一名优秀的架构师
    Bootstrap 完全教程笔记
    vue.js笔记总结
    dot.js模板实现分离式
    python基础知识1
    tensorflow基础知识1
    tensorflow基础知识
    常用python库文件
  • 原文地址:https://www.cnblogs.com/both/p/9620652.html
Copyright © 2020-2023  润新知