Kubernetes 实战 | 安装 Ingress Controller

可以看到之前安装的 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 其实就是像 traefiknginx 一类的反向代理。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 了。