k8s(7)——service服务之ingress

目录

一、Ingress简介

二、 部署ingress-controller

  • 1、在官网上查看相关的配置信息、创建mandatory.yaml文件
  • 2、在私有仓库上拉取镜像
  • 3、部署ingress-controller
  • 4、创建ingress-nginx定义服务
  •  5 、查看生成的信息  

三、创建ingress服务

  • 1、创建ingress服务文件
  • 2、测试
  • 3、解决无法访问的问题
  • 4、进行另一种验证的方法

四、修改ingress controller 部署文件

  • 1、修改ingres-controller配置文件信息

  • 2、将标签放到指定的节点上

  • 3、创建ingres-controller服务

  • 4、测试

五、ingress TLS 配置

  • 1、查看官网信息
  • 2、 生成证书和加密文件
  • 3、配置服务文件
  • 4、测试

六、给ingress 做认证

  • 1、安装生成证书所有到的软件
  • 2、查看官网信息
  • 3、创建认证
  • 4、创建认证文件
  • 5、查看生成的信息
  • 6、测试

七、重写的功能

  • 1、重定向规格参数
  • 2、创建重定向文件
  • 3、在真机上添加解析
  • 4、测试
  • 5、第二种重写的方式(访问时自动跳转配置文件中指定的目录)

八、添加多个域名来重定向到不同的后端

  • 1、创建后端服务的pod文件
  • 2、创建重定向文件
  • 3、测试

一、Ingress简介

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

 

专用术语

为了表达更加清晰,本指南定义了以下术语:

节点(Node):

Kubernetes 集群中其中一台工作机器,是集群的一部分。

集群(Cluster):

一组运行程序(这些程序是容器化的,被 Kubernetes 管理的)的节点。 在此示例中,和在大多数常见的Kubernetes部署方案,集群中的节点都不会是公共网络。

边缘路由器(Edge router):

在集群中强制性执行防火墙策略的路由器(router)。可以是由云提供商管理的网关,也可以是物理硬件。

集群网络(Cluster network):

一组逻辑或物理的链接,根据 Kubernetes 网络模型 在集群内实现通信。

服务(Service):

Kubernetes Service 使用 标签 选择器(selectors)标识的一组 Pod。除非另有说明,否则假定服务只具有在集群网络中可路由的虚拟 IP。

Ingress 是什么?

Ingress 公开了从集群外部到集群内 services 的HTTP和HTTPS路由。 流量路由由 Ingress 资源上定义的规则控制。

    internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]

可以将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或者 Service.Type=LoadBalancer 类型的服务。

可以将Ingress配置为提供服务外部可访问的URL,负载均衡流量,终止 SSL / TLS 并提供基于名称的虚拟主机。 Ingress 控制器通常负责通过负载平衡器来实现入口,尽管它也可以配置边缘路由器或其他前端以帮助处理流量。

Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开给 Internet 时,通常使用以下类型的服务 Service.Type=NodePort 或者 Service.Type=LoadBalancer.

环境准备

您必须具有 ingress 控制器才能满足 Ingress 的要求。仅创建 Ingress 资源无效。

您可能需要部署 Ingress 控制器,例如 ingress-nginx。您可以从许多 Ingress 控制器中进行选择。

注意:

确保您查看了 Ingress 控制器的文档,以了解选择它的注意事项。

一定要检查一下这个控制器的 beta 限制。 在 GCE/Google Kubernetes Engine 之外的环境中,需要将控制器部署 为 Pod。

注意:

确保您查看了 Ingress 控制器的文档,以了解选择它的注意事项。

与所有其他 Kubernetes 资源一样,Ingress 需要使用 apiVersionkindmetadata 字段。 有关使用配置文件的一般信息,请参见部署应用配置容器管理资源。 Ingress 经常使用注解(annotations)来配置一些选项,具体取决于 Ingress 控制器,例如 rewrite-target annotation。 不同的 Ingress 控制器支持不同的注解(annotations)。查看文档以供您选择 Ingress 控制器,以了解支持哪些注解(annotations)。

Ingress 规范 具有配置负载均衡器或者代理服务器所需的所有信息。最重要的是,它包含与所有传入请求匹配的规则列表。Ingress 资源仅支持用于定向 HTTP 流量的规则。

Ingress 规则

每个 HTTP 规则都包含以下信息:

  • 可选主机。在此示例中,未指定主机,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。如果提供了主机(例如 foo.bar.com),则规则适用于该主机。
  • 路径列表(例如,/testpath),每个路径都有一个由 serviceNameservicePort 定义的关联后端。在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。
  • 后端是服务文档中所述的服务和端口名称的组合。与规则的主机和路径匹配的对 Ingress 的HTTP(和HTTPS)请求将发送到列出的后端。

通常在 Ingress 控制器中配置默认后端,以服务任何不符合规范中路径的请求。

默认后端

没有规则的 Ingress 将所有流量发送到单个默认后端。默认后端通常是 Ingress 控制器的配置选项,并且未在 Ingress 资源中指定。

如果没有主机或路径与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到您的默认后端。

Ingress 类型

如果您创建的 Ingress 资源没有规则中定义的任何主机,则可以匹配到您 Ingress 控制器 IP 地址的任何网络流量,而无需基于名称的虚拟主机。

例如,以下 Ingress 资源会将 first.bar.com 请求的流量路由到 service1,将 second.foo.com 请求的流量路由到 service2,而没有在请求中定义主机名的 IP 地址的流量路由(即,不提供请求标头)到 service3

 

TLS

您可以通过指定包含 TLS 私钥和证书的 secret Secret 来加密 Ingress。 目前,Ingress 只支持单个 TLS 端口 443,并假定 TLS 终止。

如果 Ingress 中的 TLS 配置部分指定了不同的主机,那么它们将根据通过 SNI TLS 扩展指定的主机名(如果 Ingress 控制器支持 SNI)在同一端口上进行复用。 TLS Secret 必须包含名为 tls.crttls.key 的密钥,这些密钥包含用于 TLS 的证书和私钥,例如:

apiVersion: v1
kind: Secret
metadata:
  name: testsecret-tls
  namespace: default
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
type: kubernetes.io/tls

在 Ingress 中引用此 Secret 将会告诉 Ingress 控制器使用 TLS 加密从客户端到负载均衡器的通道。您需要确保创建的 TLS secret 来自包含 sslexample.foo.com 的 CN 的证书。

注意:
注意:

各种 Ingress 控制器所支持的 TLS 功能之间存在差异。请参阅有关文件 nginxGCE 或者任何其他平台特定的 Ingress 控制器,以了解 TLS 如何在您的环境中工作。

负载均衡

Ingress 控制器使用一些适用于所有 Ingress 的负载均衡策略设置进行自举,例如负载均衡算法、后端权重方案和其他等。更高级的负载均衡概念(例如,持久会话、动态权重)尚未通过 Ingress 公开。您可以通过用于服务的负载均衡器来获取这些功能。

值得注意的是,即使健康检查不是通过 Ingress 直接暴露的,但是在 Kubernetes 中存在并行概念,比如 就绪检查,它允许您实现相同的最终结果。 请检查控制器特殊说明文档,以了解他们是怎样处理健康检查的 ( nginxGCE)。

更新 Ingress

要更新现有的 Ingress 以添加新的 Host,可以通过编辑资源来对其进行更新:

kubectl describe ingress test
Name:             test
Namespace:        default
Address:          178.91.123.132
Default backend:  default-http-backend:80 (10.8.2.3:8080)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com
               /foo   service1:80 (10.8.0.90:80)
Annotations:
  nginx.ingress.kubernetes.io/rewrite-target:  /
Events:
  Type     Reason  Age                From                     Message
  ----     ------  ----               ----                     -------
  Normal   ADD     35s                loadbalancer-controller  default/test
kubectl edit ingress test

这将弹出具有 YAML 格式的现有配置的编辑器。 修改它来增加新的主机:

spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: service1
          servicePort: 80
        path: /foo
  - host: bar.baz.com
    http:
      paths:
      - backend:
          serviceName: service2
          servicePort: 80
        path: /foo
..

保存更改后,kubectl 将更新 API 服务器中的资源,该资源将告诉 Ingress 控制器重新配置负载均衡器。

验证:

kubectl describe ingress test
Name:             test
Namespace:        default
Address:          178.91.123.132
Default backend:  default-http-backend:80 (10.8.2.3:8080)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com
               /foo   service1:80 (10.8.0.90:80)
  bar.baz.com
               /foo   service2:80 (10.8.0.91:80)
Annotations:
  nginx.ingress.kubernetes.io/rewrite-target:  /
Events:
  Type     Reason  Age                From                     Message
  ----     ------  ----               ----                     -------
  Normal   ADD     45s                loadbalancer-controller  default/test

您可以通过 kubectl replace -f 命令调用修改后的 Ingress yaml 文件来获得同样的结果。

 

未来工作

跟踪 SIG 网络以获得有关 Ingress 和相关资源演变的更多细节。您还可以跟踪 Ingress 仓库以获取有关各种 Ingress 控制器的更多细节。

替代方案

不直接使用 Ingress 资源,也有多种方法暴露 Service:

接下来

发布服务 —— 服务类型

对一些应用(如 Frontend)的某些部分,可能希望通过外部Kubernetes 集群外部IP 地址暴露 Service。

Kubernetes ServiceTypes 允许指定一个需要的类型的 Service,默认是 ClusterIP 类型。

Type 的取值以及行为如下: * ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。 * NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。 * LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。 * ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建。

注意: 您需要 CoreDNS 1.7 或更高版本才能使用 ExternalName 类型。

您也可以使用 Ingress 来暴露自己的服务。 Ingress 不是服务类型,但它充当集群的入口点。 它可以将路由规则整合到一个资源中,因为它可以在同一IP地址下公开多个服务。

一种全局 为了代理不同的后端而设定的负载均衡服务 就是Kubernetes 里的Ingress 服务


Ingress由两部分组成:Ingress controller 和 Ingress 服务。

Ingress  Contronller 会根据你定义的 Ingress 对象 提供对应的代理能力。业界常用的各种反向代理项目,比如Nginx HAProxy、
Envoy、Traeflk 等 、都已经为Kubernetes 专门维护对应的Ingress。


二、 部署ingress-controller

  • 1、在官网上查看相关的配置信息、创建mandatory.yaml文件
  • 2、在私有仓库上拉取镜像
  • 3、部署ingress-controller
  • 4、创建ingress-nginx定义服务
  • 5 、查看生成的信息 :

1、到官网上查看配置文件信息
官网地址:https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/mandatory.yaml
复制文档内的全部内容


1.2、修改文集器按中镜像存放的路径:

[kubeadm@server1 ~]$ \vi mandatory.yaml
220行image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 修改为和私有镜像仓库一样的名称

(和私有仓库的镜像名称一致!!!  实验的时候就是因为这个问题耽误了好久)


2、私有仓库控制节点上


2.1、拉取镜像

[root@reg harbor]# docker pull  quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0

(注意在阿里云上景象的存放的位置为quay-mirror.qiniu.com!!!!)

2.2、镜像上传

[root@reg harbor]# docker tag quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 reg.westos.org/library/nginx-ingress-controller:0.30.0
[root@reg harbor]#
[root@reg harbor]# docker push reg.westos.org/library/nginx-ingress-controller
The push refers to repository [reg.westos.org/library/nginx-ingress-controller]
6f6e07efc7e7: Pushed
3d228bf43dae: Pushed
00d33fdc8470: Pushed
e21a860ccea4: Pushed
6d2e5bdfa0f8: Pushed
cb684eb76ff9: Pushed
1ba6bdbc843e: Pushed
f0788cc6217b: Pushed
2c1f73db0ddc: Pushed
1f269229f946: Pushed
0ea7bac8e332: Pushed
5216338b40a7: Mounted from library/zabbix-agent
0.30.0: digest: sha256:b312c91d0de688a21075078982b5e3a48b13b46eda4df743317d3059fc3ca0d9 size: 2836
[root@reg harbor]#

2.3、在网页上登录私有仓库查看镜像是否成功上传修改配置文件的镜像信息

3、部署ingress-controller
 

3.1、创建ingress-controller

[kubeadm@server1 ~]$ kubectl create -f mandatory.yaml     ##创建
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx created



[kubeadm@server1 ~]$ kubectl -n ingress-nginx get pod -o wide     查看pod的是否运行成功
NAME                                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-ingress-controller-d5f798fb7-sszhx   1/1     Running   0          28s   10.244.2.46   server3   <none>           <none>
[kubeadm@server1 ~]$

3.2、查看日志信息

[kubeadm@server1 ~]$ kubectl -n ingress-nginx describe pod nginx-ingress-controller-d5f798fb7-sszhx

ID:,ResourceVersion:,Generation:0,CreationTimestamp:0001-01-01 00:00:00 +0000 UTC,DeletionTimestamp:<nil>,DeletionGracePeriodSeconds:nil,Labels:map[string]string{},Annotations:map[string]string{},OwnerReferences:[]OwnerReference{},Finalizers:[],ClusterName:,ManagedFields:[]ManagedFieldsEntry{},}, err services "ingress-nginx" not found     ##报错缺少ingress-nginx服务

.3.3、查看生成服务的日志

(缺少ingress-nginx服务文件信息)

4、、创建ingress-nginx定义服务

官方文档地址:https:https://github.com/kubernetes/ingress-nginx/blob/master/deploy/baremetal/service-nodeport.yaml
 

4.1、编辑ngress-nginx的部署文件

[kubeadm@server1 ~]$ service-nodeport.yaml            ##复制官网上的内容然后粘贴到文件中
apiVersion: v1
kind: Service                    #服务的类型
metadata:
  name: ingress-nginx            ##名称
  namespace: ingress-nginx       ##必须要加不然找不到ingress-nginx 默认在default里边
spec:
  type: NodePort                 ##暴露的方式
  ports:
    - name: http
      port: 80
      targetPort: 80            ##暴露的80端口
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443           ##暴露的443端口
      protocol: TCP
  externalTrafficPolicy: Cluster

4.2、创建ngress-nginx

[kubeadm@server1 ~]$ kubectl get ns
NAME              STATUS   AGE
default           Active   8d
ingress-nginx     Active   28m      ##namespace: ingress-nginx       ##必须要加不然找不到ingress-nginx 默认在default里边      
kube-node-lease   Active   8d
kube-public       Active   8d
kube-system       Active   8d
[kubeadm@server1 ~]$


[kubeadm@server1 ~]$ kubectl apply -f service-nodeport.yaml
service/ingress-nginx created
[kubeadm@server1 ~]$

5 、查看生成的信息 :

[kubeadm@server1 ~]$
[kubeadm@server1 ~]$ kubectl -n ingress-nginx get svc
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.110.226.207   <none>        80:30352/TCP,443:32486/TCP   2m14s
[kubeadm@server1 ~]$


[kubeadm@server1 ~]$ kubectl -n ingress-nginx describe svc ingress-nginx      ##查看端口信息

三、创建ingress服务

  • 1、创建ingress服务文件
  • 2、测试
  • 3、解决无法访问的问题
  • 4、进行另一种验证的方法

创建域名为www.westos.org 对外暴露的端口
服务器访问www.westos.org 实际上是访问后端的pod

1、编辑ingress服务文件

[kubeadm@server1 ~]$ vim ingress.yaml
##创建pod服务
apiVersion: apps/v1                  ##控制器的版本                                       pod服务
kind: Deployment                    ##控制器的类型
metadata:
  name: nginx-deployment            ##控制器的名称
spec:
  replicas: 3                ##副本数为3这些pod由集群自动取分配给哪个节点
  selector:
    matchLabels:
      app: nginx                     ##标签
  template:                          ##模板
    metadata:                        ##pod数据类型
      labels:
        app: nginx                   ##标签
    spec:
      containers:                    ##pod容器
      - name: myapp                  ##名称
        image: myapp             ##v2镜像(名称要和仓库里的镜像名称相同)
        ports:                       ##端口
        - containerPort: 80          ##监听的端口名称


##把pod服务暴露出来
#
---
apiVersion: v1                  ##版本
kind: Service                   ##类型
metadata:
  name: svc-nginx               ##名称
spec:
  ports:
    - name: http                ##端口服务名称
      port: 80                  ##端口号
      targetPort: 80            ##转发的端口号
  selector:
      app: nginx               ##通过标签选择上边的pod


---
apiVersion: extensions/v1beta1
kind: Ingress                     ##服务的类型
metadata:
  name: ingress-demo
spec:
  rules:
  - host: www.westos.org            ##访问的主机域名(自定义)
    http:
      paths:
      - path: /                     ##访问域名的 / 目录
        backend:
          serviceName: svc-nginx     ##与通过服务的名称选择第二个模块对应的serverName
          servicePort: 80

1.2、创建

[kubeadm@server1 ~]$ kubectl apply -f ingress.yaml
deployment.apps/nginx-deployment unchanged
service/svc-nginx unchanged
ingress.extensions/ingress-demo created
[kubeadm@server1 ~]$

[kubeadm@server1 ~]$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-74748dcf96-7h2vs   1/1     Running   0          13s
nginx-deployment-74748dcf96-c6q2v   1/1     Running   0          13s
nginx-deployment-74748dcf96-d5t5v   1/1     Running   0          13s
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   8d
svc-nginx    ClusterIP   10.105.178.211   <none>        80/TCP    19s
[kubeadm@server1 ~]$


 

1.3、查看日志等

[kubeadm@server1 ~]$ kubectl describe ingresses. ingress-demo        ##c查看日志u信息


[kubeadm@server1 ~]$ kubectl -n ingress-nginx get pod -o wide      ##查看宿主机的位置
NAME                                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-ingress-controller-d5f798fb7-sszhx   1/1     Running   0          85m   10.244.2.46   server3   <none>           <none>          #
[kubeadm@server1 ~]$

2、测试

2.1、在真机上添加解析

[root@foundation6 ~]# vim /etc/hosts
172.25.6.3    server3  www1.westos.org

2.2.、在真机上访问被拒绝

[root@foundation6 ~]# curl www1.westos.org
curl: (7) Failed connect to www1.westos.org:80; Connection refused

3、检查排错

3.1、查看对外暴露的端口信息

[kubeadm@server1 ~]$ kubectl -n ingress-nginx  describe svc ingress-nginx           ##查看svc的服务类型
Name:                     ingress-nginx
Namespace:                ingress-nginx
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"ingress-nginx","namespace":"ingress-nginx"},"spec":{"externalTraf...
Selector:                 <none>
Type:                     NodePort
IP:                       10.110.226.207
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  30352/TCP
Endpoints:                <none>
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  32486/TCP
Endpoints:                <none>                                         ##发现Endpoints端口未开启           
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
[kubeadm@server1 ~]$

3.2、解决:把所有的标签全部暴露(在配置文件中添加标签)

查看标签的类型

[kubeadm@server1 ~]$ kubectl -n ingress-nginx get pod --show-labels                  ##查看标签选择器的内容
NAME                                       READY   STATUS    RESTARTS   AGE    LABELS
nginx-ingress-controller-d5f798fb7-sszhx   1/1     Running   0          125m   app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx,pod-template-hash=d5f798fb7

将标签写道配置文件中

[kubeadm@server1 ~]$ vim service-nodeport.yaml

apiVersion: v1
kind: Service                    #服务的类型
metadata:
  name: ingress-nginx
  namespace: ingress-nginx       ##必须要加
spec:
  type: NodePort                 ##暴露的方式
  ports:
    - name: http
      port: 80                  
      targetPort: 80            ##暴露的80端口
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443           ##暴露的443端口
      protocol: TCP
  externalTrafficPolicy: Cluster
  selector:
    app.kubernetes.io/name: ingress-nginx           ##暴露标签
    app.kubernetes.io/part-of: ingress-nginx

3.3、测试:

查看Endpoints 端口是否生效

[kubeadm@server1 ~]$ kubectl apply -f service-nodeport.yaml
service/ingress-nginx configured

[kubeadm@server1 ~]$ kubectl -n ingress-nginx  describe svc ingress-nginx    ##查看svc应用
Name:                     ingress-nginx
Namespace:                ingress-nginx
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"ingress-nginx","namespace":"ingress-nginx"},"spec":{"externalTraf...
Selector:                 app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
Type:                     NodePort
IP:                       10.110.226.207
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  30352/TCP                          ##NodePort为30352端口
Endpoints:                10.244.2.46:80                           ##发现Endpoints 端口已经生效
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  32486/TCP
Endpoints:                10.244.2.46:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

3.5、在网页上进行测试:
输入:http://www1.westos.org:30352
访问到的是后端的3个节点


4、换另一种域名进行访问修改镜像、域名、标签

[kubeadm@server1 ~]$ cp ingress.yaml ingress-2.yaml
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$ vim ingress-2.yaml

sxervice


4.2、在网页上:

输入:http://www2.westos.org:30352/
Hello MyApp | Version: v2 | Pod Name       ##查看到的myapp 是v2版本的信息

四、修改ingress controller 部署文件

  • 1、修改ingres-controller配置文件信息

  • 2、将标签放到指定的节点上

  • 3、创建ingres-controller服务

  • 4、测试

用DaemonSet 结合 nodeselector 来部署ingres-controller 到特定的node上 然后使用HostNetwork 直接把改pod与宿主机node的网络打通 直接使用宿主机的80/443端口 就能访问服务

优点是整个请求的链路最简单,性能相对NodePort模式更好
缺点是由于直接利用宿主机节点的网络和端口 一个node 只能部署一个ingress-controller pod
比较适合大的并发的生产环境

1、修改ingres-controller配置文件信息

​[kubeadm@server1 ~]$ vim mandatory.yaml

188 ---
189
190 apiVersion: apps/v1
191 kind: DaemonSet                         ##修改为DaemonSet 类型的控制器
192 metadata:
193   name: nginx-ingress-controller

199   replicas: 1              ##删除replicas

215       hostNetwork: True                 ##使用hostNetwork

216         kubernetes.io/os: linux           ——>修改标签为app: ingress

2、将标签放到指定的节点上

绑定标签到指定的节点上之前在server3  把它放到server4上为了更直观的看到实验的效果

[kubeadm@server1 ingress]$ kubectl label nodes server4 app=ingress      ##把服务放在server4上 
node/server4 labeled
[kubeadm@server1 ingress]$ kubectl get node --show-labels
NAME      STATUS   ROLES    AGE   VERSION   LABELS
server1   Ready    master   10d   v1.17.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
server3   Ready    <none>   10d   v1.17.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=server3,kubernetes.io/os=linux
server4   Ready    <none>   10d   v1.17.3   app=ingress,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server4,kubernetes.io/os=linux
[kubeadm@server1 ingress]$

3、创建ingres-controller服务

[kubeadm@server1 ingress]$ kubectl -n ingress-nginx get pod -o wide            ##查看阿pod创建的情况
NAME                                       READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
nginx-ingress-controller-d5f798fb7-sszhx   1/1     Running   1          32h     10.244.2.56   server3   <none>           <none>
nginx-ingress-controller-lpx8c             1/1     Running   0          3m19s   172.25.6.4    server4   <none>           <none>
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$ kubectl -n ingress-nginx get deployments.apps
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
nginx-ingress-controller   1/1     1            1           32h
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$ kubectl -n ingress-nginx delete deployments.apps nginx-ingress-controller
deployment.apps "nginx-ingress-controller" deleted
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$ 删除掉之前的系统管理

[kubeadm@server1 ~]$ kubectl -n ingress-nginx get pod
NAME                             READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-lpx8c   1/1     Running   0          8m6s
[kubeadm@server1 ~]$


 

3.2、在server4上查看对应的 80 和443端口

[root@server4 ~]# netstat -anltp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      16522/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      16522/nginx: master
[root@server4 ~]#
[root@server4 ~]# netstat -anltp | grep :443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      16522/nginx: master
tcp        0      0 10.96.0.1:60986         10.96.0.1:443           ESTABLISHED 16445/nginx-ingress
tcp        0      0 10.96.0.1:60916         10.96.0.1:443           ESTABLISHED 2379/flanneld       
tcp6       0      0 :::443                  :::*                    LISTEN      16522/nginx: master
[root@server4 ~]#


4、测试

配置好后访问不需要再加端口 之间用于域名就可以访问
4.1、在真机上进行解析

172.25.6.4    server4  www1.westos.org www2.westos.org

4.2、在真机上进行测试:

[root@foundation6 kiosk]# curl www1.westos.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation6 kiosk]# curl www1.westos.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation6 kiosk]# curl www1.westos.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation6 kiosk]# curl www1.westos.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation6 kiosk]# curl www1.westos.org
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@foundation6 kiosk]#


4.3、在浏览器上:
输入:http://www1.westos.org/

 

五、ingress TLS 配置

  • 1、查看官网信息
  • 2、 生成证书和加密文件
  • 3、配置服务文件
  • 4、测试

1、查看官网信息
官网地址:https://kubernetes.github.io/ingress-nginx/examples/PREREQ3、检查排错UISITES/

2、 生成证书和加密文件

[kubeadm@server1 ~]$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"    ##证书有效的时间为365天 用的是2048 位加密   生成 tls.key和tls.crt
Generating a 2048 bit RSA private key
............................+++
.............................................................+++
writing new private key to 'tls.key'
-----
[kubeadm@server1 ~]$ Generating a 2048 bit RSA private key

[kubeadm@server1 ~]$ kubectl create secret tls tls-secret --key tls.key --cert tls.crt
secret/tls-secret created

 

3、配置服务文件

[kubeadm@server1 ~]$ mv tls.* ingress/

[kubeadm@server1 ingress]$ \vi tls-ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-test
spec:
  tls:
    - hosts:
      - www1.westos.org
      secretName: tls-secret                ##指定读取 tls-secret 文件中的内容
  rules:
    - host: www1.westos.org
      http:
        paths:
        - path: /
          backend:
            serviceName: svc-nginx
            servicePort: 80

3.2、查看服务信息

[kubeadm@server1 ingress]$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   10d
svc-nginx    ClusterIP   10.108.132.118   <none>        80/TCP    72m
[kubeadm@server1 ingress]$

3.3、查看tls-secret服务存储的类型

[kubeadm@server1 ingress]$ kubectl get secrets       ##查看存储
NAME                  TYPE                                  DATA   AGE
default-token-ddbmj   kubernetes.io/service-account-token   3      10d
tls-secret            kubernetes.io/tls                     2      13m    ##tls-secret存储数据的类型专门存放一些敏感数据
[kubeadm@server1 ingress]$


tls-secret用来存放证书和密钥的
[kubeadm@server1 ingress]$ kubectl describe secrets tls-secret
Name:         tls-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/tls

Data
====
tls.crt:  1143 bytes                            ##证书
tls.key:  1704 bytes                ##密钥
[kubeadm@server1 ingress]$

3.4查看证书和密钥的存储位置

[kubeadm@server1 ingress]$ kubectl get secrets tls-secret -o yaml    ##查看 tls-secret 存储文件的内容

[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$ kubectl apply -f tls-ingress.yaml         ##创建
ingress.networking.k8s.io/nginx-test created

[kubeadm@server1 ingress]$ kubectl get ingresses.                    ##各个域名访问的端口关系  
NAME           HOSTS             ADDRESS          PORTS     AGE
ingress-demo   www1.westos.org   10.110.226.207   80        86m
nginx-test     www1.westos.org   10.110.226.207   80, 443   2m4s     ##可以看到TLS 是通过访问加密的方式来进行的
[kubeadm@server1 ingress]$

4、测试

在网页上:
输入:https://www1.westos.org

直接输入域名也可以走重定向
输入:www1.westos.org

 

4.2、在真机上
 

[root@foundation6 kiosk]# curl www1.westos.org
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>       ## Redirect为重定向
<hr><center>nginx/1.17.8</center>
</body>
</html>

六、给ingress 做认证

  • 1、安装生成证书所有到的软件
  • 2、查看官网信息
  • 3、创建认证
  • 4、创建认证文件
  • 5、查看生成的信息
  • 6、测试

1、安装生成认证文件要用到的软件

[kubeadm@server1 ingress]$ sudo yum install -y httpd-tools

2、查看官网信息

 3、创建认证

[kubeadm@server1 ingress]$ htpasswd -c auth yb      ##创建认证文件第一次创建才加-c
New password:                                       ##输入密码
Re-type new password:
Adding password for user yb
[kubeadm@server1 ingress]$

[kubeadm@server1 ingress]$ cat auth                 ##查看认证文件信息
yb:$apr1$bF1SVEAk$tJQQd44ZT2c2RKD4KPjTu0
[kubeadm@server1 ingress]$

[kubeadm@server1 ingress]$ kubectl create secret generic basic-auth --from-file=auth     ##创建basic-auth
secret/basic-auth created
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$ kubectl describe secrets basic-auth
Name:         basic-auth
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
auth:  41 bytes
[kubeadm@server1 ingress]$ kubectl get secrets basic-auth -o yaml
apiVersion: v1
data:
  auth: eWI6JGFwcjEkYkYxU1ZFQWskdEpRUWQ0NFpUMmMyUktENEtQalR1MAo=
kind: Secret
metadata:
  creationTimestamp: "2020-03-04T12:18:12Z"
  name: basic-auth
  namespace: default
  resourceVersion: "1442193"
  selfLink: /api/v1/namespaces/default/secrets/basic-auth
  uid: 5abdec46-393d-4a56-920e-c65f9a5d21fa
type: Opaque


4、创建认证文件

[kubeadm@server1 ingress]$ \vi auth-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-with-auth
  annotations:
    # type of authentication
    nginx.ingress.kubernetes.io/auth-type: basic          ##访问的类型
    # name of the secret that contains the user/password definitions
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    # message to display with an appropriate context why the authentication is required
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - yb'      ##登录访问的名称
spec:
  rules:
  - host: www2.westos.org                                   ##作用的域名
    http:
      paths:
      - path: /
        backend:
          serviceName: svc-nginx                              ##作用服务名称
          servicePort: 80

 

5、查看生成的信息

[kubeadm@server1 ingress]$ kubectl get secrets                    ##查看secrets 信息
NAME                  TYPE                                  DATA   AGE
basic-auth            Opaque                                1      12m
default-token-ddbmj   kubernetes.io/service-account-token   3      10d
tls-secret            kubernetes.io/tls                     2      58m
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$
[kubeadm@server1 ingress]$ kubectl describe ingresses. ingress-with-auth
Name:             ingress-with-auth
Namespace:        default
Address:          10.110.226.207
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host             Path  Backends
  ----             ----  --------
  www2.westos.org  
                   /   svc-nginx:80 (10.244.0.106:80,10.244.1.58:80,10.244.2.60:80)    ##svc-nginx:80  服务的端口为80
Annotations:
  nginx.ingress.kubernetes.io/auth-realm:   Authentication Required - yb
  nginx.ingress.kubernetes.io/auth-secret:  basic-auth
  nginx.ingress.kubernetes.io/auth-type:    basic
Events:
  Type    Reason  Age    From                      Message
  ----    ------  ----   ----                      -------
  Normal  CREATE  3m39s  nginx-ingress-controller  Ingress default/ingress-with-auth
  Normal  UPDATE  2m46s  nginx-ingress-controller  Ingress default/ingress-with-auth
[kubeadm@server1 ingress]$

6、测试

6.1、在真机上ping www2.westos.org

6.2、在浏览器上进行测试:
输入:www2.westos.org


6.3、对www1.westos.org没有影响


七、重写的功能

  • 1、重定向规格参数
  • 2、创建重定向文件
  • 3、在真机上添加解析
  • 4、测试
  • 5、第二种重写的方式(访问时自动跳转配置文件中指定的目录)

1、重定向规格参数

  • anncotations参数
              名称 Description Values
nginx.ingress.kubernetes.io/rewrite-target 必须重定向流量的目标URI string
nginx.ingress.kubernetes.io/ssl-redirect 指示位置部分是否可访问ssl(当Ingress包含证书时默认为true) bool
nginx.ingress.kubernetes.io/force-ssl-redirect  即使ingress未启用TLS,也强势重定向到HTTPS bool
nginx.ingress.kubernetes.io/app-root 定义Controller必须重定向的应用程序根,如果它在上下文中 string
nginx.ingress.kubernetes.io/use-regex 指示ingress上定义的路径是否使用正确的表达式 bool

2、创建重定向文件

[kubeadm@server1 ingress]$ \vi rewrite-ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.westos.org                                 ##重写访问的域名
    http:
      paths:
      - backend:
          serviceName: svc-nginx                             ##服务的名称
          servicePort: 80
        path: /something(/|$)(.*)                ##(/|$)(.*)  表示不管输入什么后边的内容都作为$2的输入

3、在真机上添加解析

vim /etc/hosts
172.25.6.4    server4  www1.westos.org www2.westos.org rewrite.westos.org

[kubeadm@server1 ingress]$ kubectl create -f rewrite-ingress.yaml
ingress.networking.k8s.io/rewrite created


4、测试

在浏览器上输入:
http://rewrite.westos.org/something/hostname.html

4.2、只输入:http://rewrite.westos.org/hostname.html    测无法访问  


                                                                

5、第二种重写的方式

访问时跳到文件中指定的目录

172.25.6.4    server4  www1.westos.org www2.westos.org

[kubeadm@server1 ingress]$ vim rewrite-ingress-2.yaml        ##创建文件
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:##
    nginx.ingress.kubernetes.io/app-root: /hostname.html     ##网页后自动重定向到hostname.html目录下   
  name: approot
  namespace: default
spec:
  rules:
  - host: approot.westos.org                                 ##访问的域名
    http:
      paths:
      - backend:
          serviceName: svc-nginx                             ##对应服务的名称
          servicePort: 80                                    ##服务的端口
        path: /

[kubeadm@server1 ingress]$ kubectl create -f rewrite-ingress-2.yaml
ingress.networking.k8s.io/approot created

5.1、在真机上:
加解析 :

172.25.6.4    server4  approot.westos.org   ##解析

5.2、测试
在网页上输入:approot.westos.org  会被重定向到http://approot.westos.org/hostname.html

八、添加多个域名来重定向到不同的后端

  • 1、创建后端服务的pod文件
  • 2、创建重定向文件
  • 3、测试

1、创建后端服务的pod文件

[kubeadm@server1 ingress]$ vim ingress-2.yaml
apiVersion: apps/v1                  ##控制器的版本                                       pod服务
kind: Deployment                    ##控制器的类型
metadata:
  name: nginx-deployment            ##控制器的名称
spec:
  replicas: 3                ##副本数为3这些pod由集群自动取分配给哪个节点
  selector:
    matchLabels:
      app: nginx                     ##标签
  template:                          ##模板
    metadata:                        ##pod数据类型
      labels:
        app: nginx                   ##标签
    spec:
      containers:                    ##pod容器
      - name: myapp                  ##名称
        image: myapp             ##v2镜像(名称要和仓库里的镜像名称相同)
        ports:                       ##端口
        - containerPort: 80          ##监听的端口名称

##把pod服务暴露出来
#
---
apiVersion: v1                  ##版本
kind: Service                   ##类型
metadata:
  name: svc-nginx               ##名称
spec:
  ports:
    - name: http                ##端口服务名称
      port: 80                  ##端口号
      targetPort: 80            ##转发的端口号
  selector:
      app: nginx               ##通过标签选择上边的pod

[kubeadm@server1 ingress]$ kubectl apply -f ingress-2.yaml
deployment.apps/nginx-deployment unchanged
service/svc-nginx unchanged

2、创建重定向文件

2.1、查看后端服务的svc名称 (文件中访问的服务一定要和svc有的名称一样否则无法访问到)

[kubeadm@server1 ingress]$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   10d
svc-apache   ClusterIP   10.97.139.103   <none>        80/TCP    19s
svc-nginx    ClusterIP   10.110.38.6     <none>        80/TCP    8m56s
[kubeadm@server1 ingress]$


apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /     ##重定向到demo.westos.org的 /
  name: approot-2
  namespace: default
spec:
  rules:
  - host: demo.westos.org
    http:
      paths:
      - backend:
          serviceName: svc-apahce
          servicePort: 80
        path: /www1                                 ##当输入www1时会定义到svc-apache的后端
      - backend:
          serviceName: svc-nginx
          servicePort: 80                
        path: /www2                                 ## ##当输入www2时会定义到svc-nginx的后端     

[kubeadm@server1 ingress]$ kubectl apply -f rewrite-ingress-3.yaml
ingress.networking.k8s.io/approot-2 created



2.2、在真机上添加解析:

[root@foundation6 ~]# vim /etc/hosts

172.25.6.4   server4 demo.westos.org

3、测试

3.1、在浏览器上进行测试:
输入:http://demo.westos.org/www1访问到的时svc-apache后端的内容


3.2、输入:http://demo.westos.org/www2访问到的是svc-nginx后端的内容


        
 

发布了93 篇原创文章 · 获赞 1 · 访问量 1919

猜你喜欢

转载自blog.csdn.net/dghfttgv/article/details/104638748