Kubernetes部署Ingress

Ingress基本概念

通俗来讲,ingress和Service、Deployment,也是一个k8s的资源类型,ingress用于实现用域名的方式访问k8s内部应用。

通过用户访问的 URL,把请求转发给不同的后端 Service。这种全局的,为了代理不同后端Service而设置的负载均衡服务,就是Kubernetes里的Ingress服务。

client  >  负载均衡(nginx) > ingress  > service >  pod     (客户请求至负载均衡,负载均衡在到达ingress,ingress分发至不同server,server分配至pod)

1、部署ingress-nginx

获取配置文件:https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/mandatory.yaml

这边下载失败,直接拷贝内容自己创建mandatory.yaml。

查看一下文件需要下载一个镜像,镜像比较大,就在一台node上面直接执行下载。

在两个node上直接下载镜像:docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0

以上操作完成,在k8s执行:

kubectl apply -f mandatory.yaml

执行完成查看:kubectl get pod -n ingress-nginx

然后将ingress暴露出去:vim  service-nodeport.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 32080  #http
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 32443  #https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx

查看暴露出去的ingress服务:kubectl get svc -n ingress-nginx

2、创建一个server及后端deployment(以nginx为例)

vim  svc-deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
###注释:定义pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
####注释:添加server
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80

查看创建的pod

查看创建的server

 测试通过svc访问pod,nginx副本数三个,修改的html文件访问时现实顺序。

然后将nginx加入ingress中,我们定义的名字为myapp,创建时候需要用到myapp名字。

vim ingress.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-test
spec:
  rules:
    - host: www.test.com
      http:
        paths:
        - path: /
          backend:
            serviceName: myapp
            servicePort: 80
###注释
host:添加一个域名,测试时候通过域名访问
serviceName:将svc添加至ingress中

创建kubectl   apply -f   ingress.yaml

查看是否创建:kubectl get ingress

查看ingrss对外80暴露的端口是32080

kubectl get svc -n ingress-nginx

上面我们给ingress的yaml文件中设置了一个域名:www.test.com  我们通过外部windowns访问时就需要修改win的hosts文件

修改路径:C:\Windows\System32\drivers\etc\hosts

添加域名,及k8s服务器的ip地址。

然后测试访问,看是否通过域名可以访问。

ingress中添加的域名地址为:www.test.com ,ingress的80对外端口是32080,我们通过域名加端口进行访问测试,看是否能访问成功,访问成功是否是轮询访问三台nginx。

 

 

 

 

由此可见通过ingress访问server,server在分发至pod访问成功。

 

 

 

ingress扩展

项目中有的需要https访问时就需要添加证书进行访问,以下就是ingress添加https

首先测试环境,手动生成一个简单的证书用于测试。

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

#通过kubectl的secret将证书封装,定义一个名称(tls-secret)将其封装进去
kubectl create secret tls tls-secret --key tls.key --cert tls.crt 

 创建完成执行封装

创建一个deployment,svc用于实验还是用nginx镜像

vim  svc-deployment     (跟之前一样deployment,svc是不变的,主要是在ingress里面添加封装的证书)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-ser
spec:
  selector:
    app: myapp
  ports:
  - name: http
    port: 80
    targetPort: 80

kubectl apply -f svc-deployment.yaml

查看是否创建deployment,及svc

 创建ingress:vim  ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-https
spec:
  tls:
    - hosts:
      - www.min.com                       #证书添加域名  
      secretName: tls-secret             #指定封装的证书
  rules:
    - host: www.min.com                 #指定域名
      http:
        paths:
        - path: /
          backend:
            serviceName: myapp-ser        #指定server的名称调用server
            servicePort: 80

创建完成进行查看

域名访问需要在本地添加hosts    地址:C:\Windows\System32\drivers\etc\hosts

查看ingress的443对外端口:kubectl get svc -n ingress-nginx

输入地址测试:https://www.min.com:32443,是否是以https进行访问

 

 

由此可见配置ingress的https访问测试成功。

 

ingress的nginx地址重写扩展

 

在上面(配置ingress的https)中我们使用的是https访问(https://www.min.com:32443)。为了测试创建一个svc,及deployment,然后通过ingress进行重定向至https网站

创建一个www.max.com网站,重定向至:https://www.min.com:32443

vim  svc-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-rewrite
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp1
  template:
    metadata:
      labels:
        app: myapp1
    spec:
      containers:
      - name: myapp1
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-rewrite-ser
spec:
  selector:
    app: myapp1
  ports:
  - name: http1
    port: 80
    targetPort: 80

创建完成查看

 然后创建ingress,进行重定向

vim  ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-inge-wir
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: https://www.min.com:32443
spec:
  rules:
  - host: www.max.com    #对外提供网站
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-rewrite-ser
          servicePort: 80

#访问www.max.com,然后重新定向至https的www.min.com网站上去。

 创建完成查看

还是需要在本地的win系统内hosts添加一个www.max.com的域名

已经添加hosts,我们访问www.max.com:32080,看是否能跳转至https://www.min.com:32443

 

 

 

ingress的重定向已经完成并且成功。

ingress还提供了很多功能,可以在官网一一查看学习(Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/)

 

posted @ 2021-11-16 16:53  點燈的人  阅读(538)  评论(1编辑  收藏  举报