Kubernetes中Ingress介绍

[复制链接]

975

主题

975

帖子

629

积分

高级会员

Rank: 4

积分
629
分享到:
发表于 2022-6-28 13:18:35 | 显示全部楼层 |阅读模式
如何暴露您Kubernetes集群内部 "应用服务" 并向外(互联网)提供访问服务!!!
通常情况下集群内部Service和Pod仅可在集群内部网络中通过IP地址访问。所有到达边界路由器的流量或被丢弃或被转发到其它地方。(Ingress的存在即是完成以上之目的)不直接使用Ingress资源,也可有多种方法暴露Service。使用 Service.Type=LoadBalancer使用 Service.Type=NodePort有几个是废弃的未定义Ingress的情况下,外部请求访问内部服务时可能这样Internet ---------> Service定义Ingress授权请求服务入站连接到达集群的规访问则可能这样Internet ------> Ingress ------> ServiceIngress 它能做什么
可以将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或者 Service.Type=LoadBalancer 类型的服务,典型的访问方式是 "HTTP"。先决条件:您必须具有 ingress 控制器才能满足 Ingress 的要求。仅创建 Ingress 资源无效,比如ingress-nginx。一定要检查一下控制器的 beta 限制。 在 GCE/GKE 之外的环境中,需要将控制器部署 为 Pod。默认后段:如果没有主机或路径与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到您的默认后端。默认后端通常是 Ingress 控制器的配置选项,并且未在 Ingress 资源中指定。更多更详细的Ingress描述及使用方法 ?参考中文官方 Ingress 文档Ingress 控制器
想让Ingress资源工作您单独部署个Ingress没有用,您得部署一个Ingress Controller来实现Ingress。与作为 kube-controller-manager 可执行文件的一部分运行的其他类型的控制器不同,Ingress 控制器不是随集群自动启动的。 基于此页面,您可选择最适合您的集群的 Ingress 控制器实现。Kubernetes 作为一个项目,目前支持和维护 GCE 和 nginx 控制器。您可以在集群中部署和使用多个 Ingress 控制器,创建Ingress时使用 "ingress.class" 进行注释。更多更详细的控制器使用可 参考中文官方 Ingress controller 描述多个Ingress控制器并存的示例
多个控制器切换使用,修改红色字体即可
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: test annotations: ?kubernetes.io/ingress.class: "nginx"spec: tls: - secretName: tls-secret backend: ?serviceName: echoheaders-https ?servicePort: 80haproxy-ingress参考 ?haproxy-ingress in github

在使用kubeadm工具部署的集群下部署Ingress-nginx

Github站点:https://github.com/kubernetes/ingress-nginxhttps://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.mdKubernetes站点:https://kubernetes.github.io/ingress-nginx/https://kubernetes.github.io/ingress-nginx/deploy/命令帮助
rules:规则的对象列表,谁调度到谁那里去(路径调度、主机调度)
backend:调度到后端相关pod资源,关联后段Pod,serviceName、servicePort[root@node1 ~]# kubectl explain ingress.spec[root@node1 ~]# kubectl explain ingress.spec.rules下载安装nginx-ingress-controller

需提前下载镜像到本地,或者改用阿里云镜像[root@node1 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml[root@node1 ingress]# kubectl apply -f mandatory.yaml[root@node1 ingress]# kubectl get pods -n ingress-nginxNAME ???????????????????READY ?STATUS ?RESTARTS ?AGEnginx-ingress-controller-948ffd8cc-9nd4c ?1/1 ??Running ?0 ????10m[root@node1 ingress]# [root@node1 ingress]# kubectl describe pods -n ingress-nginx创建一个Pod类型为NodePort的service用来接入互联网请求
修改yaml文件可添加nodePort来指定端口,这里采用默认[root@node1 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml[root@node1 ingress]# kubectl apply -f service-nodeport.yaml service/ingress-nginx created[root@node1 ingress]# [root@node1 ingress]# kubectl get svc -n ingress-nginxNAME ?????TYPE ???CLUSTER-IP ??EXTERNAL-IP ?PORT(S) ??????????AGEingress-nginx ?NodePort ?10.99.146.223 ?<none> ???80:32116/TCP,443:30771/TCP ?17s[root@node1 ingress]# 通过互联网测试访问,看nginx的调度器是否配置成功
任意集群地址访问[root@node1 ingress]# curl 172.12.0.10:32116<html><head><title>404 Not Found</title></head><body><center><h2>404 Not Found</h2></center><hr><center>nginx/1.17.7</center></body></html>[root@node1 ingress]# Nginx调度器本身调度已经可以正常工作了!!!
Nginx调度器本身调度已经可以正常工作了!!!
Nginx调度器本身调度已经可以正常工作了!!!
接下来就可以手动部署个应用,并通过nginx的调度器发布出去
手动部署tomcat应用服务,通过nginx调度器发布出去
NodePort类型的Tomcat创建
把资源都写在一个yaml文件内,使用三条横线进行分割[root@node1 pod]# cat tomcat-nodeport.yaml apiVersion: v1kind: Servicemetadata: name: tomcat namespace: defaultspec: selector: ??app: tomcat ?release: canary type: NodePort ports: - port: 8080 ?targetPort: 8080 ?nodePort: 30080---apiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demo namespace: defaultspec: replicas: 2 selector: ??matchLabels: ??app: tomcat ??release: canary template: ?metadata: ??labels: ???app: tomcat ???release: canary ?spec: ??containers: ??- name: tomcat ???image: tomcat ???imagePullPolicy: IfNotPresent ???ports: ???- name: http ????containerPort: 8080 ???- name: ajp ????containerPort: 8009[root@node1 pod]# 直接使用集群内部任意IP地址加30080端口进行访问即可。
通过Ingress形式发布Tomcat至外部
提前下载好tomcat镜像到本地,service资源和deploy资源写在一个yaml文件内[root@node1 pod]# cat deploy-svc-tomcat.yaml apiVersion: v1kind: Servicemetadata: name: tomcatspec: selector: ?app: tomcat ?release: canary ports: - name: http ?targetPort: 8080 ?port: 8080---apiVersion: apps/v1kind: Deploymentmetadata: name: tomcat-demospec: replicas: 2 selector: ??matchLabels: ??app: tomcat ??release: canary template: ?metadata: ??labels: ???app: tomcat ???release: canary ?spec: ??containers: ??- name: tomcat8 ???image: tomcat ???imagePullPolicy: IfNotPresent ???ports: ???- name: http ????containerPort: 8080[root@node1 pod]# 创建完成后,接下来就可以为刚刚部署的tomcat制作一个ingress服务了
为ingress类型的tomcat创建ingress服务
您也可以创建带ssl认证证书类型的tomcat服务,只需要购买ssl证书或只为了测试自建证书也可[root@node1 pod]# cat tomcat-ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata: name: ingress-tomcat namespace: default annotations: ?kubernetes.io/ingress.class: "nginx"spec: rules: - host: tomcat.siyou.com ?http: ??paths: ??- path: ???backend: ????serviceName: tomcat ????servicePort: 8080[root@node1 pod]# 测试吧。配置好"tomcat.siyou.com"的解析,访问的时候通过ingress调度器映射出去的端口访问即可
为了测试会用到的相关命令
kubectl 的相关资源使用帮助 # kubectl explain pods or kubectl explain pods.spec# 获取默认空间下的pods资源详情[root@node1 pod]# kubectl get pods -o wide# 描述默认空间下某个pods资源[root@node1 pod]# kubectl describe pods tomcat-demo-655c78c49-ctd66# 查看某个tomcat的日志,实时查看[root@node1 pod]# kubectl logs tomcat-demo-655c78c49-ctd66 -f# 查看默认空间下tomcat应用端口监听状态[root@node1 pod]# kubectl exec tomcat-demo-655c78c49-ctd66 -- ss -tnl# 进入到一个tomcat内部[root@node1 pod]# kubectl exec -it tomcat-demo-655c78c49-ctd66 -- /bin/sh# 查看默认名称空间下的service详情[root@node1 pod]# kubectl get svc -o wide# 获取名称空间为ingress-nginx下的pod资源情况[root@node1 pod]# kubectl get pods -n ingress-nginx# 查看ingress-nginx空间下pod详情[root@node1 pod]# kubectl describe pods -n ingress-nginx nginx-ingress-controller-948ffd8cc-9nd4c# 查看默认名称空间下的ingress[root@node1 pod]# kubectl get ingress更多 kubectl 命令的使用,"kubectl --help" 或者官方文档 k8s kubectl overview

使用高级回帖 (可批量传图、插入视频等)快速回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
快速回复 返回顶部 返回列表