1.24版本k8s集群配置Nginx-Ingress
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes 目前 提供了以下几种方案:2.nginx-ingress 组成3.nginx-ingress工作原理 ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,然后读取它,
一、Inginx-ingress介绍 简介
1.ingress简介
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes 目前 提供了以下几种方案:
- NodePort:最简单,用命令kubectl expose deployment [deply] --type=NodePort直接配置就可以
- LoadBalancer:详见https://blog.csdn.net/lic95/article/details/125076060
- Ingress:k8s推荐用nginx-ingress,下面详细介绍nginx-ingress
2.nginx-ingress 组成
- ingress controller:将新加入的Ingress转化成Nginx的配置文件并使之生效
- ingress服务:将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可
3.nginx-ingress工作原理
ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。
4.可以解决什么问题
- 动态配置服务
如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作. - 减少不必要的端口暴露
配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式
二、nginx-ingress部署配置
1.部署k8s集群
详见:https://blog.csdn.net/lic95/article/details/125044136
2.下载部署文件
mkdir -p nginx-ingress
cd nginx-ingress
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/cloud/deploy.yaml
# 因为里面的2个镜像在k8s.gcr.io上,需要科学上网才能正常下载,否则无法正常安装
k8s.gcr.io/ingress-nginx/controller:v1.2.0
k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
# 部署下载文件
[root@master01 nginx]# kubectl apply -f deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
3.查看部署状态
[root@master01 nginx-ingress]# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-lgxfr 0/1 Completed 0 83s
ingress-nginx-admission-patch-trwjg 0/1 Completed 1 83s
ingress-nginx-controller-686556747b-f65xn 1/1 Running 0 83s
[root@master01 nginx-ingress]#
三、部署测试应用echoserver
# 部署2副本echoserver
kubectl create deploy echoserver --image=cilium/echoserver --replicas=2
kubectl create deploy echoserver --image=e2eteam/echoserver --replicas=2
# 查看部署情况
[root@master01 nginx-ingress]# kubectl get pods
NAME READY STATUS RESTARTS AGE
echoserver-8585bfb456-bktdd 1/1 Running 0 39s
echoserver-8585bfb456-dpq9l 1/1 Running 0 39s
#创建服务
[root@master01 ~]# kubectl expose deployment echoserver --port=80
service/echoserver exposed
#查看services
[root@master01 nginx-ingress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echoserver ClusterIP 172.18.159.159 <none> 80/TCP 92s
kubernetes ClusterIP 172.18.0.1 <none> 443/TCP 8h
#查看服务,正常两个hostname随机显示
curl http://172.18.159.159
#.查看nginx-ingress服务,状态为pending,原因为未部署oadBalancer或者开启NodePort
[root@master01 nginx-ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 172.18.65.6 <pending> 80:32456/TCP,443:32350/TCP 12m
ingress-nginx-controller-admission ClusterIP 172.18.162.225 <none> 443/TCP 12m
四、NodePort模式在线测试
1.开启nginx-ingress NodePort端口
[root@master01 nginx-ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx
#修改LoadBalancer为NodePort,再次查看服务
[root@master01 nginx-ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 172.18.65.6 <none> 80:32217/TCP,443:30735/TCP 24m
ingress-nginx-controller-admission ClusterIP 172.18.162.225 <none> 443/TCP 24m
#测试NodePort映射端口
[root@AlmaLinux-BGP ~]# curl http://192.168.3.30:32217
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
2.配置ingress策略
#生成echoserver的配置文件ingress-echoserver-test.yaml
[root@master01 nginx-ingress]# cat ingress-echoserver-test.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-echoserver-test
spec:
rules:
- host: echoserver.test
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: echoserver
port:
number: 80
ingressClassName: nginx
#执行配置文件
[root@master01 nginx-ingress]# kubectl apply -f ingress-echoserver-test.yaml
ingress.networking.k8s.io/ingress-echoserver-test created
#查看ingress配置情况
[root@master01 nginx-ingress]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-echoserver-test nginx echoserver.test 172.18.65.6 80 20s
3.测试
#测试结果,OK
curl -H "Host: echoserver.test" http://192.168.3.30:32217
Hostname: echoserver-8585bfb456-f859x
五、LoadBalancer模式在线测试
1.修改NodePort为LoadBalancer,再次查看服务
[root@master01 nginx-ingress]# kubectl edit svc ingress-nginx-controller -n ingress-nginx
#修改为NodePort为LoadBalancer,再次查看服务
[root@master01 nginx-ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 172.18.65.6 <pending> 80:32217/TCP,443:30735/TCP 84m
ingress-nginx-controller-admission ClusterIP 172.18.162.225 <none> 443/TCP 84m
2.采用Layer2模式部署MetalLB负载均衡器
#部署MetalLB详见:https://blog.csdn.net/lic95/article/details/125076060
#查看部署结果
[root@master01 manifests]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 172.18.65.6 192.168.3.80 80:32217/TCP,443:30735/TCP 92m
ingress-nginx-controller-admission ClusterIP 172.18.162.225 <none> 443/TCP 92m
[root@master01 nginx-ingress]# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-echoserver-test nginx echoserver.test 192.168.3.80 80 64m
3.测试
#测试结果,OK
curl -H "Host: echoserver.test" http://192.168.3.80
Hostname: echoserver-8585bfb456-f859x
更多推荐
所有评论(0)