Kubernetes-Ingress資源詳解

什麼是Ingresshtml

#阿里雲稱之爲ingress路由!在 Kubernetes 集羣中,主要用於接入外部請求到k8s內部,Ingress是受權入站鏈接到達集羣服務的規則集合,爲您提供七層負載均衡能力。您能夠給 Ingress 配置提供外部可訪問的 URL、負載均衡、SSL、基於名稱的虛擬主機等。git地址:https://github.com/kubernetes/Ingress-nginx前端

 

Service缺點java

#定義service之後,尤爲是NodePort集羣訪問,須要通過2級轉換調度,並且是4層調度,不管是iptables仍是ipvs。4調度自身沒法實現卸載https會話。node

#ingress----k8s還有一種引入集羣外部流量的方式,叫ingress。基於7層調度器。利用7層pod,將外部流量引入到內部。linux

 

回顧-Service:nginx

工做三種方式模型: userspace(效率低、各類空間轉換) iptables、ipvs(1.11版以後,部署時須要額外配置先關參數)git

Service集羣類型:github

ClusterIP(集羣內部通訊),chrome

NodePort(集羣內外互通,工做邏輯:client-->nodeip:nodeport-->clusterip:serviceip--->podiip:containerport),能夠在前面加個nginx,代理後端各個nodeport的時候,壓力獲得釋放。docker

LoadBalancer

ExternerName

 

Ingress支持的調度方式

一、url路徑映射調度: location /aa ; location /bb。能夠參考nginx。

二、主機調度:l例如server aaa; server bbb

 

Ingress類型:一、url映射 二、虛擬主機

 

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

實現原理:

一、正常是用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路由實現!

二、ingress須要建一個前端接入層,前端有多是虛擬主機nginx配置的server,或者是location url映射,同時也要定義一個後端upstream-server。 upstream有幾個主機。經過service來獲取的。

三、ingress有個特色:做爲資源來說,直接經過編輯注入到nginx-ingress-controller,並保存爲nginx的配置文件。並且ingress一旦發現service 後端的pods改變,ingress直接注入更新nginx配置文件,並且須要重載配置文件(traefik支持自動重載)。

 

實現ingress步驟(7層調度):

一、第一步:部署一個nginx-ingress-controller-pod。部署一個特殊pod。

二、第二部:給nginx-ingress-controller-pod建立前端service1。用來接入外部請求!

三、建立nginx-ingress-controller-pod後端service2,以及service關聯的pods。

四、建立ingress、自動實現路由規則,自動實現service2自動注入到nginx-ingress-controller-pod規則(nginx.conf)

五、總結就是首先部署外部請求<------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大步驟!

一、建立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

github地址:https://github.com/kubernetes/ingress-nginx/

#第一步:建立名稱空間

#yum install git -y

https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/namespace.yaml

或者直接用命令建立:#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。 新版本貌似沒有這個文件

[root@node-001 ingress-nginx]# git clone https://github.com/kubernetes/ingress-nginx.git

#把git文件先下載個備份保存一下。

######################################################################################################

 

下載nginx-ingress-controller相關的yaml清單(不行,手動下載)

[root@k8s-master ~]# mkdir ingress-nginx [root@k8s-master ~]# cd ingress-nginx/ [root@k8s-master ingress-nginx]# for file in namespace.yaml configmap.yaml rbac.yaml with-rbac.yaml ;do wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/$file;done

#會有幾個下載不了,有可能版本不匹配。注意這邊是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字段共享節點網絡。

 

二、建立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直接安裝

https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/mandatory.yaml

 

三、建立nginx-ingress-controller-pod前面一層service(否則ingrss-controller無法接入外部請求流量)

核心原理:就是把nginx-ingress-controller-pod,這個特殊pod前面再定義一個service,例如先後端分離,前端接口直接調用這個service實現後端接口訪問,這步驟很關鍵!

#部署Service:ingress-controller(nginx)前端的service,確保外部能夠訪問

 

下載清單文件

#wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/baremetal/service-nodeport.yaml

手動建立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路由規則所有打通!

 

四、配置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: myapp.dayu.com 使用第一種,虛擬主機來作!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 myapp.dayu.com 80 46s

 

查看ingress信息

[root@node-001 ingress]# kubectl get ingress -A

NAMESPACE NAME HOSTS ADDRESS PORTS AGE

default ingress-myapp myapp.dayu.com 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.dayu.com #主機名

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":"myapp.dayu.com","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 myapp.dayu.com

192.168.100.181 myapp.dayu.com

 

瀏覽器chrome瀏覽器輸入myapp.dayu.com:30080 或者http://myapp.dayu.com:30080/hostname.html

實驗到此成功結束!


 

 例子2(實戰tomcat)

每一個node拉取鏡像

[root@node-001 ingress]# docker pull tomcat:8.5.34-jre8-alpine

#dockerhub.com下載容器:hub.docker.com

 

建立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: tomcat.dayu.com #經過域名進行轉發

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 tomcat.dayu.com 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 myapp.dayu.com 10.103.42.166 80 20m

 

k8s節點全部linux主機添加hosts解析

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

192.168.100.180 tomcat.dayu.com

192.168.100.181 tomcat.dayu.com

 

本地windows電腦添加hosts添加解析

192.168.100.180 myapp.dayu.com tomcat.dayu.com

 

windows打開瀏覽器輸入C:\windows\System32\drivers\etc

tomcat.dayu.com:30080 #nginx服務暴露的端口

 

或者直接在linux機器執行

[root@mater01~]# curl tomcat.dayu.com:30080

[root@mater01~]# curl tomcat.dayu.com: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=tomcat.dayu.com

[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:

- tomcat.dayu.com #把哪一個主機作成tls。

secretName: tomcat-ingress-secret #經過命令查看: kubectl get secret

rules: #定義後端轉發的規則

- host: tomcat.dayu.com #經過域名進行轉發

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 tomcat.dayu.com 10.103.231.49 80 80m

ingress-tomcat-tls tomcat.dayu.com 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 tomcat.dayu.com ;

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

 

打開瀏覽器訪問試下

https://tomcat.dayu.com:30443/ nginx映射的端口

igress實驗到此結束!


 

原文出處:https://www.cnblogs.com/yangtian/p/12273204.html

相關文章
相關標籤/搜索