2

诞生

通常情况下,service和pod的IP仅可在集群内部访问
k8s提供了service方式:NodePort 来提供对外的服务,外部的服务可以通过访问Node节点ip+NodePort端口来访问集群内部的资源,外部的请求先到达service所选中的节点上,然后负载均衡到每一个节点上.
NodePort虽然提供了对外的方式但也有很大弊端:

  1. 由于service的实现方式:user_space 、iptebles、 3 ipvs、方式这三种方式只支持在4层协议通信,不支持7层协议,因此NodePort不能代理https服务.
  2. NodePort 需要暴露service所属每个node节点上端口,当需求越来越多,端口数量过多,导致维护成本过高,并且集群不好管理。

原理

Ingress也是Kubernetes API的标准资源类型之一,它其实就是一组基于DNS名称(host)或URL路径把请求转发到指定的Service资源的规则。用于将集群外部的请求流量转发到集群内部完成的服务发布。我们需要明白的是,Ingress资源自身不能进行“流量穿透”,仅仅是一组规则的集合,这些集合规则还需要其他功能的辅助,比如监听某套接字,然后根据这些规则的匹配进行路由转发,这些能够为Ingress资源监听套接字并将流量转发的组件就是Ingress Controller。
Ingress 控制器不同于Deployment 等pod控制器的是,Ingress控制器不直接运行为kube-controller-manager的一部分,它仅仅是Kubernetes集群的一个附件,类似于CoreDNS,需要在集群上单独部署。

ingress controller通过监视api server获取相关ingress、service、endpoint、secret、node、configmap对象,并在程序内部不断循环监视相关service是否有新的endpoints变化,一旦发生变化则自动更新nginx.conf模板配置并产生新的配置文件进行reload

QQ截图20200102153015.png

部署ingress controller

# ingress controller 安装配置文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

#替换yaml配置文件中的镜像
sed -i  "s#quay.io/kubernetes-ingress-controller#registry.aliyuncs.com/google_containers#g" mandatory.yaml
#安装
kubectl apply -f mandatory.yaml

如果需要部署多个ingress controller 可以修改mandatory.yaml中的Deployment为DaemonSet

kubectl get ns
[root@master ingress]# kubectl get ns
NAME              STATUS   AGE
default           Active   9d
ingress-nginx     Active   47h
kube-node-lease   Active   9d
kube-public       Active   9d
kube-system       Active   9d

kubectl get pods -n ingress-nginx
[root@master ingress]# kubectl get pods -n ingress-nginx
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-74ccc4fb-hzzs2   1/1     Running   0          47h

添加Service 以nodeport的形式(不指定时为随机端口)

[root@master ingress]# cat 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

---
# 也可以直接下载官方的
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
#部署service
kubectl apply -f service-nodeport.yaml

创建后端ingress后端服务

#创建一个serveice关联三个pods pod控制器为 Deployment

[root@master ingress]# cat deploy-demo.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  selector:
    app: myapp
    release: canary
  ports:
  - name: http
    targetPort: 80
    port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-backend-pod
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v2
        ports:
        - name: http
          containerPort: 80
          
kubectl apply -f deploy-demo.yaml

将创建的nginx服务关联到ingress-nginx中

[root@master ingress]# cat ingress-myapp.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress
  namespace: default
spec:
  rules:
  - host: myapp.test.com
    http:
      paths:   
      - path:   ##可以加url路径来区分多个服务
        backend:
          serviceName: myapp
          servicePort: 80
          
kubectl apply -f ingress-myapp.yaml

浏览器测试
QQ截图20200102153640.png


Cherish
216 声望4 粉丝

引用和评论

0 条评论