通知:即日起,禁止携带Note 7登机,且不得作为航空货物托运或承运
06-17
上一节我们分享了如何对外暴露服务。今天我们将研究另一种向外界公开服务的方式:ingress。
那么什么是入口呢?它与我们之前遇到的暴露服务有什么不同? 0x01 什么是入口?通常情况下,我们的主机或者集群会服务多个外部站点(比如a.com和b.com就是一个集群同时对外提供服务)。这在 Web 服务器中称为虚拟主机。
这样的话,在k8s中,如果使用前面提到的service服务,只能为不同的服务暴露不同的NodePort,比如a.com:0和b.com:1,也就是说必须要传入域名。通过端口访问站点服务。
这显然不能满足我们的要求。你可能会说,那我为什么不创建一个 nginx 部署,然后在 nginx 中配置规则,将不同的域名转发到不同的服务/pod 呢?恭喜,ingress 做到了。
而且ingress简化了规则的配置,通过ingress提供的API可以实现配置转发到Web服务器。 0x02 Ingress部署有很多实现ingress的方案,比如nginx、kong等,可以去k8s官方文档查看更多方案。
我们这里选择了Traefik。选择Traefik的原因之一是它易于部署。
当然,你也可以选择比较流行的。 nginx(ingress只需要一个yaml文件,但是为了方便理解,我们将整个部署文件分成几个部分,分别进行解释:首先我们需要创建一个账户,其中包含使用过程中需要使用的权限由于k8s使用的是基于角色(Role)的访问控制(RBAC),所以它的创建过程和我们平常的账户创建授权不同,它需要创建一个服务账户和一个角色,然后是服务。
帐户与角色绑定,这样服务帐户就可以拥有特定的权限。代码语言:txt copy --- 创建服务帐号 apiVersion: v1kind: ServiceAccountmetadata: namespace: kube-system name: ingress-controller-account --- 创建角色并更改角色拥有 ingress kind 所需的所有权限: ClusterRoleapiVersion: rbac .authorization.k8s.io/v1metadata: 名称: ingress-controller-role 命名空间: kube-systemrules: - apiGroups: - "" 资源: - 服务 - 端点 - 秘密 动词: - get - list - watch - apiGroups: -extensions -networking.k8s.io resources: -ingresses -ingressclasses verbs: -get -list -watch - apiGroups: -extensionsresources: -ingresses/status verbs: -update--- 将服务帐户绑定到角色,以便服务帐户具有角色中定义的权限 kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: namespace: kube-system name: ingress-controller-role-bindingroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole 名称:ingress -controller-rolessubjects:- kind:ServiceAccount namespace: kube-system name: ingress-controller-account 创建服务角色后,开始创建应用程序(入口控制器)部署文件。
这里没有使用Deployment部署,而是使用了DaemonSet。两者基本相同。
唯一的区别是调度策略,DaemonSet 会保证每个工作节点有且唯一一个 pod 的端口暴露给外界。我们使用容器本身提供的端口映射能力,而不是使用NodePort将服务暴露给外界,因为NodePort虽然可以修改,但有范围限制。
实现了k8s配置,但是这样做本身就不符合规范。代码语言:txt复制kind: DaemonSetapiVersion: apps/v1metadata: namespace: kube-system name: traefik-ingress-controller-daemon-set labels: k8s-app: traefik-ingress-controllerspec: 选择器: matchLabels: k8s-app: traefik -ingress-controller模板:元数据:标签:k8s-app:traefik-ingress-controller规范:serviceAccountName:ingress-controller-account终止GracePeriodSeconds:60个容器:-图像:ustc-edu-cn.mirror.aliyuncs.com/library/ traefik:v2.4 名称:入口控制器 端口: - 名称:http 容器端口:80 主机端口:80 - 名称:https 容器端口:主机端口: - 名称:管理 容器端口:主机端口:securityContext:功能:drop: - 全部添加: - NET_BIND_SERVICE args: # 无需密码即可启用仪表板。
不推荐已修复#以进行生产。 - --api.insecure - --api.dashboard # 指定我们要使用 Traefik 作为入口控制器。
- --providers.kubernetesingress # 定义两个入口点端口,并设置从 HTTP 到 HTTPS 的重定向。 - --entryPoints.web.address=:80 - --entryPoints.websecure.address=: #- --entrypoints.web.http.redirections.entryPoint.to=websecure #- --entrypoints.web.http.redirections 。
EntryPoint.scheme=https # 启用调试日志记录。对于找出为什么某些东西可能无法工作很有用。
获取 pod 的日志。 - --log.level=info 将以上两部分代码保存为文件,然后执行 kubectl apply -f traefik-ingress.yml 即可完成 ingress 的部署:可以通过 kubectl -n kube 查看部署状态-system get daemonset 命令:0x03 ingress 以我们上一节暴露的服务为基础,这样 nginx-deployment 就可以通过 ingress 对外提供服务,创建 ingress 也比较简单。
主要内容大致如下。这里有两点需要注意。
首先是这里的spec.rules.0.host(nginx-ingress.local)的值是我自定义的,不存在。对于域名,您可以将其更改为您可以解析的域名。
如果稍后访问,则需要配置hosts。第二个spec.rules.0.http.paths.0.backend.service.name是我们在上一节的暴露服务中创建的服务名称,可以通过kubectl get svc查看。
代码语言:txt复制 apiVersion:networking.k8s.io/v1kind:Ingressmetadata:名称:nginx-deployment-ingressspec:规则:-主机:nginx-ingress.local http:路径:-路径:/pathType:前缀后端:服务: name: nginx-svc port: number: 80 将上述yaml代码保存为nginx-deployment-ingress.yml,然后执行kubectl apply -f nginx-deployment-ingress.yml即可完成ingress的创建。将9...93 nginx-ingress.local添加到hosts中(windows位于C:\Windows\System32\drivers\etc\hosts,linux和mac位于/etc/hosts)并保存。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-21
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用