一、DaemonSet方式部署ingress-controller

以前的实验中,我们需要以这样的形式来访问服务:

[root@foundation63 Desktop]# curl www3.westos.org:31899
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

每次访问时都需要加端口,很不方便,下面介绍一种方便访问的部署方式。

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

  • 优点是整个请求链路最简单,性能相对NodePort模式更好。
  • 缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。

比较适合大并发的生产环境使用
在这里插入图片描述
要部署这种方式,首先需要给作为调度器的节点加标签(这里使用server3作为调度节点):

[root@server1 ~]# kubectl get node --show-labels 		#查看节点标签
NAME      STATUS   ROLES    AGE    VERSION   LABELS
server1   Ready    master   7d7h   v1.18.1   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=
server2   Ready    <none>   7d7h   v1.18.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server2,kubernetes.io/os=linux
server3   Ready    <none>   7d7h   v1.18.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server3,kubernetes.io/os=linux

[root@server1 ~]# kubectl label nodes server3 ingress=nginx			#为server3添加ingress=nginx的标签

[root@server1 ~]# kubectl get node --show-labels 
NAME      STATUS   ROLES    AGE    VERSION   LABELS
server1   Ready    master   7d7h   v1.18.1   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=
server2   Ready    <none>   7d7h   v1.18.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=server2,kubernetes.io/os=linux
server3   Ready    <none>   7d7h   v1.18.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=nginx,kubernetes.io/arch=amd64,kubernetes.io/hostname=server3,kubernetes.io/os=linux

可以看出在server3上添加了一个ingress=nginx的标签。

然后需要更改ingress controller部署文件:

[root@server1 ~]# vim mandatory.yaml

在这里插入图片描述在这里插入图片描述

这个时候我们不能直接去更新,我们需要把原来生成的deployments删除:

[root@server1 ~]# kubectl -n ingress-nginx get deployments.apps 
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
nginx-ingress-controller   1/1     1            1           3d2h
[root@server1 ~]# kubectl -n ingress-nginx delete deployments.apps nginx-ingress-controller
deployment.apps "nginx-ingress-controller" deleted

之后应用这个部署文件

[root@server1 ~]# kubectl apply -f mandatory.yaml 
namespace/ingress-nginx unchanged
configmap/nginx-configuration unchanged
configmap/tcp-services unchanged
configmap/udp-services unchanged
serviceaccount/nginx-ingress-serviceaccount unchanged
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole unchanged
role.rbac.authorization.k8s.io/nginx-ingress-role unchanged
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding unchanged
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding unchanged
daemonset.apps/nginx-ingress-controller created
limitrange/ingress-nginx configured

查看状态:
在这里插入图片描述
这时可以在server3查看端口使用情况:

在这里插入图片描述
发现nginx直接使用的宿主机的80和443的端口

我们现在可以以这样的形式访问:

[root@foundation63 kiosk]# curl www1.westos.org				#注:解析指向server3
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@foundation63 kiosk]# curl www1.westos.org/hostname.html
deployment-nginx-868855d887-gmxcr
[root@foundation63 kiosk]# curl www1.westos.org/hostname.html
deployment-nginx-868855d887-c48cq

不用加端口就能访问服务。

如果还想把其他节点加入调度,给节点加选择器的标签即可,这样就可以实现高可用。

二、 Ingress nginx控制器加密部署

首先建立加密文件保存目录

[root@server1 ~]# mkdir ingress
[root@server1 ~]# cd ingress/
[root@server1 ingress]# mkdir certs
[root@server1 ingress]# cd certs/

生成tls密钥和证书:

[root@server1 certs]# openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
Generating a 2048 bit RSA private key
....+++
.................................+++
writing new private key to 'tls.key'
-----
[root@server1 certs]# ls		#生成后查看
tls.crt  tls.key

将生成的证书和key保存到secret里面:

[root@server1 certs]# kubectl create secret tls tls-secret --key tls.key --cert tls.crt
secret/tls-secret created
[root@server1 certs]# kubectl get secrets 		#查看secret
NAME                  TYPE                                  DATA   AGE
default-token-25448   kubernetes.io/service-account-token   3      7d8h
tls-secret            kubernetes.io/tls                     2      15s
[root@server1 certs]# 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

编辑ingress部署文件:

[root@server1 ingress]# vim ingresss.yaml 
[root@server1 ingress]# cat ingresss.yaml 
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
spec:
  tls:
    - hosts:
      - www1.westos.org
      secretName: tls-secret			#刚才生成的secret名称
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80

应用部署文件:

[root@server1 ingress]# kubectl apply -f ingresss.yaml
ingress.networking.k8s.io/ingress-demo configured

查看服务状态:
在这里插入图片描述可以看出已经有了tls加密。

注意:当我们部署了加密后,默认访问80端口会被重定向到443端口。

此时可以在浏览器输入www1.westos.org 测试访问:

在这里插入图片描述可以看出输入地址自动被重定向到443端口,选择高级 -->接受:
在这里插入图片描述
可以访问到服务内容。

三、 Ingress nginx控制器认证部署

这里使用基础认证的方式。

首先安装所需软件:

[root@server1 ingress]# yum install httpd-tools -y

创建认证用户:

[root@server1 ingress]# htpasswd -c auth cl			#再次添加用户时不需要-c选项
New password: 				#输入两边密码
Re-type new password: 
Adding password for user cl

查看生成的认证文件:

[root@server1 ingress]# cat auth 
[root@server1 ingress]# kubectl create secret generic basic-auth --from-file=auth
secret/basic-auth created
[root@server1 ingress]# kubectl describe secrets basic-auth 

在这里插入图片描述编辑部署文件:

[root@server1 ingress]# vim ingresss.yaml 
[root@server1 ingress]# cat ingresss.yaml 
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-demo
  annotations:
    # type of authentication  认证方式为基础认证
    nginx.ingress.kubernetes.io/auth-type: basic			
    # name of the secret that contains the user/password definitions	包含用户名和密码的secret名称
    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 - cl'
spec:
  tls:
    - hosts:
      - www1.westos.org
      secretName: tls-secret
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 80

应用部署文件:

[root@server1 ingress]# kubectl apply -f ingresss.yaml 
ingress.networking.k8s.io/ingress-demo configured

查看状态:

在这里插入图片描述

浏览器输入地址www1.westos.org 进行测试:
在这里插入图片描述在这里插入图片描述

可以看出不仅被重定向到了加密地址,而且还需要认证用户登陆,登陆后即可访问服务。

实验后删除:

[root@server1 ingress]# kubectl delete -f ingresss.yaml 
ingress.networking.k8s.io "ingress-demo" deleted

四、 Ingress nginx控制器重写部署

1.简单重写

当没有编辑重写策略时,我们访问www1.westos.org地址时返回:
在这里插入图片描述
当我们点击Pod Name时访问的地址是www1.westos.org/hostname.html:
在这里插入图片描述
我们要求重写的策略是:访问www1.westos.org时重写到www1.westos.org/hostname.html

编辑部署文件:

[root@server1 ingress]# vim ingress3.yaml 
[root@server1 ingress]# cat ingress3.yaml 
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rewrite-example
  annotations:
    nginx.ingress.kubernetes.io/app-root: /hostname.html			#重写地址
spec:
  rules:
  - host: www1.westos.org
    http:
      paths:
      - path: /						#访问地址
        backend:
          serviceName: myservice
          servicePort: 80

应用:

[root@server1 ingress]# kubectl apply -f ingress3.yaml 
ingress.networking.k8s.io/rewrite-example configured

测试访问:

[root@foundation63 kiosk]# curl www1.westos.org -L			#-L	表示显示重定向内容
deployment-nginx-868855d887-gmxcr
[root@foundation63 kiosk]# curl www1.westos.org -L
deployment-nginx-868855d887-c48cq
[root@foundation63 kiosk]# curl -v www1.westos.org -L			#查看重写过程:

在这里插入图片描述

可以看出成功重写。

2.使用正则表达式重定向

编辑部署文件:

[root@server1 ingress]# vim ingress3.yaml 
[root@server1 ingress]# cat ingress3.yaml 
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rewrite-example
  annotations:
    #nginx.ingress.kubernetes.io/app-root: /hostname.html
    nginx.ingress.kubernetes.io/rewrite-target: /$2		#重定向地址
spec:
  rules:
 - host: www1.westos.org
    http:
      paths:
      - path: /demo(/|$)(.*)			#访问地址
        backend:
          serviceName: myservice
          servicePort: 80

以上部署文件中的重定向规则示例:

  • www1.westos.org/demo 重定向到 www1.westos.org/
  • www1.westos.org/demo/ 重定向到 www1.westos.org/
  • www1.westos.org/demo/new 重定向到 www1.westos.org/new

应用部署文件:

[root@server1 ingress]# kubectl apply -f ingress3.yaml 
ingress.networking.k8s.io/rewrite-example configured

测试访问:

  • www1.westos.org/demo 重定向到 www1.westos.org/
    在这里插入图片描述 - www1.westos.org/demo/ 重定向到 www1.westos.org/
    在这里插入图片描述 - www1.westos.org/demo/new 重定向到 www1.westos.org/new

在这里插入图片描述可以看出重写部署成功

最后补充以下重写参数:

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐