#通过service实现固定访问ip

    service是k8s最核心的概念,通过创建service,可以为一组具有相同功能的Pod应用提供统一的访问入口,并且将请求进行负载均衡分发到后端的各个容器应用上

    k8s创建service的时候,会分配一个固定不变的ip地址,这个ip是虚拟ip,也叫做VIP,它不是真实的ip地址,外部是不能访问的,只能在k8s内部去访问,当然这个service可以感知后端机器ip的变化,如果ip变化,service会自动更新,保证service与后端的ip是一个映射的关系,比如说后端一台10机器的ip出现问题,又起来了一台11,那么service会自动把10剔除,然后把请求转发到11,动态感知

    service又分为两种类型,一种内部service,一种外部service,一个叫内部服务,一个叫外部服务

    service是根据标签去定位查找同属于一个标签的机器


#内部服务,内部访问

#通过service实现内部负载均衡,这种是通过iptables实现负载均衡,在企业当中一般不推荐iptables做负载均衡

#创建主机的时候增加service内部服务,以下这么创建就是绑定了一个service


K8s中的部分service_K8s

K8s中的部分service_nginx_02

#创建成功之后这个VIP就是固定的,访问这个VIP就是返回后端的服务(轮询访问两台),这样也实现了负载均衡的功能

K8s中的部分service_nginx_03

#service是通过iptables的DNAT映射规则,实现端口转发,从而实现负载均衡

#它是通过kube-proxy这个组件这台机器的iptables模块调用DNAT去添加规则


#外部服务,内部和外部访问

#创建两台外部服务主机

K8s中的部分service_K8s_04


#外部服务与内部服务

外部服务和内部服务访问的方式是一样的,都是在内网访问。ip加端口然后把请求转发到后端

#外部服务与内部服务的区别就在于外部服务比内部服务多了一个端口,这个端口是随机的,它同时也在宿主机上起了这个端口

K8s中的部分service_nginx_05

此时宿主机的ip地址加上这个随机的端口就可以在外部访问

192.168.254.206:31238

###


###

#用户想要通过外网用户想访问内部容器服务的话,K8s提供了三种方式

1.NodePort方式,也就是外部(service)服务;原理:每一个node上暴露出一个端口,外部网络可以通过nodeip+nodeport访问到后端的service


2.LoadBalancer方式,是在nodeport基础上面,找一个第三方的均衡器来均衡,把node当做后端机器


3.Ingress方式,是一种HTTP方式的路由转发机制,ingress是k8s 1.2版本后出现的,它可以ingress用户实现使用nginx等开源的反向代理负载均衡器去实现对外暴露服务的


#ingress一般有三个组件:

1.负载均衡器(默认是可以使用nginx)
2.控制器ingress controller
3.规则配置ingress

#nginx 就是作用负载均衡,独立的web服务器

#控制器ingress controller

这个组件可以看做是一个监视器。它可以不断的跟k8s API交互,联系,可以实时感知后端service以及当中的pod等数量变化,比如pod的增加减少,当监视到这些变化之后就会结合ingress生成相应的配置再把这些配置刷新到nginx负载均衡中去

#规则配置ingress

简单理解就是一个规则定义,定义某个域名去访问哪个service,当访问域名请求的时候去转发service,然后结合ingress-controller结合,然后动态将规则写入到负载均衡配置中,从而实现整体的服务发现和负载均衡

总结:其实就是ingress controller通过实时感知后端pod变化然后结合ingress规则把配置试试写入到nginx负载均衡器完成请求转发

K8s中的部分service_均衡器_06

K8s中的部分service_负载均衡_07

这种模式对比LoadBalancer,ingress模式就不用手工去配置了,ingress会全自动进行配置,只要定义好ingress规则

从上图看出,其实请求进来之后都会被负载均衡器拦截,ingress-controller通过跟ingress规则交互,然后得知去访问哪个域名对应哪个service

#负载均衡器可以在每个node上都进行部署,这样就可以解决不确定负载均衡器部署到哪台机器

#部署ingress

#部署ingress-nginx-controller控制服务

#从官网下载,在master端

#为什么要在master端进行下载

#因为是通过master端上的Api授权,master端执行这个文件默认就是有权限的,授权之后,至于这个程序部到哪个节点是通过scheduler去调度的,所以说在master端去下载就是把这个程序部署到master,只不过是在master去执行这个yaml文件而已,最终部署还是分配到node节点上面的

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/st  atic/mandatory.yaml


#打开修改213行,表示开启pod中运行的容器开启在宿主机上看到网络接口,类似于创建容器指定host网络模式,容器中运行的应用程序,它的端口网络信息可以在宿主机上看到,说白了就是共享宿主机的网络资源

[root@yang-0 ~]# vim mandatory.yaml

#加入:注意缩进格式很严格

hostNetwork: true


#然后执行这个yaml文件

[root@yang-0 ~]# kubectl apply -f mandatory.yam


#如果执行有问题,可以调试之后,删除配置再执行

[root@yang-0 ~]# kubectl delete -f mandatory.yaml

#部署成功之后查看controller程序状态

[root@yang-0 ~]# kubectl get pod -n ingress-nginx

#ingress controller和nginx是在一起的,这个容器里面就有nginx服务,这时候nginx和ingress controller就已经配置好了,下面配置ingress规则


#虽然两个服务已经部署完成,但是nginx对外还是不能访问的,所以需要配置对外访问的服务

#将ingress controller暴露一个service

#创建一个新的yaml文件

[root@yang-0 ~]# vim nginx-service-nodeport.yaml
[root@yang-0 ~]# mkdir nginx_ingress
[root@yang-0 ~]# cp nginx-service-nodeport.yaml  mandatory.yaml nginx_ingress/
[root@yang-0 ~]# cd nginx_ingress/
[root@yang-0 nginx_ingress]# vim nginx-service-nodeport.yaml

#加入:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx


#运行yaml文件

[root@yang-0 nginx_ingress]# kubectl apply -f nginx-service-nodeport.yaml

#查看服务

[root@yang-0 nginx_ingress]# kubectl get svc

#指定命名空间查看ingress服务

[root@yang-0 nginx_ingress]# kubectl get svc -n ingress-nginx


#定义ingress规则文件,定义某个域名访问某个服务的,其实是一个映射文件

#创建ingress规则文件,在master端

#表示访问v1.yang.com的时候把请求转发到v1-yang-com

#[root@yang-0 nginx_ingress]# vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: v1-yang-com
spec:
  rules:
    - host: v1.yang.com
      http:
        paths:
        - path: /
          backend:
            serviceName: v1-yang-com
            servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: v2-yang-com
spec:
  rules:
    - host: v2.yang.com
      http:
        paths:
        - path: /
          backend:
            serviceName: v2-yang-com
            servicePort: 80
apiVersion: extensions/v1beta1    #定义的api版本,一般使用v1
kind: Ingress    #定义类型
metadata:    #元数据标签
  name: v1-yang-com    #元数据ingress名字
spec:
  rules:    #定义规则的
    - host: v1.yang.com    #访问域名
      http:
        paths:
        - path: /    #默认访问/
          backend:
            serviceName: v1-yang-com    #服务的名称
            servicePort: 80#服务的端口
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: v2-yang-com
spec:
  rules:
    - host: v2.yang.com
      http:
        paths:
        - path: /
          backend:
            serviceName: v2-yang-com
            servicePort: 80

#web页面创建主机

K8s中的部分service_nginx_08


#创建加载ingress规则文件

[root@yang-0 nginx_ingress]# kubectl create -f ingress.yaml

K8s中的部分service_K8s_09


#查看80端口是所在机器

#在win客户端hosts文件中添加对应域名解析,最终浏览器访问

192.168.254.208  v1.yang.com  v2.yang.com

K8s中的部分service_均衡器_10


#增加加node到ingress服务中

#K8s的web页面创建一个v3服务

K8s中的部分service_nginx_11


#增加win上hosts域名解析

192.168.254.208  v1.yang.com  v2.yang.com  v3.yang.com


#ingress中增加规则映射

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: v3-yang-com
spec:
  rules:
    - host: v3.yang.com
      http:
        paths:
        - path: /
          backend:
            serviceName: v3-yang-com
            servicePort: 80


#加载ingress规则

[root@yang-0 nginx_ingress]# kubectl apply -f ingress.yaml


#总结:

#ingress controller 就是和Apiserver打交道的,能到动态监测感知pod增加减少

#ingress 就是把某个域名和某个服务做绑定的

#nginx 上面的这些配置结合ingress controller最终都会动态写到负载均衡里面去,所以真正的重点就是这个负载均衡器nginx里面的配置,这个配置它是自动做写的

###