Kubernetes-Ingress资源详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Kubernetes-Ingress资源详解
什么是Ingress
Service缺点
#定义service以后,尤其是NodePort集群访问,需要经过2级转换调度,⽽且是4层调度,⽆论是iptables还是ipvs。

4调度⾃⾝⽆法实现卸载https会话。

#ingress----k8s还有⼀种引⼊集群外部流量的⽅式,叫ingress。

基于7层调度器。

利⽤7层pod,将外部流量引⼊到内部。

回顾-Service:
⼯作三种⽅式模型: userspace(效率低、各种空间转换) iptables、ipvs(1.11版之后,部署时需要额外配置先关参数)
Service集群类型:
ClusterIP(集群内部通信),
NodePort(集群内外互通,⼯作逻辑:client-->nodeip:nodeport-->clusterip:serviceip--->podiip:containerport),可以在前⾯加个nginx,代理后端各个nodeport的时候,压⼒得到释放。

LoadBalancer
ExternerName
Ingress⽀持的调度⽅式
1、url路径映射调度: location /aa ; location /bb。

可以参考nginx。

2、主机调度:l例如server aaa; server bbb
Ingress类型:1、url映射 2、虚拟主机
Ingress-controller:(提供特定功能的pod,nginx-ingress-controller-pod):提供接⼊外部流量的特定pod。

例如有3个节点,在这3个节点打上污点,在每个上⾯运⾏特定的daemonset pod,实现外部流量接⼊,为后⾯pod提供7层调度。

众多控制器都是master节点的controllermanager 的⼦件运⾏的。

⽽ingree controller⾃⼰独⽴运⾏,通常是⼀组pod资源。

具有7层代理功能。

⽀持的代理⼯具:nginx、Traefik、Evoy(微服务)、HAproxy
watch:Service始终watch着后端pod变化。

只要pod发⽣变化,api-server⽴刻检测到。

Ingress
实现原理:
1、正常是⽤service去调度后⾯的适配label的pods,当pods增加,因为有labels,会⾃动识别后端添加的pods,如果⽤nginx怎么实现?把nginx运⾏在pod⾥⾯,配置⽂件在pod内部。

这种pod叫ingress controller随时观察着后端的pod的改变。

ingress controler⾃⼰没有这种能⼒,借助于service去实现。

所以nginx-ingress-controller后端还得建⽴service。

这种service仅仅帮忙分类后端的pods资源。

pods的配置在nignx⾥upstream⾯。

service不会进⾏调度,仅仅分组。

因此可以使⽤headless service,直接调度⾄后端pods。

关键pods变化,怎么⾃动nginx的upstream以及其他配置,这种就通过ingress路由实现!
2、ingress需要建⼀个前端接⼊层,前端有可能是虚拟主机nginx配置的server,或者是location url映射,同时也要定义⼀个后端upstream-server。

upstream有⼏个主机。

通过service来获取的。

3、ingress有个特点:作为资源来讲,直接通过编辑注⼊到nginx-ingress-controller,并保存为nginx的配置⽂件。

⽽且ingress⼀旦发现service 后端的pods改变,ingress直接注⼊更新nginx配置⽂件,⽽且需要重载配置⽂件(traefik⽀持⾃动重载)。

实现ingress步骤(7层调度):
1、第⼀步:部署⼀个nginx-ingress-controller-pod。

部署⼀个特殊pod。

2、第⼆部:给nginx-ingress-controller-pod创建前端service1。

⽤来接⼊外部请求!
3、创建nginx-ingress-controller-pod后端service2,以及service关联的pods。

4、创建ingress、⾃动实现路由规则,⾃动实现service2⾃动注⼊到nginx-ingress-controller-pod规则(nginx.conf)
5、总结就是⾸先部署外部请求<------ingress-service<-----nginx-ingress-controller-pod<--------ingress<------service(headless、daemonset)<------pods
Ingress原理图
原理:外部负载均衡器externalLB请求调⾄到 nodeport ⾥⾯service服务--->调度到内部pod(ingress controller⾥⾯)----->根据ingree定义,是虚拟主机,还是url代理---->假设是主机名,⼀组主机名对应后端的pod资源pod1,pod2,pod3。

pod怎么分组通过service进⾏分组。

才能被ingress引⽤。

先安装ingress controller pod。

然后定义ingress。

再定义pod⽣成service。

动态⽣效:pod⼀变化,service就变化,service⼀变化,ingress就变化,ingreess⼀变化就注⼊到ingress controller⾥⾯。

实时动态。

例⼦1(定义nginx-ingress-controller-pod) 3⼤步骤!
1、创建ingress-controller
#查看ingress帮助⽂档
[root@node-001 ingress]# kubectl explain ingress.spec
#查看虚拟主机调度规则
[root@node-001 ingress]# kubectl explain ingress.spec.rules.host
#查看路径url映射调度规则
[root@node-001 ingress]# kubectl explain ingress.spec.rules.http.paths
#查看路径url映射调度规则
#查看url映射调⽤的后端主机规则(后端是通过service关联⼀组后端pod)
[root@node-001 ingress]# kubectl explain ingress.spec.backend.servicename
#查看后端service后端的哪些pod,因为ingress backend后端就是根据service知道哪些pod资源。

⼀旦pods变化,service就变化,service变化,ingress就变化,ingress⼀变化就注⼊到ingress-controller.
#tls字段:配置ingress-controller虚拟机主机、或者url代理成https,需要⽤配置在ingress-controller相当于向后端代理时候,卸载了ssl会话。

######################################################################################################
原理注解:
把nginx作为ingress-controller-pod
#第⼀步:创建名称空间
#yum install git -y
或者直接⽤命令创建:#kubectl create namespace dev #kubectl get namespace
#第⼆步:需要⽤到⾥⾯的configmap.yaml,存储卷的时候后⾯讲,主要⽤来从外部注⼊配置
#第三步:rbac.yaml ⽤来定义⾓⾊、授权。

必要时让ingress controller达到不了的名称空间。

⽤kube安装的k8s默认启⽤,必须要设置。

#第四步:接着设置with-rbac.yaml. 说明introller controller部署时候带上rbac部署。

#第五步: 配置tcp-service-configmap.yaml。

新版本貌似没有这个⽂件
#把git⽂件先下载个备份保存⼀下。

######################################################################################################
下载nginx-ingress-controller相关的yaml清单(不⾏,⼿动下载)
#会有⼏个下载不了,有可能版本不匹配。

注意这边是raw格式的yaml所以下载地址不是github下载地址开头的!
查看实际下载了哪些⽂件(⼀般下载4个即可)
[root@mater01 ingress]# ll
total 344
-rw-r--r-- 1 root root 75231 Jan 14 18:13 configmap.yaml
-rw-r--r-- 1 root root 70461 Jan 14 18:13 namespace.yaml
-rw-r--r-- 1 root root 103826 Jan 14 18:13 rbac.yaml
-rw-r--r-- 1 root root 90993 Jan 14 18:13 with-rbac.yaml
⾸先创建ingress-nginx名称空间再批量其他yaml操作
[root@node-001 ingress-nginx]# kubectl apply -f namespace.yaml #会创建⼀个ingress-nginx名称空间
namespace/ingress-nginx created
批量根据清单rbac等等(因为kubeadm安装的k8s默认启⽤了rbac)
[root@node-001 ingress-nginx]# kubectl apply -f ./
#直接apply当前⽬录,全部⾃动创建。

⾃动引⼊⽬录下所有的yaml⽂件
#会⾃动下载nginx安装pods
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
namespace/ingress-nginx unchanged
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
#查看⾃动安装的nginx-ingress-controller-pod
[root@node-001 ingress-nginx]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-568867bf56-q2pt2 1/1 Running 0 70s
#查看nginx-ingress-controller-pod是否成功
[root@node-001 ~]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-568867bf56-q2pt2 1/1 Running 0 5d4h
#注意点:部署在裸机上⾯,需要额外加上service-Nodeport,虽然内部可以访问,不然外⽹没有介⼊。

因为前⾯原理图前⾯还需要加个service,当然第⼆种⽅式,ingress-controller设置为daemonset 设置hostnetwork字段共享节点⽹络。

2、创建service和后端关联的pods
⾸先部署后端的底层服务service以及pods
[root@node-001 ingress]# cd /opt/manifests/ingress/
[root@node-001 ingress]# vim deploy-demo.yaml #创建ingress---->后⾯service---->deployment(pods)
apiVersion: v1
kind: Service #给底层pod定义⼀个service。

这个service必须为⽆头服务,不然⽆法直接解析对应节点的ip地址。

不然得到的是clusterip。

往ingress-controller注⼊会有问题。

奇怪的是这边也可以。

metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
ports:
- name: http
port: 80 #service启动端⼝
targetPort: 80 #pod的端⼝
---
apiVersion: apps/v1 #上⾯⼀定要三个横线分割!
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
containerPort: 80
查看后端pods、service、ingress-controller-pod
[root@node-001 manifests]# kubectl get pods -n ingress-nginx -w
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-568867bf56-q2pt2 1/1 Running 0 3h12m
[root@node-001 ingress]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20d
myapp ClusterIP 10.111.24.58 <none> 80/TCP 101s #ingress后端的service已经创建成功(原理详见上⾯的图⽚!)
在指定名称中,查看pods详细信息
[root@node-001 manifests]# kubectl describe pods nginx-ingress-controller-568867bf56-q2pt2 -n ingress-nginx ⼩知识:不想⼀个个创建pods、service、ingress-contoller怎么办?直接⽤官⽹的mandatory.yaml直接安装
3、创建nginx-ingress-controller-pod前⾯⼀层service(不然ingrss-controller没法接⼊外部请求流量)
核⼼原理:就是把nginx-ingress-controller-pod,这个特殊pod前⾯再定义⼀个service,例如前后端分离,前端接⼝直接调⽤这个service实现后端接⼝访问,这步骤很关键!
#部署Service:ingress-controller(nginx)前端的service,确保外部可以访问
下载清单⽂件
⼿动创建ning-ingree-service清单(不能下载的话)!并修改⼀下!(创建ingress-nginx前⾯的service)
#vim service-nodeport.yaml
[root@mater01 ingress]# cat service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
type: NodePort #service-ingree类型为NodePort
ports:
- name: http
port: 80 #定义nginx-ingress-controller-pod前⾯的service端⼝是80
targetPort: 80 #nginx-ingress-pod端⼝
protocol: TCP
nodePort: 30080 #指定serice-ingress端⼝300080,不然随机分配!注意这个service端⼝会在k8s所有集群机器开启!
- name: https
port: 443 #service端⼝是443
targetPort: 443 #pod端⼝,但是这边没有指定节点端⼝,所以service节点端⼝随机分配30000~32767?
protocol: TCP
nodePort: 30443 #指定service端⼝30443不然随机分配!注意这个service端⼝会在k8s所有集群机器开启!
selector:
app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx
#注意这个selector特别重要!不然创建的这个service⽆法把前⾯创建的ingress-nginx-pod匹配做为endpoints!怎么写(describe pod看⼀下)看下⾯!
查看selector怎么写?查看ingress-nginx这个pod是否正常运⾏!
[root@mater01 ingress]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-948ffd8cc-jqp2h 1/1 Running 0 4h8m
查看ingress-nginx-pod的详细信息
[root@mater01 ingress]# kubectl describe pod nginx-ingress-controller-948ffd8cc-jqp2h -n ingress-nginx
Name: nginx-ingress-controller-948ffd8cc-jqp2h
Namespace: ingress-nginx
Priority: 0
Node: node02/172.19.72.234
Start Time: Wed, 15 Jan 2020 10:46:09 +0800
Labels: app.kubernetes.io/name=ingress-nginx #这边是ingress-ninx的pod的标签信息,把这个信息写到前⾯创建service的slector清单⾥⾯去!这步骤很重要!否则创建的service-ingress-nginx⽆法匹配到ingress-nginx-pod!
app.kubernetes.io/part-of=ingress-nginx
pod-template-hash=948ffd8cc
查看创建的ingress-nginx前⾯的service服务
[root@mater01 ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.101.71.230 <none> 80:30080/TCP,443:30443/TCP 2m23s
#这边可以看到service类型为nodeport。

端⼝容器内端⼝80映射主机端⼝为30080和30443端⼝
查看ingress-nginx前⾯的service是否正常,以及这个service是否匹配到后端的ingress-nginx-pod!
[root@mater01 ingress]# kubectl describe svc ingress-nginx -n ingress-nginx
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":{"ports": [{"na...
Selector: app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
Type: NodePort
IP: 10.103.42.166
Port: http 80/TCP
TargetPort: 80/TCP
NodePort: http 30080/TCP
Endpoints: 10.244.2.6:80 #这边可以看到service成功匹配到后端的ingress-nginx的pod!
Port: https 443/TCP
TargetPort: 443/TCP
NodePort: https 30443/TCP
Endpoints: 10.244.2.6:443
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
查看状态
[root@node-001 ~]# kubectl get pods -o wide --show-labels -n ingress-nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
nginx-ingress-controller-568867bf56-q2pt2 1/1 Running 0 5d4h 10.244.1.91 node-002 <none> <none> app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx,pod-template-hash=568867bf56
查看service-ingress-nginx
[root@node-001 ingress]# kubectl get svc -n ingress-nginx
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx ingress-nginx NodePort 10.103.231.49 <none> 80:30080/TCP,443:30443/TCP 48s
#30080端⼝是service-ingress-nginx的端⼝,因为前⾯创建service-ingress-nginx指定service类型为NodePort,端⼝指定为30080 30443。

注意这个端⼝只要是servic端⼝!会在集群所有机器开启。

[root@node-001 ingress]# netstat -tunlp|grep 30080
tcp6 0 0 :::30080 :::* LISTEN 3329/kube-proxy
[root@node-001 ingress]# netstat -tunlp|grep 30443
tcp6 0 0 :::30443 :::* LISTEN 3329/kube-proxy
在外部IE浏览器尝试访问service-ingress-nginx
访问⽅式:IP:30080 IP:30443
此时应该是404 ,调度器是正常⼯作的,但是后端服务没有关联
⾕歌浏览器访问: 192.168.100.180:30080
default backend -404 #因为没有定义规则,后端调度没有配置!所以是失败的。

实验到此总结:第⼀步创建nginx-ingress-controller-pod、第⼆步创建nginx-ingress-controller-pod前⾯的service-ingress-nginx,指定service类型为Nodeport类型。

第三步创建底层deploument-pods、第四步配置ingress路由规则全部打通!
4、配置ingress路由规则导⼊。

创建ingress清单
#⽤ingress⾃动把pods转换为nginx的配置⽂件(例如加到upstream⾥⾯)。

#核⼼:利⽤注解信息annotations标注⽤的是nginx作为ingress-controller,因为除了nginx还有envoy、traefic等!
--------------------------------------------------------------------------------
[root@mater01 ingress]# kubectl explain ingress #查看定义帮助⽂档!不会的话百度!!
[root@k8s-master ingress]# vim ingress-myapp.yaml
apiVersion: extensions/v1beta1 #api版本
kind: Ingress #清单类型
metadata: #元数据
name: ingress-myapp #定义ingress的名称
namespace: default #定义ingress路由所属名称空间,注意要和deployment和要发布的service⼀个名称空间!
annotations: #标注我们⽤的是nginx,不是envoy、traefic等,核⼼代码。

kubernetes.io/ingress.class: "nginx" #这个很重要!核⼼配置,表⽰前⾯⽤的ingress-controller是nginx!才能⽣成规则!#kubernetes.io是前缀 ingress.class是键名 nginx是数值。

表⽰我们⽤的ingress-controller是nginx,这样才能⾃动⽣成nginx规则!
spec: #下⾯定义规则!
rules: #定义后端转发的规则。

# kubectl explain ingress.spec
- host: 使⽤第⼀种,虚拟主机来做!nginx有两种⼀种是虚拟主机,⼀种是URL映射!通过域名进⾏转发#需要确保,在互联⽹外部能解析这个主机名字!解析的结果能达到前⾯的nodeport-service。

http: #利⽤http定义前后端路径!
paths: #查看帮助⽂档:# kubectl explain ingress.spec.rules.http.paths
- path: #配置域名访问路径,如果通过url进⾏转发,需要修改;空默认为访问的路径为"/"
backend: #指定后端服务。

serviceName: myapp #ingress后端的service名字!
servicePort: 80 #ingress-后端service的端⼝是80 # kubectl describe svc myapp,Endpoints: 10.244.1.10:80,10.244.1.9:80,10.244.2.9:80 这个三个pod作为upstream的后端!
创建ingress路由
[root@k8s-master ingress]# kubectl apply -f ingress-myapp.yaml
[root@k8s-master ingress]# kubectl get ingress
#查看ingress服务 NAME HOSTS ADDRESS PORTS AGE ingress-myapp 80 46s
查看ingress信息
[root@node-001 ingress]# kubectl get ingress -A
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
default ingress-myapp 10.103.231.49 80 16m
[root@node-001 ingress]# kubectl describe ingress ingress-myapp
Name: ingress-myapp
Namespace: default
Address: 10.103.231.49
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
#主机名
myapp:80 (10.244.1.95:80,10.244.1.96:80,10.244.1.97:80) #后端提供pod服务地址!
Annotations:
kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations": {"kubernetes.io/ingress.class":"nginx"},"name":"ingress-myapp","namespace":"default"},"spec":{"rules":[{"host":"","http": {"paths":[{"backend":{"serviceName":"myapp","servicePort":80},"path":null}]}}]}}
kubernetes.io/ingress.class: nginx #ingress前⾯的类别⽤的是nginx,不是envoy、traefic!
#(ingress路由创建完成,会⾃动配置ingress-nginx配置⽂件)
#进⼊ingress-controller-pod的nginx,查看nginx配置⽂件
[root@mater01 ingress]# kubectl get pods -A|grep ingress-nginx
ingress-nginx nginx-ingress-controller-948ffd8cc-jqp2h 1/1 Running 0 2d
[root@node-001 ingress]# kubectl exec -n ingress-nginx -it nginx-ingress-controller-568867bf56-q2pt2 -- /bin/sh
$ ls
fastcgi_params mime.types nginx.conf template
geoip modsecurity opentracing.json
lua modules owasp-modsecurity-crs
$ cat nginx.conf
xxxx 这个nginx配置⽂件
修改linux主机、以及windows主机hosts
[root@mater01 ~]# vim /etc/hosts
192.168.100.180
192.168.100.181
实验到此成功结束!
例⼦2(实战tomcat)
每个node拉取镜像
[root@node-001 ingress]# docker pull tomcat:8.5.34-jre8-alpine
#去下载容器:
创建Service和Pod配置⽂件
[root@node-001 ingress]# vim tomcat-deploy.yaml
apiVersion: v1
kind: Service #这个service必须为⽆头服务,不然⽆法解析对应节点的ip地址。

metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
port: 8080 #这边是service的8080端⼝映射后端tomcat-pod的8080,但是这个是service层⾯的,只是cluster ip层级的。

⽤来被ingress规则所识别有哪些后端pod,哪些端⼝。

targetPort: 8080
- name: ajp
port: 8009
targetPort: 8009
---
apiVersion: apps/v1 #--- 三个横线表⽰分割
kind: Deployment
metadata:
name: tomcat-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
release: canary
template:
metadata:
labels:
app: tomcat
release: canary
spec:
containers:
- name: tomcat
image: tomcat:8.5.34-jre8-alpine
ports:
- name: http
containerPort: 8080
- name: ajp
containerPort: 8009
创建Pods以及Service
[root@node-001 ingress]# kubectl apply -f tomcat-deploy.yaml
service/tomcat created
检查tomcat是否跑在8080端⼝
[root@node-001 ingress]# kubectl exec -it tomcat-deploy-56c494fc77-cm6f5 -- /bin/sh [root@node-001 ingress]# kubectl exec -it tomcat-deploy-56c494fc77-cm6f5 -- netstat -tunlp /usr/local/tomcat # netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::8080 :::* LISTEN 1/java
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1/java
tcp 0 0 :::8009
创建ingress路由规则(基于域名)
[root@node-001 ingress]# vim ingress-tomcat.yaml
apiVersion: extensions/v1beta1 #ingress-api版本 #kubcectl explian ingress
kind: Ingress #清单类型是ingress路由
metadata:
name: ingress-tomcat #ingress路由的名称
namespace: default #所属名称空间,要和后端发布的service属于同⼀名称之中。

annotations: #注解信息,说明下⾯⽤到的是nginx不是其他的才能转换为ingress-contorller规则
kubernetes.io/ingress.class: "nginx" #说明ingress-controller⽤的是nginx,这样才能⽣成匹配规则。

spec: #定义ingress规则
rules: #定义后端转发的规则
- host: #通过域名进⾏转发
http:
paths:
- path: #配置访问路径,如果通过url进⾏转发,需要修改;空默认为访问的路径为"/"
backend: #配置ingress后端的service服务
serviceName: tomcat #后端service暴露的名字,ingress通过这个service去关联后端pods。

servicePort: 8080 #后端service端⼝!ingree默认是80.怎么再暴露⼀个8009,再定义⼀个path。

也就是说访问nginx 的80。

nginx反向代理到service的8080端⼝。

创建ingress规则
[root@node-001 ingress]# kubectl apply -f ingress-tomcat.yaml
ingress.extensions/ingress-myapp configured
[root@node-001 ingress]#
[root@node-001 ingress]# kubectl get ingress -A
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
default ingress-myapp 80 7s
[root@node-001 ingress]# kubectl describe -n default ingress ingress-tomcatp
查看路由规则
[root@mater01 ingress]# kubectl get ingress -A
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
default ingress-myapp 10.103.42.166 80 20m
k8s节点所有linux主机添加hosts解析
[root@mater01 ~]# vim /etc/hosts
192.168.100.180
192.168.100.181
本地windows电脑添加hosts添加解析
192.168.100.180
windows打开浏览器输⼊C:\windows\System32\drivers\etc
:30080 #nginx服务暴露的端⼝
或者直接在linux机器执⾏
[root@mater01~]# curl :30080
[root@mater01~]# curl :30443
#因为创建ingress-nginx-service暴露的是30080端⼝!
[root@mater01 ingress]# kubectl get svc -A|grep ingress-nginx
ingress-nginx ingress-nginx NodePort 10.103.42.166 <none> 80:30080/TCP,443:30443/TCP 44h
可以登录nginx-pod查看ngin-conf⽣成的规则,只要ingress已创建,直接映射进去了。

例⼦3(实战tomcat配置https证书)
#创建⾃签证书,然后把证书转换为secreat,加载到pod⾥⾯去!
创建证书
[root@node-001 ingress]# openssl genrsa -out tls.key 2048
Generating RSA private key, 2048 bit long modulus
................+++
..+++
e is 65537 (0x10001)
[root@node-001 ingress]# ls
deploy-demo.yaml ingress-myapp.yaml ingress-nginx ingress-tomcat.yaml service-nodeport.yaml tls.key tomcat-demo.yaml tomcat-pod.yaml
[root@node-001 ingress]#
[root@node-001 ingress]# openssl req -new -x509 -key tls.key -out tls.crt -subj
/C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=
[root@node-001 ingress]# ls
deploy-demo.yaml ingress-myapp.yaml ingress-nginx ingress-tomcat.yaml service-nodeport.yaml tls.crt tls.key tomcat-demo.yaml tomcat-pod.yaml
[root@node-001 ingress]#
#注意证书不能直接贴到nginx⾥⾯。

需要转换成特殊格式。

secreat,screat可以注⼊到k8s,被k8s引⽤。

[root@node-001 ingress]# kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key
secret/tomcat-ingress-secret created
查看⽬前的secret
[root@node-001 ingress]# kubectl get secret
NAME TYPE DATA AGE
default-token-xd2gw kubernetes.io/service-account-token 3 26d
tomcat-ingress-secret kubernetes.io/tls 2 18s #已经被创建。

查看tomcat的secret
[root@node-001 ingress]# kubectl describe secret tomcat-ingress-secret
Name: tomcat-ingress-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/tls
Data
====
tls.key: 1679 bytes
tls.crt: 1289 bytes
[root@node-001 ingress]#
把tls配置进去
[root@node-001 ingress]# kubectl explain ingress.spec.tls
[root@node-001 ingress]# cp ingress-tomcat.yaml ingress-tomcat-tls.yaml
[root@node-001 ingress]# vim ingress-tomcat-tls.yaml
apiVersion: extensions/v1beta1 #api版本
kind: Ingress #清单类型
metadata: #元数据
name: ingress-tomcat-tls #ingress的名称
namespace: default #所属名称空间,和要发布的service属于同⼀名称之中。

annotations: #注解信息,说明下⾯⽤到的是nginx不是其他的。

才能转换为ingress-contorller对应匹配的规则kubernetes.io/ingress.class: "nginx" #说明ingress-controller⽤的是nginx,这样才能⽣成匹配规则。

spec: #规格
tls:
- hosts:
- #把哪个主机做成tls。

secretName: tomcat-ingress-secret #通过命令查看: kubectl get secret
rules: #定义后端转发的规则
- host: #通过域名进⾏转发
http:
paths:
- path: #配置访问路径,如果通过url进⾏转发,需要修改;空默认为访问的路径为"/"
backend: #配置后端服务
serviceName: tomcat #后端service暴露的名字
servicePort: 8080 #后端service端⼝
应⽤tls
[root@node-001 ingress]# kubectl apply -f ingress-tomcat-tls.yaml
ingress.extensions/ingress-tomcat-tls created
查看ingress详细
[root@node-001 ingress]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
ingress-tomcat 10.103.231.49 80 80m
ingress-tomcat-tls 10.103.231.49 80, 443 40s
[root@node-001 ingress]# kubectl describe ingress
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 53s nginx-ingress-controller Ingress default/ingress-tomcat-tls
Normal UPDATE 49s nginx-ingress-controller Ingress default/ingress-tomcat-tls
进⼊ingress-nginx命名空间的pod,查看
[root@node-001 ingress]# kubectl exec -it -n ingress-nginx nginx-ingress-controller-568867bf56-q2pt2 -- /bin/sh
$ ls
fastcgi_params geoip lua mime.types modsecurity modules nginx.conf opentracing.json owasp-modsecurity-crs template $ cat nginx.conf
xxxxxx
server {
server_name ;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
# PEM sha: c8b9956633fbec541a874a74ff309f8477b4d0f4
ssl_certificate /etc/ingress-controller/ssl/default-fake-certificate.pem;
ssl_certificate_key /etc/ingress-controller/ssl/default-fake-certificate.pem;
xxxxxx
打开浏览器访问试下
igress实验到此结束!。

相关文档
最新文档