Ingress:

ingress是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apache等负载均衡方向代理服务器,其中还包括规则定义,即URL的路由信息,路由信息得的刷新由Ingress controller来提供。

Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 kubernetes API 打交道,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到这些变化信息后,Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用。

Traefik

Traefik是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。

部署Traefik

①创建ingress-rbac.yaml.将用于service account验证。
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ingress
  namespace: default

---

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: ingress
subjects:
  - kind: ServiceAccount
    name: ingress
    namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
②创建DaemonSet

我们使用DaemonSet类型来部署Traefik,并使用nodeSelector来限定Traefik所部署的主机。

kubectl label nodes 172.20.0.113 edgenode=true
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: traefik-ingress-lb
  namespace: default
  labels:
    k8s-app: traefik-ingress-lb
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      terminationGracePeriodSeconds: 60
      hostNetwork: true
      restartPolicy: Always
      serviceAccountName: ingress
      containers:
      - image: traefik
        name: traefik-ingress-lb
        resources:
          limits:
            cpu: 600m
            memory: 90Mi
          requests:
            cpu: 300m
            memory: 90Mi
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8580
          hostPort: 8580
        args:
        - --web
        - --web.address=:8580
        - --kubernetes
      nodeSelector:
        edgenode: "true"
③创建名为traefik-ingress的ingress,文件名ingress.yaml

首先,我们先创建一个pod和一个services,为负载做准备

//创建pod
kubectl run first-deployment --image=katacoda/docker-http-server --port=80
//创建对应services
kubectl expose deployment first-deployment --port=80

在这里插入图片描述在这里插入图片描述
之后,定义一个ingress实现负载

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-ingress
  namespace: default
spec:
  rules:
  - host: traefik.nginx.io
    http:
      paths:
      - path: /
        backend:
          serviceName: first-deployment
          servicePort: 80
④Traefik UI

使用下面的yaml配置来创建Traefik的Web UI。

apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: default
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - name: web
    port: 80
    targetPort: 8580
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: default
spec:
  rules:
  - host: traefik-ui.local
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui
          servicePort: web

⑤启动

kubectl create -f .

启动之后,发现多了ingress和daemonSet
在这里插入图片描述在这里插入图片描述
在浏览器中测试,说明部署正确
在这里插入图片描述
左侧黄色部分部分列出的是所有的rule,右侧绿色部分是所有的pod

测试是否真能够集群外访问:

在集群的任意一个节点上执行。假如我要访问traefik.nginx.io

curl -H Host:traefik.nginx.io http://192.168.204.144/

在这里插入图片描述
如果你需要在kubernetes集群以外访问就需要设置DNS,或者修改主机(集群外的机器)的hosts文件。文件在/etc/hosts

192.168.204.144 traefik.nginx.io

访问traefik.nginx.io这些地址的流量都会发送给192.168.204.144这台主机,就是我们启动traefik的主机。

Traefik会解析http请求header里的Host参数将流量转发给Ingress配置里的相应service。

修改hosts后就就可以在kubernetes集群外访问以上service,如下图:
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐