可以看到之前安装的 Kubernetes Dashboard Web UI 没有办法直接在集群外部访问,这是由于 Kubernetes 默认 Service 提供的访问方式是 ClusterIP,也就是在集群内部通过虚拟 IP 访问。这个 IP 在集群外是无法访问的。当然,我们可以使用 NodePort 方式来提供 Service 服务,但是这样的话我们就需要在机器上自己设置反向代理,比较麻烦。
什么是 Ingress Kubernetes 使用 Ingress 的方式解决了这个问题。Ingress 也是集群上的一种资源,用来路由外部的流量到集群内部的 Service。
一个 Ingress 资源类似这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 kind: Ingress apiVersion: extensions/v1beta1 metadata: name: kubernetes-dashboard-web-ui namespace: kubernetes-dashboard spec: rules: - host: dashboard.kubernetes http: paths: - path: / backend: serviceName: kubernetes-dashboard servicePort: 443
和其他反向代理配置很类似,在 rules 中指定不同的代理规则,一个规则则由 host 和对应的集群中的 Service 组成。不同的 host 可以对应不同的服务,一个 host 下也可以通过 path 来映射到不同服务,配置相当灵活。
然而,Ingress 仅仅是描述了对应关系,需要一个实际的 Ingress Controller 来响应 HTTP/S 请求并将请求路由到正确的后端服务上,而 Ingress Controller 其实就是像 traefik、nginx 一类的反向代理。Kubernetes 负责收集集群中的 Ingress 资源,并自动将配置注入到 Ingress Controller 使其加载,从而达到服务发现等功能。
安装 Ingress Controller 使用下面的 yaml 文件即可在集群中部署 traefik 作为 Ingress Controller,这里采用了 NodePort 的方式来提供服务,可以根据自己的情况选择不同的方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 --- apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller rules: - apiGroups: - "" resources: - services - endpoints - secrets verbs: - get - list - watch - apiGroups: - extensions resources: - ingresses verbs: - get - list - watch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: replicas: 1 selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 containers: - image: traefik name: traefik-ingress-lb ports: - name: http containerPort: 80 - name: admin containerPort: 8080 - name: https containerPort: 443 args: - --api - --kubernetes - --logLevel=INFO - --defaultentrypoints=http,https - --entrypoints=Name:http Address::80 - --entrypoints=Name:https Address::443 TLS - --insecureSkipVerify=true --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - protocol: TCP port: 80 name: web nodePort: 30080 - protocol: TCP port: 8080 name: admin nodePort: 30880 - protocol: TCP port: 443 name: https nodePort: 30443 type: NodePort
安装好 Ingress Controller 之后,把上面的 Kubernetes Dashboard Ingress 部署到集群中,就可以通过你指定的域名和端口访问到 Kubernetes Dashboard 了。