kubernetes学习笔记之七:Ingress-nginx部署使⽤
⼀、Ingress简介
在Kubernetes中,服务和Pod的IP地址仅可以在集⽹络内部使⽤,对于集外的应⽤是不可见的,为了使外部的应⽤能够访问集的服务,在Kubernetes⽬前提供了以下⼏种⽅案:
NodePort
LoadBalancer
Ingress
Ingress组成
ingress controller
将新加⼊的Ingress转化成Nginx的配置⽂件并使之⽣效
ingress服务
将Nginx的配置抽象成⼀个Ingress对象,每添加⼀个新的服务只需写⼀个新的Ingress的yaml⽂件即可
Ingress⼯作原理
1.ingress controller通过和kubernetes api交互,动态的去感知集中ingress规则变化,
2.然后读取它,按照⾃定义的规则,规则就是写明了哪个域名对应哪个service,⽣成⼀段nginx配置,
3.再写到nginx-ingress-control的pod⾥,这个Ingress controller的pod⾥运⾏着⼀个Nginx服务,控制器会把⽣成的nginx配置写
⼊到/f⽂件中,
4.然后reload⼀下配置⽣效。以此达到域名分配置和动态更新的问题。
Ingress可以解决什么问题
1.动态配置服务
如果按照传统⽅式,当新增加⼀个服务时,我们可能需要在流量⼊⼝加⼀个反向代理指向我们新的k8s服务,⽽如果⽤了Ingress,只需要配置好这个服务,当服务启动时,会⾃动注册到Ingress中,不需要以外的操作。
2.减少不必要的端⼝暴露
配置过k8s的都清楚,第⼀步是要关闭防⽕墙的,主要原因是k8s的很多服务会以NodePort⽅式映射出去,这样就相当于给宿主机打了很多孔,既不安全也不优雅,⽽Ingress可以避免这个问题,除了Ingress⾃⾝服务需要映射出去,其他服务都不要⽤NodePort ⽅式
⼆、部署配置Ingress
1. 部署⽂件介绍、准备
下载部署⽂件
提供了两种⽅式:
默认下载最新的yaml:
wget raw.githubusercontent/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
指定版本号下载对应的yaml
部署⽂件介绍
1.namespace.yaml
创建⼀个独⽴的命名空间 ingress-nginx
ConfigMap是存储通⽤的配置变量的,类似于配置⽂件,使⽤户可以将分布式系统中⽤于不同模块的环境变量统⼀到⼀个对象中管理;⽽它与配置⽂件的区别在于它是存在集的“环境”中的,并且⽀持K8S集中所有通⽤的操作调⽤⽅式。
从数据⾓度来看,ConfigMap的类型只是键值组,⽤于存储被Pod或者其他资源对象(如RC)访问的信息。这与secret的设计理念有异曲同⼯之妙,主要区别在于ConfigMap通常不⽤于存储敏感信息,⽽只存储简单的⽂本信息。
ConfigMap可以保存环境变量的属性,也可以保存配置⽂件。
创建pod时,对configmap进⾏绑定,pod内的应⽤可以直接引⽤ConfigMap的配置。相当于configmap为应⽤/运⾏环境封装配置。
pod使⽤ConfigMap,通常⽤于:设置环境变量的值、设置命令⾏参数、创建配置⽂件。
3.default-backend.yaml
如果外界访问的域名不存在的话,则默认转发到default-http-backend这个Service,其会直接返回404:
4.rbac.yaml
负责Ingress的RBAC授权的控制,其创建了Ingress⽤到的ServiceAccount、ClusterRole、Role、RoleBinding、ClusterRoleBinding
5.with-rbac.yaml
是Ingress的核⼼,⽤于创建ingress-controller。前⾯提到过,ingress-controller的作⽤是将新加⼊的Ingress进⾏转化为Nginx的配置
2.部署ingress
准备镜像,从这⾥mandatory.yaml查看需要哪些镜像
镜像名称版本下载地址
quay.io/kubernetes-ingress-controller/nginx-ingress-controller 0.20.0
registry-qingdao.aliyuncs/kubernetes_xingej/nginx-ingress-
controller
在每⼀个节点(Node)上下载镜像:
[root@k8s-node1 ~]# docker pull registry-qingdao.aliyuncs/kubernetes_xingej/defaultbackend-amd64:1.5 #注意版本号
nginx 配置文件Trying to pull repository registry-qingdao.aliyuncs/kubernetes_xingej/defaultbackend-amd64 ...
1.5: Pulling from registry-qingdao.aliyuncs/kubernetes_xingej/defaultbackend-amd64
26de8f6c1f4b: Pull complete
Digest: sha256:2cdff48ab9b20ca5f9b0ee48bf3c139c51d6fb1a152********bc371c121c238
Status: Downloaded newer image for registry-qingdao.aliyuncs/kubernetes_xingej/defaultbackend-amd64:1.5 [root@k8s-node1 ~]# docker pull registry-qingdao.aliyuncs/kubernetes_xingej/nginx-ingress-controller:0.20.0 #注意版本号
Trying to pull repository registry-qingdao.aliyuncs/kubernetes_xingej/nginx-ingress-controller ...
0.20.0: Pulling from registry-qingdao.aliyuncs/kubernetes_xingej/nginx-ingress-controller
8e41b996a802: Pull complete
f8e7d603ef88: Pull complete
610da4f3123f: Pull complete
62702a85e6c9: Pull complete
7cedf5b2083f: Pull complete
755f7fa719b6: Pull complete
6adbdd0c8aaf: Pull complete
2389d8b0d2a2: Pull complete
1ea794448393: Pull complete
bb0c388ee432: Pull complete
9626641c5a97: Pull complete
bd0bebb5ba38: Pull complete
Digest: sha256:3f06079f7727b2fb7ad5c97d8152eb622ae504674395dfa71fda7ce315aaaf30
Status: Downloaded newer image for registry-qingdao.aliyuncs/kubernetes_xingej/nginx-ingress-
controller:0.20.0
[root@k8s-node1 ~]# docker images #检查镜像是否下载成功
REPOSITORY TAG IMAGE ID CREATED SIZE registry-qingdao.aliyuncs/kubernetes_xingej/defaultbackend-amd64 1.5 d8f37b8cdaf4 2 weeks ago 5.13 MB
registry-qingdao.aliyuncs/kubernetes_xingej/nginx-ingress-controller 0.20.0 3cc332ecde4f 3 weeks ago 513 MB
97 MB
50.4 MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 9 months ago
44.6 MB
41 MB
42.2 MB
50.5 MB
docker.io/kubeguide/tomcat-app v1 a29e200a18e9 2 years ago 358 MB
下载yaml⽂件并更新mandatory.yaml中的镜像地址(master上)
修改service-nodeport.yaml⽂件,添加NodePort端⼝,默认为随机端⼝
[root@k8s-master ingress-nginx]# cat service-nodeport.yaml
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
部署nginx-ingress-controller
[root@k8s-master ingress-nginx]# kubectl apply -f mandatory.yaml
namespace "ingress-nginx" created
service "default-http-backend" created
configmap "nginx-configuration" created
configmap "tcp-services" created
configmap "udp-services" created
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" sions "nginx-ingress-controller" created
[root@k8s-master ingress-nginx]# kubectl apply -f service-nodeport.yaml
service "ingress-nginx" created
3.查看ingress-nginx组件状态
[root@k8s-master ingress-nginx]# kubectl get pods -n ingress-nginx #pod状态
NAME READY STATUS RESTARTS AGE
default-http-backend-66c4fbf5b4-x2n8w 1/1 Running 0 58s
nginx-ingress-controller-64bcff8657-5gdrd 1/1 Running 0 58s
[root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx #service状态及暴露端⼝
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-backend ClusterIP 10.96.87.65 <none> 80/TCP 1m
ingress-nginx NodePort 10.100.48.237 <none> 80:32080/TCP,443:32443/TCP 1m
4.访问ingress-nginx服务,查看是否配置成功
可以看到,提⽰404,这个因为当前ingress-nginx服务现在还没有后端服务,这是正常的
三、创建ingress-nginx后端服务
1.创建⼀个Service及后端Deployment(以nginx为例)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论