标签:需要 nta 抽象 nod 开发 stat rest 公司 代理服务器
一、Ingress 及 Ingress Controller 简介Ingress简单的理解: 原先暴露的service,现在给定个统一的访问入口。
Ingress 是 k8s 资源对象,用于对外暴露服务,该资源对象定义了不同主机名(域名)及 URL 和对应后端 Service(k8s Service)的绑定,根据不同的路径路由 http 和 https 流量。而 Ingress Contoller 是一个 pod 服务,封装了一个 web 前端负载均衡器,同时在其基础上实现了动态感知 Ingress 并根据 Ingress 的定义动态生成 前端 web 负载均衡器的配置文件,比如 Nginx Ingress Controller 本质上就是一个 Nginx,只不过它能根据 Ingress 资源的定义动态生成 Nginx 的配置文件,然后动态 Reload。个人觉得 Ingress Controller 的重大作用是将前端负载均衡器和 Kubernetes 完美地结合了起来,一方面在云、容器平台下方便配置的管理,另一方面实现了集群统一的流量入口,而不是像 nodePort 那样给集群打多个孔。
所以,总的来说要使用 Ingress,得先部署 Ingress Controller 实体(相当于前端 Nginx),然后再创建 Ingress (相当于 Nginx 配置的 k8s 资源体现),Ingress Controller 部署好后会动态检测 Ingress 的创建情况生成相应配置。Ingress Controller 的实现有很多种:有基于 Nginx 的,也有基于 HAProxy的,还有基于 OpenResty 的 Kong Ingress Controller 等,更多 Controller 见:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/,本文使用基于 Nginx 的 Ingress Controller:ingress-nginx。
ingress contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。
而这个ingress规则写明了哪个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。
然后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效。以此来达到域名分配置及动态更新的效果。
如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作.
配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式
[root@master ingress]# vim deploy_1.yaml
apiVersion: v1
kind: Namespace
metadata:
name: bdqn-ns
labels:
name: bdqn-ns
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd-deploy
namespace: bdqn-ns
spec:
replicas: 2
template:
metadata:
labels:
app: bdqn-ns
spec:
containers:
- name: httpd
image: httpd
---
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
namespace: bdqn-ns
spec:
type: NodePort
selector:
app: bdqn-ns
ports:
- name: http-port
port: 80
targetPort: 80
nodePort: 31033
[root@master ingress]# kubectl apply -f deploy_1.yaml
[root@master ingress]# kubectl get svc -n bdqn-ns
[root@master ingress]# kubectl get pod -n bdqn-ns
[root@master ingress]# vim deploy_2.yaml
apiVersion: v1
kind: Namespace
metadata:
name: bdqn-ns
labels:
name: bdqn-ns
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd-deploy
namespace: bdqn-ns
spec:
replicas: 2
template:
metadata:
labels:
app: bdqn-ns
spec:
apiVersion: v1
kind: Namespace
metadata:
name: bdqn-ns
labels:
name: bdqn-ns
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: bdqn-ns
spec:
replicas: 2
template:
metadata:
labels:
app: bdqn-tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.5.45
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
namespace: bdqn-ns
spec:
type: NodePort
selector:
app: bdqn-tomcat
ports:
- name: tomcat-port
port: 8080
targetPort: 8080
nodePort: 32033
[root@master ingress]# kubectl apply -f deploy_2.yaml
[root@master ingress]# kubectl get pod -n bdqn-ns
[root@master ingress]# kubectl get svc -n bdqn-ns
(1)Ingress controller:
将新加入的Ingress转化为反向代理服务器的配置文件,并使之生效。
(2)Ingress :
Ingress:将反向代理服务器的配置抽象成一个Ingress对象,每添加一个新的服务,只需要写一个新的Ingress的yaml文件即可。
? 需要解决了两个问题:
? 1、动态的配置服务。
? 2、减少不必要的暴露端口。
? 基于nginx的ingress controller根据不同的开发公司,又分为两种:
? 1、k8s社区版的: Ingerss - nginx.
? 2、nginx公司自己开发的: nginx- ingress .
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml
[root@master ingress]# vim mandatory.yaml
hostNetwork: true #213
---------如果ingress-controller镜像下载不成功,可以直接使用下边的镜像。
docker pull registry.cn-hangzhou.aliyuncs.com/ilanni/nginx-ingress-controller:0.22.0
需要注意的是,如果使用上述镜像,需要将deployment资源指定的镜像名称进行修改。
修改的是madatory.yaml文件里的deployment资源。
在deployment资源中,如果添加了此字段,意味着Pod中运行的应用可以直接使用node节点的端口,这样node节 点主机所在网络的其他主机,就可以通过访问该端口访问此应用。(类似于docker映射到宿主机 上的端口。)
[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# kubectl get pod -n ingress-nginx
[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# vim mandatory-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
type: NodePort
ports:
- name: httpd
port: 80
targetPort: 80
- name: https
port: 443
selector:
app: ingress-nginx
执行一下
[root@master ingress]# kubectl apply -f mandatory-svc.yaml
查看一下
[root@master ingress]# kubectl get svc -n ingress-nginx
ingress :
ingress-nginx-controller: 动态感知ingress 资源的变化
ingress: 创建svc5ingress-nginx-contr011er 关联的规则
[root@master yaml]# vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: bdqn-ingress
namespace: bdqn-ns
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules: #规则
- host: ingress.bdqn.com #域名
http:
paths:
- path: /
backend:
serviceName: httpd-svc #关联service
servicePort: 80 #关联service的映射端口
- path: /tomcat
backend:
serviceName: tomcat-svc #关联service
servicePort: 8080 #关联service的映射端口
[root@master yaml]# kubectl apply -f ingress.yaml
[root@master yaml]# kubectl get pod -n ingress-nginx -o wide
[root@master yaml]# kubectl get ingresses. -n bdqn-ns
[root@master yaml]# kubectl describe ingresses. -n bdqn-ns
[root@master yaml]# kubectl exec -it -n ingress-nginx nginx-ingress-controller-5954d475b6-24k92 /bin/sh
/etc/nginx $ cat nginx.conf
复制上面的网址
[root@master yaml]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/provider/baremetal/service-nodeport.yaml
//下载文件到master节点
[root@master yaml]# kubectl apply -f service-nodeport.yaml
[root@master yaml]# kubectl get service -n ingress-nginx
Service -Nodeport:因为ingress - nginx - controller运行在了集群内的其中一个节点,为了保证即使这个节点宕机,我们对应的域名仍然能够正常访问服务,所以我们将ingress -nginx- controller也暴露为一个service资源。
? 创建一个deploymen资源,基于nginx镜像,repolicas:2个.然后创建一个service资源关联这个deployment资源。最后创建一个ingress资源,将上述svc关联到ingress.bdqn.com/nginx 目录下。
[root@master yaml]# vim lianxi.yaml
apiVersion: v1
kind: Namespace
metadata:
name: xgp-666
labels:
name: xgp-666
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: xgp
namespace: xgp-666
spec:
replicas: 2
template:
metadata:
labels:
app: xgp-nginx
spec:
containers:
- name: xgp-nginx
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: xgp-svc
namespace: xgp-666
spec:
type: NodePort
selector:
app: xgp-nginx
ports:
- name: xgp-port
port: 80
targetPort: 80
nodePort: 30000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: xgp-ingress
namespace: xgp-666
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: ingress.xgp.com
http:
paths:
- path: /
backend:
serviceName: xgp-svc
servicePort: 80
[root@master yaml]# kubectl apply -f lianxi.yaml
[root@master yaml]# kubectl describe ingresses. -n xgp-666
标签:需要 nta 抽象 nod 开发 stat rest 公司 代理服务器
原文地址:https://blog.51cto.com/14320361/2472808