问题描述
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