对外服务之Ingress

server/2024/10/19 2:15:01/

目录

一、Ingress基础介绍

1.Igress概念

2.K8S对外暴露服务(service)主要方式

(1)NodePort

(2)LoadBalancer

(3)externalIPs

(4)Ingress

3.Ingress 组成

(1)ingress(nginx配置文件)

(2)ingress-controller(当作反向代理或者转发器)

(3)Ingress组成组件的请求过程

4.Ingress Controller 工作原理

(2)工作原理流程概述

5.ingress 暴露服务的方式

(1)方式一:Deployment+LoadBalancer 模式的 Service

(2)方式二:DaemonSet+HostNetwork+nodeSelector

示例:ingress+tomcat

(3)方式三:Deployment+NodePort模式的Service

示例:ingress+tomcat

二、部署nginx-ingress-controller

1.部署ingress-controller pod及相关资源

​编辑

2.修改ClusterRole资源配置

3.指定nginx-ingress-controller运行在node02节点

4.在所有node上上传ingree.contro.tar.gz,并解压和加载镜像

5.启动nginx-ingress-controller

6.创建ingress规则

1.创建一个deploy和svc

​编辑

2.创建ingress配置文件

7.测试访问

8.查看nginx-ingress-controller

三、采用方式三:Deployment+NodePort模式的Service

1.下载nginx-ingress-controller和ingress-nginx暴露端口配置文件

2.在所有节点上传镜像包ingress-controller-0.30.tar

3.启动nginx-ingress-controller

4.Ingress HTTP 代理访问

5.测试访问

6.Ingress HTTP 代理访问虚拟主机

7.测试访问

​编辑

8.Ingress HTTPS 代理访问

(1)创建ssl证书

(2)创建 secret 资源进行存储

(3)创建 deployment、Service、Ingress Yaml 资源

9.Nginx进行 BasicAuth

(1)生成用户密码认证文件,创建 secret 资源进行存储

(2)创建 ingress 资源

(3)访问测试

10.Nginx重写

(1)metadata.annotations 配置说明

(2)编写ingress-rewrite.yaml

(3)访问测试

总:


一、Ingress基础介绍

1.Igress概念

(1)service的作用体现在两个方面:

①对集群内部,不断跟踪pod的变化,更新endpoint中对应的pod的对象,提供了ip不断变化的pod的服务发现机制;

②对集群外部,他类似负载均衡器,可以在汲取内外部对pod进行访问。

(2)ingress使用举例

IB负载+ingress对外提供的方式

2.K8S对外暴露服务(service)主要方式

(1)NodePort

①将service暴露在节点网络上,NodePort背后就是Kube-Proxy,Kube-Proxy是沟通service网络、Pod网络和节点网络的桥梁。

②测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理就是个灾难。因为每个端口只能是一种服务,端口范围只能是 30000-32767。

(2)LoadBalancer

通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于公有云服务提供商的云平台上设置Service的场景。受限于云平台,且通常在云平台部署LoadBalancer还需呀额外的费用。

在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

(3)externalIPs

service允许为其分配外部IP,如果外部IP路由到集群中一个会多个Node上,Service会被暴露给这些externallPs。通过外部IP进入到集群的流量,将会被路由到Service的Endpoint上。

(4)Ingress

只需一个或者少量的公网IP和LB,即可同时将多个HTTP服务暴露到外网,七层反向代理。

可以简单理解为service的service,他其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则。

3.Ingress 组成

Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/

(1)ingress(nginx配置文件)

ingress是一个API对象,通过yaml文件来配置,ingress对象的作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能。

(2)ingress-controller(当作反向代理或者转发器)

ingress-controller是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。
一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据 ingress对象生成配置并应用新配置到反向代理,比如ingress-nginx就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。为了方便,后面的例子都以k8s官方维护的ingress-nginx为例。

总:

ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名、哪些URL要转发到哪些service等等。

(3)Ingress组成组件的请求过程

客户请求过来到ingress-controller,不知道选择哪个service,将请求发送给ingress资源对象,根据配置文件选择合适的service再到pod

ingress——七层

service——四层(IP+端口号)

总:

ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名、哪些URL要转发到哪些service等等。

4.Ingress Controller 工作原理

配置文件会保存在etcd中

(2)工作原理流程概述

①ingress-controller通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则变化,
②然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,
③再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中,
④然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。

5.ingress 暴露服务的方式

(1)方式一:Deployment+LoadBalancer 模式的 Service

如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个 type为 LoadBalancer 的 service 关联这组 pod。大部分公有云,都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址。 只要把域名解析指向该地址,就实现了集群服务的对外暴露

(2)方式二:DaemonSet+HostNetwork+nodeSelector

用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。 比较适合大并发的生产环境使用。

示例:ingress+tomcat

daemonset + hostNetwork 模式部署 ingress-controller

daemonset + hostNetwork 模式部署 ingress-controller数据流向:

客户端——ingress-controller(pod和host共享IP和端口)——业务应用的Service——业务应用的pod

(3)方式三:Deployment+NodePort模式的Service

同样用deployment模式部署ingress-controller,并创建对应的service,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。(相当于多个一个Service)
NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。

示例:ingress+tomcat

Deployment+NodePort模式部署 ingress-controller

deployment + Service (Nodeport LoadBalancer)模式部署 ingress-controller数据流向:

客户端——ingress的service——ingress-controller(pod)——业务应用的Service——业务应用的pod

ingress问题:添加一个nginx负载均衡出现始终分发ingress到达不了 Service的问题

解决方法:如果是ingress直接暴露的HTTPS就放在ingress里就行;如果中间还有nginx反向代理出去需要在nginx这台上做HTTPS的ssl证书认证,ssl证书收费的一般三到五千每年

二、部署nginx-ingress-controller

1.部署ingress-controller pod及相关资源

master节点操作

mkdir /opt/ingress
cd /opt/ingress官方下载地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml上面可能无法下载,可用国内的 gitee
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml#mandatory.yaml文件中包含了很多资源的创建,包括namespace、ConfigMap、role,ServiceAccount等等所有部署ingress-controller需要的资源。

2.修改ClusterRole资源配置

3.指定nginx-ingress-controller运行在node02节点

kubectl label node node02 ingress=true
kubectl get nodes --show-labels

4.在所有node上上传ingree.contro.tar.gz,并解压和加载镜像

master01节点操作

cd /opt
tar zxvf ingree.contro.tar.gz
scp ingree.contro.tar node01:/opt/
scp ingree.contro.tar node02:/opt/

node01节点操作

docker load -i ingree.contro.tar

node02节点操作

docker load -i ingree.contro.tar

5.启动nginx-ingress-controller

master节点操作

#告警不影响
cd /opt/ingress/
kubectl apply -f mandatory.yaml

[root@master01 ingress]# kubectl get pod -n ingress-nginx -owide
NAME                             READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
nginx-ingress-controller-fjc8v   1/1     Running   0          3m42s   192.168.91.105   node02   <none>           <none>

kubectl describe pod -n ingress-nginx

如果此处报错:bind to 0.0.0.00 failed或查看日志kubectl logs -n ingress-nginx nginx-ingress-controller-ngmvf

在node节点查看80端口是否存在,存在禁掉即可

lsof -i:80

kubectl get cm,daemonset -n ingress-nginx -owide

注释:

  1. ConfigMap(配置地图):

    • 作用:用于存储应用程序的配置数据,如环境变量、配置文件等。将配置数据存储在ConfigMap中可以使应用程序与配置数据解耦,方便管理和更新配置信息。
    • 用途:应用程序可以通过挂载ConfigMap或将其作为环境变量注入到Pod中来访问配置数据。
    • 示例:存储数据库连接信息、日志级别、应用程序参数等配置信息。
  2. DaemonSet(守护进程集):

    • 作用:确保集群中的每个节点运行一个副本的Pod。当节点加入集群时,会自动创建一个Pod实例;当节点从集群中移除时,相应的Pod实例也会被删除。
    • 用途:适用于在每个节点上运行特定的系统级任务或服务,如日志收集、监控代理等。
    • 示例:在每个节点上运行网络代理、存储卷插件、日志收集器等。

node02节点查看

netstat -nltp | grep nginx

由于配置了 hostnetwork,nginx 已经在 node 主机本地监听 80/443/8181 端口。其中 8181 是 nginx-controller 默认配置的一个 default backend(Ingress 资源没有匹配的 rule 对象时,流量就会被导向这个 default backend)。这样,只要访问 node 主机有公网 IP,就可以直接映射域名来对外网暴露服务了。如果要 nginx 高可用的话,可以在多个 node上部署,并在前面再搭建一套 LVS+keepalived 做负载均衡。

6.创建ingress规则

1.创建一个deploy和svc

master01节点操作

#空跑
kubectl create deployment myapp-demo --image=soscscs/myapp:v1 --replicas=3 --port=80
kubectl get pod

kubectl expose deployment myapp-demo --port=80 --target-port=80
kubectl get svc
对外暴露端口

kubectl describe svc myapp-demo
kubectl get pod -n ingress-nginx -owide

[root@master01 ingress]# vim service-nginx.yaml
[root@master01 ingress]# kubectl apply -f service-nginx.yaml 
vim service-nginx.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-app-svc
spec:type: ClusterIPports:- protocol: TCPport: 80targetPort: 80selector:app: nginx

2.创建ingress配置文件

使用的是方法二

#方法一:(extensions/v1beta1 Ingress 在1.22版本即将弃用)
vim ingress-app.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.blue.comhttp:paths:- path: /backend:serviceName: nginx-app-svcservicePort: 80#方法二:
vim ingress-app.yaml	  
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-app-ingress
spec:rules:- host: www.kcy.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svcport:number: 80
kubectl apply -f ingress-app.yaml
kubectl get ingress

7.测试访问

本地 host 添加域名解析

vim /etc/hosts
#里面添加node02地址和解析:IP地址 www.kcy.com
192.168.91.105 www.kcy.com 

#如果还需要添加服务就可以
kubectl create deployment myapp-sun --image=soscscs/myapp:v2 --replicas=3 --port=80
kubectl get pod
#再进行暴露
kubectl expose deployment myapp-sun --port=8080 --target-port=80
#报错信息出现以下则是已经存在,可以将
Error from server (AlreadyExists): services "myapp-sun" already exists
#解决方案:
①查看是否已存在
kubectl get svc
②存在删除即可(生产中不会出现相同的)
kubectl delete svc myapp-sun
③再次重新暴露
kubectl expose deployment myapp-sun --port=8080 --target-port=80

#修改配置文件
cp ingress-app.yaml demo1.yaml
vim demo1.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: demo1
spec:rules:- host: www.red.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-app-svcport:number: 80
[root@master01 ingress]# cp ingress-app.yaml demo1.yaml
[root@master01 ingress]# vim demo1.yaml 
[root@master01 ingress]# kubectl apply -f demo1.yaml 
ingress.networking.k8s.io/demo1 created
[root@master01 ingress]# kubectl get ingress

本地 host 添加域名解析

vim /etc/hosts
#里面添加node02地址和解析:IP地址 www.red.com
192.168.91.105 www.red.com 

对外访问只需要做主机映射即可

8.查看nginx-ingress-controller

kubectl get pod -n ingress-nginx -o widekubectl exec -it nginx-ingress-controller-fjc8v -n ingress-nginx bash# more /etc/nginx/nginx.conf//可以看到从 start server www.kcy.com 到 end server  www.red.com 之间包含了此域名用于反向代理的配置

按空格移动文件 

三、采用方式三:Deployment+NodePort模式的Service

1.下载nginx-ingress-controller和ingress-nginx暴露端口配置文件

mkdir /opt/ingress-nodeport
cd /opt/ingress-nodeport官方下载地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml国内 gitee 资源地址:
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

2.在所有节点上传镜像包ingress-controller-0.30.tar

tar zxvf ingree.contro-0.30.0.tar.gz scp ingree.contro-0.30.0.tar node01:/opt/ingress-nodeport
scp ingree.contro-0.30.0.tar node02:/opt/ingress-nodeport

 docker load -i ingree.contro-0.30.0.tar 

3.启动nginx-ingress-controller

kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

如果K8S Pod 调度失败,在 kubectl describe pod资源时显示:
Warning FailedScheduling 18s (x2 over 18s) default-scheduler 0/2 nodes are available: 2 node(s) didn’t match node selector

解决方案:

1.给需要调度的node加上对应标签
相对上面这个Yaml文件的例子
kubectl label nodes node_name kubernetes.io/os=linux
2.删除Yaml文件中的nodeSelector,如果对节点没有要求的话,直接删除节点选择器即可

[root@master01 ingress-nodeport]# kubectl get pod,svc -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-controller-6dd687bfdf-wdtwj   0/1     Running   2          2m1s
pod/nginx-ingress-controller-fjc8v              1/1     Running   10         23hNAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx   NodePort   10.96.146.21   <none>        80:31692/TCP,443:30412/TCP   105s

4.Ingress HTTP 代理访问

创建deployment、service、Ingress yaml资源

vim ingress-nginx.yaml apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-myapp
spec:replicas: 2selector:                #通过正确设置 selector,Deployment 将能够识别并管理符合条件的 Pod,确保其数量符合配置要求,实现应用程序的高可用性和可伸缩性matchLabels:          #matchLabels: name: nginx 表示要选择具有标签 name=nginx 的对象name: nginxtemplate:         #定义控制器对象的pod模板metadata:       #metadata 字段用于定义 Pod 的元数据,如名称、命名空间等。labels:       #labels 字段用于定义 Pod 的标签,这里指定了一个标签 name: nginxname: nginxspec:                       #定义 Pod 的规格,包括容器、卷挂载、标签选择器等信息containers:               #容器- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-test
spec:
spec:rules:    #定义了特定主机的路由规则- host: www.lon.com    #当访问www.long.com请求,会转发给nginx-svc后端服务端口80http:paths:- path: /            #path: / 和 pathType: Prefix 表示所有请求路径都会匹配到 / 这个路径前缀pathType: Prefixbackend:   #指定了将请求转发到nginx-svc后端80service: name: nginx-svcport:number: 80
kubectl apply -f ingress-nginx.yaml
kubectl get pods,svc -o wide

kubectl get pod,svc -owide|grep nginx-myapp

[root@master01 ingress-nodeport]# kubectl exec -it pod/nginx-myapp-57dd86f5cc-bzfpc bash[root@master01 ingress-nodeport]# kubectl exec -it pod/nginx-myapp-57dd86f5cc-dr8x2 bash

5.测试访问

[root@master01 ingress-nodeport]# curl 10.244.2.228
shi jie he ping
[root@master01 ingress-nodeport]# curl 10.244.2.229
tong zhi

kubectl get svc -n ingress-nginx

#本地 host 添加域名解析
vim /etc/hosts
#添加域名解析
192.168.91.105 www.lon.com#外部访问
curl http://www.lon.com:32225

6.Ingress HTTP 代理访问虚拟主机

①创建虚拟主机1资源

mkdir /opt/ingress-nodeport/vhost
cd /opt/ingress-nodeport/vhost#创建虚拟主机1资源
vim deployment1.yamlapiVersion: apps/v1
kind: Deployment  #用于部署可扩展应用程序副本的控制器。它确保指定数量的 Pod 副本运行
metadata:         #定义资源对象信息name: deployment1
spec:             #定义资源对象配置和规格信息replicas: 2     #副本数量为2selector:       #通过设置selector,deployment来识别对应条件的podmatchLabels:  #匹配标签为ngix1的podname: nginx1template:       #定义模板metadata:     #定义资源对象信息labels:     #定义标签为nginx1name: nginx1spec:         #定义资源对象配置和规格信息containers: #容器- name: nginx1image: soscscs/myapp:v1imagePullPolicy: IfNotPresent  #镜像拉取策略ports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-1
spec:ports:- port: 80 #对外暴露端口targetPort: 80 #后端对应端口protocol: TCP  #通信协议 selector:name: nginx1   #选择标签name=nginx1的对象
mkdir /opt/ingress-nodeport/vhost
cd /opt/ingress-nodeport/vhost/
kubectl apply -f deployment1.yaml 

②创建虚拟主机2资源

#创建虚拟主机2资源
vim deployment2.yaml
apiVersion: apps/v1
kind: Deployment #用于部署可扩展应用程序副本的控制器。它确保指定数量的 Pod 副本运行
metadata:name: deployment2
spec:replicas: 2selector:matchLabels:name: nginx2template:metadata:labels:name: nginx2spec:containers:- name: nginx2image: soscscs/myapp:v2imagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: svc-2
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx2
vim deployment2.yaml 
kubectl apply -f deployment2.yaml 

③创建ingress资源

#创建ingress资源
vim ingress-nginx.yamlapiVersion: networking.k8s.io/v1  # 表示使用的是 Kubernetes Networking API 的版本 v1。
kind: Ingress
metadata:name: ingress1
spec:rules:- host: www1.mcl.comhttp:   #HTTP的路由规则paths:- path: /pathType: Prefixbackend:     #指定一个默认的后端服务service: name: svc-1port:number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress2
spec:rules:- host: www2.mcl.comhttp:paths:- path: /pathType: Prefixbackend:service: name: svc-2port:number: 80

7.测试访问

kubectl get svc -n ingress-nginx

#做主机映射
vim /etc/hosts
192.168.91.105 www1.mcl.com www2.mcl.comcurl www1.mcl.com:32225curl www2.mcl.com:32225

8.Ingress HTTPS 代理访问

mkdir /opt/ingress-nodeport/https
cd /opt/ingress-nodeport/https

(1)创建ssl证书

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

注释:

  • req: 表示使用 OpenSSL 中的 req 工具,用于证书请求和证书生成。
  • -x509: 表示生成自签名的 X.509 证书。
  • -sha256: 表示使用 SHA-256 哈希算法进行证书签名。
  • -nodes: 表示生成的私钥不使用密码进行加密。
  • -days 365: 表示证书的有效期为 365 天。
  • -newkey rsa:2048: 表示生成一个新的 RSA 2048 位的私钥。
  • -keyout tls.key: 表示将生成的私钥保存到名为 tls.key 的文件中。
  • -out tls.crt: 表示将生成的证书保存到名为 tls.crt 的文件中。
  • -subj "/CN=nginxsvc/O=nginxsvc": 表示在生成的证书中包含的主题信息,这里指定了 Common Name (CN) 和 Organization (O) 字段的值。

通过运行这个命令,您将生成一个自签名的 SSL 证书文件 tls.crt 和相应的私钥文件 tls.key,用于在 HTTPS 通信中进行加密和身份验证。

(2)创建 secret 资源进行存储

kubectl create secret tls tls-secret --key tls.key --cert tls.crtkubectl get secret
kubectl describe secret tls-secret

注释:

  • kubectl create secret tls tls-secret: 表示使用 kubectl 命令创建一个名为 tls-secret 的 TLS 类型的 Secret 对象。
  • --key tls.key: 表示将名为 tls.key 的私钥文件作为 Secret 对象的私钥部分。
  • --cert tls.crt: 表示将名为 tls.crt 的证书文件作为 Secret 对象的证书部分。

通过运行这个命令,您可以在 Kubernetes 集群中创建一个 TLS Secret 对象,其中包含了您提供的私钥和证书信息。这个 Secret 对象可以被挂载到 Pod 中,用于在容器中进行 TLS 加密通信。

注释:

Secret 是一种用于存储敏感信息的资源对象,如密码、API 密钥、证书等

Kubernetes 提供了几种类型的 Secret,包括:

  • Opaque:用于存储任意类型的密钥-值对。
  • Docker-registry:用于存储 Docker 仓库的凭据。
  • TLS:用于存储 TLS 证书和私钥。

(3)创建 deployment、Service、Ingress Yaml 资源

vim ingress-https.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginx-app
spec:replicas: 2selector:matchLabels:name: nginxtemplate:metadata:labels:name: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-svc
spec:ports:- port: 80targetPort: 80protocol: TCPselector:name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-https
spec:tls:- hosts:- www3.lon.comsecretName: tls-secret  #使用名为 tls-secret 的 Secret 对象来提供 TLS 加密所需的证书和私钥信息rules:- host: www3.kcy.comhttp:paths:- path: /pathType: Prefixbackend:service: name: nginx-svcport:number: 80
kubectl apply -f ingress-https.yaml
kubectl get svc -n ingress-nginx

kubectl get ingress

#访问测试
在宿主机的 C:\Windows\System32\drivers\etc\hosts 文件中添加 192.168.91.105 www3.kcy.com 记录。
使用谷歌浏览器访问 https://www3.kcy.com:32225

9.Nginx进行 BasicAuth

mkdir /opt/ingress-nodeport/basic-auth
cd /opt/ingress-nodeport/basic-auth

(1)生成用户密码认证文件,创建 secret 资源进行存储

yum -y install httpd
htpasswd -c auth mcl			#认证文件名必须为 auth

kubectl create secret generic basic-auth --from-file=authkubectl get secrets
kubectl describe secrets basic-auth

注释:

  • kubectl create secret generic basic-auth: 表示使用 kubectl 命令创建一个名为 basic-auth 的通用类型的 Secret 对象。
  • --from-file=auth: 表示从名为 auth 的文件中提取数据,并将其作为 Secret 对象的值。在这种情况下,文件中的内容将被存储为 Secret 对象的一个或多个键值对。

(2)创建 ingress 资源

vim ingress-auth.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-authannotations:       #创建 Secret 对象时添加注释#设置认证类型basicnginx.ingress.kubernetes.io/auth-type: basic#设置secret资源名称basic-authnginx.ingress.kubernetes.io/auth-secret: basic-auth#设置认证窗口提示信息nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - mcl'
spec:rules:- host: auth.mcl.comhttp:paths:- path: /pathType: Prefixbackend:service: name: nginx-svcport:number: 80//具体详细设置方法可参考官网https://kubernetes.github.io/ingress-nginx/examples/auth/basic/
[root@master01 basic-auth]# vim ingress-auth.yaml
[root@master01 basic-auth]# kubectl apply -f ingress-auth.yaml 

(3)访问测试

[root@master01 basic-auth]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.96.148.45   <none>        80:32225/TCP,443:30169/TCP   66m
[root@master01 basic-auth]# echo '192.168.91.105 auth.mcl.com' >> /etc/hosts
浏览器访问:http://auth.mcl.com:32225

10.Nginx重写

(1)metadata.annotations 配置说明

nginx.ingress.kubernetes.io/rewrite-target: <字符串> #必须重定向流量的目标URI
nginx.ingress.kubernetes.io/ssl-redirect: <布尔值> #指示位置部分是否仅可访问SSL(当Ingress包含证书时,默认为true)
nginx.ingress.kubernetes.io/force-ssl-redirect: <布尔值> #即使Ingress未启用TLS,也强制重定向到HTTPS
nginx.ingress.kubernetes.io/app-root: <字符串> #定义Controller必须重定向的应用程序根,如果它在'/'上下文中
nginx.ingress.kubernetes.io/use-regex: <布尔值> #指示Ingress上定义的路径是否使用正则表达式

(2)编写ingress-rewrite.yaml

vim ingress-rewrite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-rewriteannotations: #注释信息:告诉 Ingress Controller 将请求重写为 http://www1.mcl.com:31751,以便正确路由到后端服务nginx.ingress.kubernetes.io/rewrite-target: http://www1.mcl.com:31751
spec:rules:- host: re.mcl.comhttp:paths:- path: /pathType: Prefixbackend:#由于re.kgc.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义service: name: nginx-svcport:number: 80

(3)访问测试

[root@master01 basic-auth]# vim ingress-rewrite.yaml
[root@master01 basic-auth]# kubectl apply -f ingress-rewrite.yaml 
ingress.networking.k8s.io/nginx-rewrite created
[root@master01 basic-auth]# echo '192.168.91.105 re.mcl.com' >> /etc/hosts

总:

在 Kubernetes 中,Deployment 和 DaemonSet 是用于管理 Pod 的两种不同的控制器类型,它们具有不同的特性和用途:

  1. Deployment + NodePort:

    • Deployment 是用于部署可扩展应用程序副本的控制器。它确保指定数量的 Pod 副本运行,并处理 Pod 的部署、更新和扩缩容等操作。
    • NodePort 是一种 Kubernetes 服务类型,允许从集群外部访问集群内部的服务。NodePort 会在每个节点上打开一个端口,将流量转发到 Service 的 ClusterIP 上。
  2. DaemonSet + HostNetwork + nodeSelector:

    • DaemonSet 用于在集群中的每个节点上运行一个副本,确保在每个节点上都运行指定的 Pod 副本。它通常用于运行一些基础设施性质的服务,如日志收集器、监控代理等。
    • HostNetwork 是 DaemonSet 的一个配置选项,它允许 Pod 直接使用节点的网络命名空间,即 Pod 和节点共享网络。这样可以让 Pod 直接访问节点上的网络资源。
    • nodeSelector 是一个用于在 Kubernetes 中选择特定节点的标签选择器。通过在 DaemonSet 中指定 nodeSelector,可以确保 DaemonSet 只在具有指定标签的节点上运行。

区别:

  • Deployment 适用于部署可扩展的应用程序副本,而 DaemonSet 适用于在每个节点上运行一个副本的场景。
  • NodePort 是一种服务类型,用于允许外部访问集群内部的服务,而 HostNetwork 允许 Pod 直接使用节点的网络,绕过 Kubernetes 的网络模型。
  • nodeSelector 用于在 DaemonSet 中选择特定节点运行 Pod,而 Deployment 通常不涉及直接选择节点。

ingress是k8s集群的请求入口,可以理解为对多个service的再次抽象
通常说的ingress一般包括ingress资源对象及ingress-controller两部分组成
ingress-controller有多种实现,社区原生的是ingress-nginx,根据具体需求选择
ingress自身的暴露有多种方式,需要根据基础环境及业务类型选择合适的方式


http://www.ppmy.cn/server/47679.html

相关文章

Python02:python代码初体验

0、python代码初体验 print(hello,world)看到执行结果输出&#xff0c;则OKK! 1、输出结果取消换行 当print多个执行结果&#xff0c;又希望它们在同一行展示时&#xff1a; print(hello,world, end)print(Hao are, end ) print(you, end?) print(I am fine.) # end参数可…

idea ecs部署服务

如图 部署后脚本 cd /home/project; mkdir -p order; cd order; cp /home/project/order-service-0.0.1-SNAPSHOT.jar .; cp --no-clobber /home/shell/ctl-plus.sh .; ./ctl-plus.sh restart;

Spring AOP面向切面编程

Spring AOP面向切面编程 文章目录 Spring AOP面向切面编程1 面向切面编程思维&#xff08;AOP&#xff09;2 Spring AOP框架介绍和关系梳理3 SpringAOP基于注解方式实现和细节3.1 Spring AOP底层技术组成3.2 初步实现3.3 获取通知细节信息3.4 切点表达式3.5 重用&#xff08;提…

SploitScan:一款多功能实用型安全漏洞管理平台

关于SploitScan SploitScan是一款功能完善的实用型网络安全漏洞管理工具&#xff0c;该工具提供了用户友好的界面&#xff0c;旨在简化广大研究人员识别已知安全漏洞的相关信息和复现过程。 SploitScan可以帮助网络安全专业人员快速识别和测试已知安全漏洞&#xff0c;如果你需…

C++的算法:贪心算法

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效,它所做的每一个选择都是基于一个局部最优决策,从而希望导致全局最优解。然而,贪心算…

LeetCode-103. 二叉树的锯齿形层序遍历【树 广度优先搜索 二叉树】

LeetCode-103. 二叉树的锯齿形层序遍历【树 广度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;层序遍历&#xff0c;唯一区别就是ans.append(level[::-1] if len(ans) % 2 else level)背诵版&#xff1a;解题思路三&#xff1a;0 题目描述&#xff1a; 给你二…

Python 高手编程系列三:用于保持跨版本兼容性的常用工具和技术

在 Python 不同版本之间保持兼容性是一项挑战。根据项目的大小不同&#xff0c;这项挑战可能 会增加许多额外的工作量&#xff0c;但绝对可行&#xff0c;也很值得去做。对于在许多环境中都会用到的 Python 包来说&#xff0c;必须要保持跨版本兼容性。如果开源包没有定义明确并…

Android AAudio——C API控制音频流(四)

上一篇文章我们介绍了 C API 中音频流的创建流程,以及打开音频流操作,这里我们再来看一下音频流的其他操作流程 一、音频流操作介绍 1、操作流程图 下图是状态变化流程图,虚线框表示瞬时状态,实线框表示稳定状态。 2、操作函数 上图中主要包含下面几个操作函数: aaudio…