简单理解K8S对外提供的三种服务转发方式



【1】NodePort 访问方式:



NodePort 类型可以将http 服务暴露在宿主机的端口上,以便外部可以访问。 service模式的结构如下. Service访问(暴露服务外网可访问的端口)-> label selector通过标签标签选择器 -> pods 如: 31217外网暴露端口 -> app1 selector -> app1 31218外网暴露端口 -> app1 selector -> app2 优点:结构简单,容易理解 缺点:一个app 需要占用一个主机端口,端口缺乏管理 属于:4层转发,无法根据http header 和 path 进行路由转发



【2】:LoadBlancer Service



LoadBlancer Service 是 Kubernetes 结合云平台的组件,如国外 GCE、AWS、国内阿里云等等,使用它向使用的底层云平台申请创建负载均衡器来实现,有局限性,对于使用云平台的集群比较方便,这里不再赘述。



【3】Ingress 访问方式:
在service 之前加了一层ingress,类似于负载均衡器(支持7层转发):结构如下
Ingress(类似于nginx) -> service -> label selector-> pods 如:
www.app1.com域名->app1-service->app1 selector->app1
www.app2.com域名->app2-service->app2 selector->app2 
(1) .组成:
ingress controller
将新加入的Ingress转化成Nginx的配置文件并使之生效
ingress服务
将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可
(2) .原理:
1.ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,
2.然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,
3.再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,
4.然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。
(3).模式的优点:增加了7层的识别能力,可以根据 http header, path 进行路由转发。缺点需要配置
(4).Ingress 可以做哪些设置
    这里以nginx-ingress 为例.可以设置如下几参数
    基于http-header 的路由
    基于 path 的路由
    单个ingress 的 timeout (不影响其他ingress 的 timeout 时间设置)
    登录验证
    请求速率limi
    rewrite 规则
    ssl 更多请参考文档 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/annotations.md

Ingress主要文件:

1.namespace.yaml 
创建一个独立的命名空间 ingress-nginx
2.configmap.yaml 
ConfigMap是存储通用的配置变量的,类似于配置文件,使用户可以将分布式系统中用于不同模块的环境变量统一到一个对象中管理;而它与配置文件的区别在于它是存在集群的“环境”中的,并且支持K8S集群中所有通用的操作调用方式。
3.default-backend.yaml 
如果外界访问的域名不存在的话,则默认转发到default-http-backend这个Service,其会直接返回404:
4.rbac.yaml 
负责Ingress的RBAC授权的控制,其创建了Ingress用到的ServiceAccount、ClusterRole、Role、RoleBinding、ClusterRoleBinding
5.with-rbac.yaml 
是Ingress的核心,用于创建ingress-controller。前面提到过,ingress-controller的作用是将新加入的Ingress进行转化为Nginx的配置

安装部署:



https://github.com/kubernetes/ingress-nginx/archive/nginx-0.11.0.tar.gz
unzip nginx-0.11.0.tar.gz
cd ingress-nginx-nginx-0.11.0/deploy
主要文件作用:
configmap.yaml:提供configmap可以在线更行nginx的配置
default-backend.yaml:提供一个缺省的后台错误页面 404
namespace.yaml:创建一个独立的命名空间 ingress-nginx
rbac.yaml:创建对应的role rolebinding 用于rbac
tcp-services-configmap.yaml:修改L4负载均衡配置的configmap
udp-services-configmap.yaml:修改L4负载均衡配置的configmap
with-rbac.yaml:有应用rbac的nginx-ingress-controller组件

修改:default-backend.yaml 中镜像地址为:image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
修改:with-rbac.yaml 文件
(1)在deployment.spec.template.spec下增加:hostNetwork: True项暴露nginx-ingress-controller pod的服务端口(80)
(2)修改镜像地址为:image: registry.cn-beijing.aliyuncs.com/k8s_apps/nginx-ingress-controller:0.14.0
执行:
kubectl create -f namespace.yaml
kubectl create -f default-backend.yaml  
kubectl create -f configmap.yaml
kubectl create -f tcp-services-configmap.yaml
kubectl create -f udp-services-configmap.yaml
kubectl create -f rbac.yaml 
kubectl create -f with-rbac.yaml
kubectl get pods -n ingress-nginx -o wide
测试访问其他节点:
 curl 192.168.0.165
 curl 192.168.0.164
返回:
default backend - 404
表示OK
############################################
参考:
https://blog.51cto.com/devingeng/2149377



2.创建后端tomcat服务:



cat tomcat-pod.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat
  namespace: mt-math
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: mt-math
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat
        release: canary
    spec:
      containers:
      - name: tomcat
        image: tomcat:7-alpine
        ports:
        - name: httpd
          containerPort: 8080
        - name: ajp
          containerPort: 8009


创建tomcat服务并查看状态


kubectl create -f tomcat-pod.yaml
kubectl get all -n mt-math


将后端tomcat 加入转发规则中 创建ingress yaml文件


cat ingress-wyl-tomcat.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-tomcat-wyl
  namespace: default
  annotations: 
    kubernets.io/ingress.class: "nginx"
spec:
  rules:
  - host: tomcat.bestyunyan.com  #生产中该域名应当可以被公网解析
    http:
      paths:
      - path: 
        backend:
          serviceName: tomcat
          servicePort: 8080 #服务内网端口


修改windows hosts文件并测试



浏览器访问:OK 参考:参考: