ToB企服应用市场:ToB评测及商务社交产业平台

标题: Kubernetes(k8s)Ingress原理 [打印本页]

作者: 自由的羽毛    时间: 2022-6-21 11:09
标题: Kubernetes(k8s)Ingress原理
目录

一、概述

Kubernetes 暴露服务的有三种方式,分别为 LoadBlancer Service、NodePort Service、Ingress。官网对 Ingress 的定义为管理对外服务到集群内服务之间规则的集合,通俗点讲就是它定义规则来允许进入集群的请求被转发到集群中对应服务上,从来实现服务暴漏。 Ingress 能把集群内 Service 配置成外网能够访问的 URL,流量负载均衡,终止SSL,提供基于域名访问的虚拟主机等等。
1)LoadBlancer Service

LoadBlancer Service 是 Kubernetes 结合云平台的组件,如国外 GCE、AWS、国内阿里云等等,使用它向使用的底层云平台申请创建负载均衡器来实现,有局限性,对于使用云平台的集群比较方便。
2)NodePort Service

NodePort Service 是通过在节点上暴漏端口,然后通过将端口映射到具体某个服务上来实现服务暴漏,比较直观方便,但是对于集群来说,随着 Service 的不断增加,需要的端口越来越多,很容易出现端口冲突,而且不容易管理。当然对于小规模的集群服务,还是比较不错的。
3)Ingress

Ingress 使用开源的反向代理负载均衡器来实现对外暴漏服务,比如 Nginx、Apache、Haproxy等。Nginx Ingress 一般有三个组件组成:

以上三者有机的协调配合起来,就可以完成 Kubernetes 集群服务的暴漏。

二、Ingress-nginx介绍

1)Ingress-nginx组成

2)Ingress-nginx工作流程

Ingress 的实现分为两个部分 Ingress Controller 和 Ingress .
截至目前,nginx-ingress 已经能够完成 7/4 层的代理功能(4 层代理基于 ConfigMap,感觉还有改进的空间);Nginx 的 7 层反向代理模式,可以简单用下图表示:

过程很简单,nginx 在整个过程中仿佛是一台根据域名进行请求转发的“路由器”,这也就是7层代理的整体工作流程了!
3)工作原理

对于 Nginx 反向代理做了什么,我们已经大概了解了。在 k8s 系统中,后端服务的变化是十分频繁的,单纯依靠人工来更新nginx 的配置文件几乎不可能,nginx-ingress 由此应运而生。Nginx-ingress 通过监视 k8s 的资源状态变化实现对 nginx 配置文件的自动更新,下面本文就来分析下其工作原理。

三、安装Ingress-nginx

1)官方介绍

ingress 官方网站
ingress 仓库地址
ingress-nginx v1.0 最新版本 v1.0
适用于 Kubernetes 版本 v1.19+ (包括 v1.19 )
Kubernetes-v1.22+ 需要使用 ingress-nginx>=1.0,因为networking.k8s.io/v1beta 已经移除
2)直接部署 ingress-nginx

直接部署比较简单,直接拉去 girhub 的文件就可以了,如果遇到长时间无响应,可以终止任务从新拉取。
拉取镜像
  1. $ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
复制代码
如果上面地址下载失败,可以使用我一下地址下载。如果使用官网的,可能需要换镜像地址,因为官网下载的镜像很大可能会失败。这里我使用的是下面的yaml文件创建ingress-controller
链接:https://pan.baidu.com/s/1fbqcy2bJMtmziJoXTbdK2g
提取码:8888
  1. # 修改镜像地址
  2. $ sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.0.0\(.*\)@willdockerhub/ingress-nginx-controller:v1.0.0@' deploy.yaml
  3. $ sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0\(.*\)$@hzde0128/kube-webhook-certgen:v1.0@' deploy.yaml
  4. $ kubectl apply -f deploy.yaml
复制代码
如果上面镜像还是下载失败,可以先下载镜像,地址如下:
链接:https://pan.baidu.com/s/1Rj5pDIGc3p3BjTU4PeIGFA
提取码:8888
下载完镜像,执行如下命令导入镜像:
  1. $ docker image load -i hzde0128-kube-webhook-certgen-v1.0.tar
  2. $ docker image load -i willdockerhub-ingress-nginx-controller-v1.0.0.tar
  3. $ docker images
复制代码
执行
  1. $ kubectl apply -f ingress-nginx.yaml
复制代码
检查安装
Completed 状态的是正常的,可以忽略。
  1. $ kubectl get pod -n ingress-nginx
  2. $ kubectl get svc -n ingress-nginx
  3. $ kubectl get svc -n ingress-nginx
复制代码

四、创建nginx应用

1)创建目录
  1. $ mkdir -p /opt/ingress/nginx-test
  2. $ cd /opt/ingress/nginx-test
复制代码
2)创建nginx-Deployment-Service.yaml文件,内容如下:
  1. $ cat << EOF > nginx-Deployment-Service.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment   
  4. metadata:            
  5.   name: nginx-deployment     
  6.   labels:      
  7.     app: nginx  
  8. spec:         
  9.   replicas: 2
  10.   selector:      
  11.     matchLabels:
  12.       app: nginx
  13.   minReadySeconds: 1
  14.   progressDeadlineSeconds: 60
  15.   revisionHistoryLimit: 2
  16.   strategy:
  17.     type: RollingUpdate
  18.     rollingUpdate:
  19.       maxSurge: 1
  20.       maxUnavailable: 1
  21.   template:        
  22.     metadata:  
  23.       labels:  
  24.         app: nginx
  25.     spec:         
  26.       containers:     
  27.       - name: nginx     
  28.         image: nginx:1.17.1   
  29.         imagePullPolicy: Always         
  30.         ports:
  31.         - containerPort: 80
  32.         resources:
  33.           requests:
  34.             memory: "1Gi"
  35.             cpu: "80m"
  36.           limits:
  37.             memory: "1Gi"
  38.             cpu: "80m"
  39. ---
  40. apiVersion: v1
  41. kind: Service
  42. metadata:      
  43.   name: nginx-service
  44.   labels:      
  45.     app: nginx
  46. spec:        
  47.   selector:   
  48.     app: nginx
  49.   ports:
  50.   - name: nginx-port
  51.     protocol: TCP      
  52.     port: 80  
  53.     targetPort: 80
  54.   type: ClusterIP
  55. EOF
复制代码
3)部署 nginx应用
  1. $ kubectl apply -f nginx-Deployment-Service.yaml
  2. $ kubectl get svc -o wide|grep nginx-service
  3. $ kubectl get pod -o wide|grep nginx-deployment-*
复制代码

4)创建 ingress yaml文件,内容如下:
  1. cat << EOF > nginx-Ingress.yaml
  2. apiVersion: networking.k8s.io/v1
  3. kind: Ingress
  4. metadata:
  5.   name: nginx
  6.   annotations:
  7.     kubernetes.io/ingress.class: "nginx"
  8. spec:
  9.   rules:
  10.   - host: ingress.nginx.com
  11.     http:
  12.       paths:
  13.       - path: "/"
  14.         pathType: Prefix
  15.         backend:
  16.           service:
  17.             name: nginx-service
  18.             port:
  19.               number: 80
  20. EOF
复制代码
创建
  1. $ kubectl apply -f nginx-Ingress.yaml
  2. $ kubectl get ingress|grep nginx
复制代码

5)在 hosts 文件最后追加 ingress 节点的 IP 地址
  1. $ kubectl get ingress|grep nginx
  2. $ cat /etc/hosts
  3. $ kubectl get svc -n ingress-nginx
复制代码

6)验证
  1. curl -I http://ingress.nginx.com:31473
复制代码

五、使用 hostNetwork 的方式部署 ingress-nginx

每次部署 ingres-nginx 都随机一个 nodePort ,而使用 ingres-nginx 访问的时候也要以 域名:端口 的形式去访问,如何直接使用域名去访问呢?下面介绍另外一种安装方式。
1)创建目录
  1. $ mkdir /opt/ingress/nginx-test/hostNetwork
  2. $ cd  /opt/ingress/nginx-test/hostNetwork
复制代码
2)copy 一份deploy.yaml
  1. $ cp /opt/ingress/deploy.yaml /opt/ingress/nginx-test/hostNetwork/
复制代码
3)优化 ingress-nginx

1、使用 hostNetwork
默认 ingress-nginx 随机提供 nodeport 端口,开启 hostNetwork 启用80、443端口。
修改 Deployment 下面的 spec
参数如下:
hostNetwork: true # 新增

2、修改负载均衡问题
把 kind: Deployment 改为 kind: DaemonSet 模式,这样每台 node 上都有 ingress-nginx-controller pod 副本。
参数如下:
kind: Deployment   # 注释
kind: DaemonSet     # 新增

3、修改 ingressClass 问题
如果不关心 ingressClass 或者很多没有 ingressClass 配置的 ingress 对象,
添加参数 ingress-controller --watch-ingress-without-class=true 。

4、部署检查 ingress
  1. $ kubectl apply -f deploy.yaml
复制代码

发现除了master节点,其它node节点都有一个副本。
在其它节点上查看node
  1. $ netstat  -pntl |grep :443
  2. $ netstat  -pntl |grep :80
复制代码

5、验证
  1. # 直接访问,不通过nodePort
  2. $ curl -I  http://ingress.nginx.com
  3. # 当然也可以通过nodePort访问
  4. $ curl -I  http://ingress.nginx.com:31827
复制代码

六、 基于HTTPS的Ingress-nginx

1)创建CA证书
  1. $ mkdir -p /opt/ingress/tls
  2. $ cd /opt/ingress/tls
  3. # 生成ca证书,参数可根据需求自定义
  4. $ openssl genrsa -out tls.key 2048
  5. $ openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Shanghai/L=Shanghai/O=DevOps/CN=ingress.nginx.com
复制代码
PS:CN必须为访问的域名相同
创建完成后,会在当前目录下生成证书密钥(tls.crt)和证书key(tls.key)文件:

2)secret简介

secret 用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。它把 Pod 想要访问的加密数据存放到 Etcd 中。然后用户就可以通过在 Pod 的容器里挂载 Volume 的方式或者 环境变量 的方式访问到这些 Secret 里保存的信息。
Secret 可分为四种类型:
Secret 示意图

3)创建 secret

上面了解了secret之后,就开始创建secret。自签证书生成后就可以用证书key和证书密钥创建 secret 了,这里为了方便,我用的是正规机构颁发的证书,如下所示:
  1. $ cd /opt/ingress
  2. $ ls tls/
复制代码

1、通过命令行创建secret:

kubectl create secret tls ${CERT_NAME} --key ${KEY_FILE} --cert ${CERT_FILE}
示例如下:
  1. $ kubectl create secret tls tls-secret --key tls/tls.key --cert tls/tls.crt
  2. $ kubectl get secret
复制代码

2、通过yarml文件创建secret

yaml文件模板
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: testsecret-tls
  5.   namespace: dashboard
  6. data:
  7.   tls.crt: base64 编码的 cert
  8.   tls.key: base64 编码的 key
  9. type: kubernetes.io/tls
复制代码
示例:
获取base64 编码的 cert和base64 编码的 key
  1. $ cd /opt/secret
  2. $ cat tls/tls.crt | base64 > tls/base64.tls.crt
  3. $ cat tls/tls.key | base64 > tls/base64.tls.key
复制代码
这种方式创建有问题,会有如下报错,后续再研究。

4)创建deployment,service,ingress资源

1)切到对应的目录下
  1. $ cd /opt/ingress
复制代码
2)创建命令空间
  1. $ cat << EOF > ingress-namespace.yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5.   name: ingress-test
  6. EOF
  7. $ kubectl apply -f ingress-namespace.yaml
复制代码
3)创建secret
  1. $ kubectl create secret tls tls-secret --key tls/tls.key --cert tls/tls.crt -n ingress-test
  2. $ kubectl get secret -n ingress-test
复制代码

4)创建deployment,service
  1. $ cat << EOF > create-deployment-service.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: web
  6.   namespace: ingress-test
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.      app: test-web
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: test-web
  16.     spec:
  17.       containers:
  18.       - name: nginx
  19.         image: nginx:1.17.1
  20. ---
  21. apiVersion: v1    #创建service,关联上述deployment
  22. kind: Service
  23. metadata:
  24.   name: web-svc
  25.   namespace: ingress-test
  26. spec:
  27.   selector:
  28.     app: test-web
  29.   ports:
  30.   - protocol: TCP
  31.     port: 80
  32.     targetPort: 80
  33. EOF
  34. $ kubectl apply -f create-deployment-service.yaml
复制代码
5)创建Ingress
  1. $ cat << EOF > test-ingress.yaml
  2. apiVersion: networking.k8s.io/v1  #创建ingress规则
  3. kind: Ingress
  4. metadata:
  5.   name: test-ingress
  6.   namespace: ingress-test
  7.   annotations:
  8.     kubernetes.io/ingress.class: "nginx"
  9. spec:
  10.   tls:          #为域名颁发证书
  11.     - hosts:
  12.       - ingress.nginx.com
  13.       secretName: tls-secret
  14.   rules:
  15.     - host: ingress.nginx.com
  16.       http:   #注意,此处字段为http,不支持https
  17.         paths:
  18.         - path: /index.html
  19.           pathType: Prefix
  20.           backend:
  21.             service:
  22.               name: web-svc
  23.               port:
  24.                 number: 80
  25. EOF
  26. $ kubectl apply -f test-ingress.yaml
  27. $ kubectl get service -n ingress-test
  28. $ kubectl describe ingress test-ingress -n ingress-test
复制代码

6)通过ingress代理的443端口访问nginx服务
因为我们没有搭建dns服务器,所以需要在hosts文件将新的域名进行绑定(地址可以绑定集群中任意一台node)
  1. $ kubectl get ingress -n ingress-test
复制代码

在hosts文件中绑定域名:
192.168.0.114 ingress.nginx.com

7)https验证
  1. # 查看ingress-nginx
  2. $ kubectl get svc -n ingress-nginx
  3. # 直接访问,-k:允许curl使用非安全的ssl连接并且传输数据(证书不受信)
  4. $ curl -I -k https://ingress.nginx.com/
  5. # 使用nodePort访问
  6. $ curl -I -k https://ingress.nginx.com/31125
复制代码

浏览器访问验证,https://ingress.nginx.com/

关于Kubernetes(k8s)Ingress的介绍就先到这里了,有疑问的小伙伴,欢迎给我留言哦~

来源:https://www.cnblogs.com/liugp/p/16380099.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4