目录
一、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
注释:
ConfigMap(配置地图):
- 作用:用于存储应用程序的配置数据,如环境变量、配置文件等。将配置数据存储在ConfigMap中可以使应用程序与配置数据解耦,方便管理和更新配置信息。
- 用途:应用程序可以通过挂载ConfigMap或将其作为环境变量注入到Pod中来访问配置数据。
- 示例:存储数据库连接信息、日志级别、应用程序参数等配置信息。
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 的两种不同的控制器类型,它们具有不同的特性和用途:
Deployment + NodePort:
- Deployment 是用于部署可扩展应用程序副本的控制器。它确保指定数量的 Pod 副本运行,并处理 Pod 的部署、更新和扩缩容等操作。
- NodePort 是一种 Kubernetes 服务类型,允许从集群外部访问集群内部的服务。NodePort 会在每个节点上打开一个端口,将流量转发到 Service 的 ClusterIP 上。
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自身的暴露有多种方式,需要根据基础环境及业务类型选择合适的方式