ingress是k8s对外暴露服务的一种方式。当我们使用购买的公有云服务时,平台已经提供部署好的ingress,用户只需要添加挂载策略即可。
对于自己搭建的k8s环境,如上一篇介绍,需要我们自己部署ingress。
外部通过ingress访问服务的工作流程如下:
用户 → ingress-nginx(pod) → ingress-nginx(controller控制器) → ingress →service → pod
这里面有ingress和ingress-controller的概念,简单理解就是:
ingress相当于把原来需要改nginx 配置,然后配置各种域名对应哪个 service的动作抽象出来,变成一个 ingress 对象(可以用 yaml 创建),每次不需要改nginx 了,直接修改 yaml 然后创建/更新就可以了。剩余就是nginx怎么处理的事情;
ingress-controller就是解决 “nginx怎么处理” 的;ingress-controller通过与k8s的API Server交互,动态的去感知集群中ingress 规则变化,读取并按照自己模板生成一段nginx 配置,再写到nginx pod 里,最后 reload。
k8s有多种类型的ingress-controller,这里用到的是官方的controller:https://github.com/kubernetes/ingress-nginx
ingress的部署包含如下步骤
1、部署ingress controller
2、部署后端http服务(这里部署了mysql和phpmyadmin)
3、部署ingress-nginx service
4、创建ingress
根据自己的k8s版本查看对应的ingress-nginx版本,访问脚本仓,选择对应的k8s版本,获取ingress-nginx版本
进入ingress-nginx的代码仓地址,选择对应的版本下载到本地,一般部署文件在【deploy/static】或者【deploy/static/provider】下面。
安装并查看(PS:注意下80和443的端口是否被占用,默认会使用这两个作为http和https的端口)
kubectl apply -f mandatory.yaml
kubectl apply -f cloud-generic.yaml
部署文件里面把ingress controller部署在ingress-nginx的命名空间下面
kubectl get pods -n ingress-nginx
浏览器访问localhost,会返回404.
这里选择了mysql和phpmyadmin,主要平时用的比较多,可以在k8s的dashboard上进行部署,选择部署在default的命名空间。
为了使用方便把3306的端口暴露出来
暴露端口可以采用随机端口,phpmyadmin的缺省端口是80,所以目标端口设置为80
正常情况下1.1做完后,ingress-nginx service已经部署在ingress-nginx的命名空间下面了,这个服务的类型是LoadBalancer(也可以改成NodePort),如果没有部署,可以用下面的yaml进行创建(保存为nginx-service.yaml,然后执行kubectl apply -f nginx-service.yaml):
kind: Service
apiVersion: v1
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
externalTrafficPolicy: Local
type: LoadBalancer
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ports:
- name: http
port: 80
targetPort: http
- name: https
port: 443
targetPort: https
---
部署完查看
kubectl get service -n ingress-nginx
将ingress创建在default的命名空间,将之前的mysqladmin挂载上,部署文件如下(可以保存为ingress-default.yaml,然后执行kubectl apply -f ingress-default.yaml):
apiVersion: extensions/v1beta1 # api版本
kind: Ingress # 清单类型
metadata: # 元数据
name: ingress-default # ingress的名称
namespace: default # 所属名称空间
annotations: # 注解信息
kubernetes.io/ingress.class: "nginx"
spec: # 规格
rules: # 定义后端转发的规则
- host: localhost # 通过域名进行转发
http:
paths:
- path: / # 配置访问路径,如果通过url进行转发,需要修改;空默认为访问的路径为"/"
backend: # 配置后端服务
serviceName: mysqladmin
servicePort: 80
---
由于mysqladmin的url就是根目录,所以访问路径设置为【/】
完成后就可以通过ingress访问mysqladmin(这里的环境将ingress暴露为8080端口):
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。