「Kubernetes Objects」- Ingress

  CREATED BY JENKINSBOT

问题描述

Ingress 是个 API 对象,管理外部(集群外部)对内部服务的访问,暴露“从集群外到集群内部服务的”HTTP 与 HTTPS 路由。

注意与 Ingress Controller 进行区分,Ingress Controller 负责执行 Ingress 资源的定义。Ingress Controller 类似于我们平时作为反向代理存在的 Nginx 服务,而 Ingress 则像 Nginx 配置。

该笔记将记录:与 Ingress 资源有关的内容(但不包含 Ingress Controller 组件部署相关内容),以及常见问题的处理。

解决方案

创建 Ingress 资源

# ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-default
spec:
  rules:
  - host: nginx.cinyi.com
    http:
      paths:
      - backend:
          serviceName: nginx-default
          servicePort: 80
      # 根据路径来路由请求到不同服务
      - path: /foo
        backend:
          serviceName: service-foo
          servicePort: 80

创建 HTTPS 的 Ingress 资源

定义 TLS 资源(Secret ):

kubectl create secret tls mytlssecret \
  --cert=/path/to/cert/file \
  --key=/path/to/key/file

// 注意事项:
// --cert must be .PEM encoded (Base64-encoded DER format)
// --key must be in what is commonly called PEM private key format, unencrypted.
// 这两个文件的开始和结尾行都会被忽略。 

// 如果需要生成 Secret 资源文件,使用:
kubectl create secret tls mytlssecret \
  --cert=/path/to/cert/file --key=/path/to/key/file \
  --dry-run=true -o yaml > mytlssecret.yaml

定义并应用部署资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 8m
spec:
  # 为域名使用 Secret 资源
  tls:
  - secretName: mytlssecret
    hosts:
    - mydomain.example.com
  rules:
  - host: mydomain
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 8080

如果有多个 Ingress Controller 部署在集群中。那么在 Ingress 中需要添加 ingress.class 注解来指定要使用的 Ingress Controler 类型。

相关链接

关于Ingress网络:Understanding kubernetes networking: ingress
Studying the Kubernetes Ingress system

K8s Ingress 模式简介及示例
k8s1.8 ingress 配置

参考文献

kubernetes/CONCEPTS/Ingress
kubernetes/Concepts/Ingress Controllers
k8s1.8 ingress 配置
Sample Ingress resource YAML
NGINX Configuration/Annotations
Secrets | Kubernetes
Basic usage – NGINX Ingress Controller