可以看到之前安装的 Kubernetes Dashboard Web UI 没有办法直接在集群外部访问,这是由于 Kubernetes 默认 Service 提供的访问方式是 ClusterIP,也就是在集群内部通过虚拟 IP 访问。这个 IP 在集群外是无法访问的。当然,我们可以使用 NodePort 方式来提供 Service 服务,但是这样的话我们就需要在机器上自己设置反向代理,比较麻烦。
什么是 Ingress
Kubernetes 使用 Ingress 的方式解决了这个问题。Ingress 也是集群上的一种资源,用来路由外部的流量到集群内部的 Service。
一个 Ingress 资源类似这样:
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 的方式来提供服务,可以根据自己的情况选择不同的方式。
---
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 了。