k8s部署IngressController
ingress概念
Ingress: Service的统一网关入口
.
ingress工作原理
参考: https://www.toutiao.com/a6939101056643203587/?log_from=8fbeb3d56fe36_1646033531592
k8s部署IngressController
下载ingress-nginx资源清单
项目地址: https://kubernetes.github.io/ingress-nginx/deploy/#quick-start
如果不是云主机,请下载裸金属配置
: https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters
# 下载ingress-nginx资源清单
wget https://ghproxy.com/https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/baremetal/deploy.yaml
编辑ingress-nginx资源清单(裸金属配置不用修改)
!!!注意
: nodePort
大小写敏感
在services
中添加http
和httpt
的NodePort
,默认是随机端口
type
修改为NodePort
http
的端口修改为30080
https
的端口修改为30443
修改ingress默认端口
参考: https://blog.youkuaiyun.com/catoop/article/details/121447317
如果ingress
已经部署好,就使用下面的方法进行修改
# 编辑nginx-ingress-controller
kubectl edit daemonset nginx-ingress-controller -n ingress-nginx
编辑nginx-ingress-controller
的yaml资源清单
containers:
- args:
- /nginx-ingress-controller
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --annotations-prefix=nginx.ingress.kubernetes.io
# 增加以下两个参数参数(一个是http端口,一个是https端口)
- --http-port=80
- --https-port=443
删除原来的nginx-ingress-controlle
r这个 pod,k8s重建pod后端口会生效.
apply后查看ingress
# apply这个ingress资源清单
kubectl apply -f deploy.yaml
# 查看ingress
kubectl get ingress -A
# 查看ingress详情
kubectl desrice ingress ing名
修改ingress-nginx的网络模式
为hostNetwork
开启hostNetwork
后可以直接使用域名访问,不需要加端口
,性能也更好.
控制器类型必需使用DaemonSet
,否则pod
暴露的host
端口会冲突
参考: https://blog.youkuaiyun.com/weixin_41535316/article/details/121873795
修改下载好的ingress-nginx
资源清单文件中的网路配置为hostNetwork
# 将Deployment修改为DaemonSet
apiVersion: apps/v1
#kind: Deployment
kind: DaemonSet #这里把Deployment改成DaemonSet
metadata:
# 在DaemonSet的下方的容器选择中添加一行
spec:
dnsPolicy: ClusterFirst
hostNetwork: true #这里加一句,开启hostNetwork
containers:
- name: controller
# 修改NodePort为ClusterIP(非必须)
# type: NodePort
type: ClusterIP
pathType路径类型
-
Exact
:精确匹配 URL 路径,且区分大小写。 -
Prefix
:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
ingress如果要访问路径
,在path
要填写//
路径,注意是两
个/
;
如果访问的是根路径
,1
个/
就好
ingress暴露的两种方式
NodePort
hostnetwork
k8s发布一个应用
1. 创建deployment
# 创建一个deployment
kubectl create deployment edu --image=nginx
2. 为deployment创建services
# 创建一个svc
kubectl expose deployment edu --port=80 --target-port=80
3. 为services创建ingress
# 通过命令行创建yaml
kubectl create ingress edu --rule=web.edu.cn/=edu:80 --dry-run=client -o yaml > ing.yaml
ingress-yaml资源清单示例
!!!注意
: k8s1.22及以上版本的ingress必须
声明控制器
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: edu
annotations:
# 指定下ingress控制器,不然域名访问不了
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: web.edu.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: edu
port:
number: 80
通过命令行创建ingress(命令创建的域名无法访问,未解决)
访问/目录
时要填写两个//
## 访问/目录时要填写两个//
kubectl create ingress edu --rule=web.edu.cn//=edu:80
4. apply这个ingress
# apply这个ingress
kubectl apply -f ing.yaml
# 查看ingress
kubectl get ingress
5. 验证这个ingress
本地修改hosts绑定对应域名
!!!注意:
<Ingress Controler Pod所在Node IP
> 域名
# 查看Ingress Controler Pod所在node
kubectl get po -A -owide|grep ingress-nginx-controller
# # 查看Ingress Controler Pod所在node
kubectl get pods,svc -owide -n ingress-nginx
ingress配置规则https
参考: 将 HTTPS 负载平衡中的多个 SSL 证书与 Ingress 搭配使用
创建证书文件(自签名)
https://blog.youkuaiyun.com/omaidb/article/details/121188674
# 创建key
openssl genrsa -out qftest.com.tls.key 2048
# 创建crt
openssl req new -x509 -key tls.key -out tls.crt -subj
/C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=myapp.tls-ingress.com
# 将key和crt文件合并成pem证书文件
#cat my_site.pem ca_chain.pem my_site.key > combined_cert.pem
# 将证书保存到Secret
kubectl create secret tls 证书名 --cert=tls.crt --key=tls.key
创建https的ingress规则
# 将证书保存到Secret
kubectl create secret tls 证书名 --cert=tls.crt --key=tls.key
# 创建https的ingress规则
## 访问/目录时要填写两个//
kubectl create ingress edu --rule=web.edu.cn//=edu:80,tls=证书名secret --dry-run=client -o yaml > https-ing.yaml
ingress-yaml资源清单示例
!!!注意
: k8s1.22及以上版本的ingress必须
声明控制器
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: edu
annotations:
# 指定下ingress控制器,不然域名访问不了
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- host: web.edu.cn
secretName: 证书名 # 这里填写secret中对应的证书名
rules:
- host: web.edu.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: edu
port:
number: 443
部署backend应用
通常在 Ingress 控制器中会配置 defaultBackend
(默认后端),以服务于任何不符合规约中 path 的请求.
参考:
k8s-doc配置默认后端
查看ing详情时会提示: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
这是没有部署默认backend应用.
创建ingress报错
参考: https://blog.youkuaiyun.com/qq_39218530/article/details/115372879
错误提示如下:
Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.kube-system.svc:443/networking/v1beta1/ingresses? timeout=10s: dial tcp 10.0.0.5:8443: connect: connection refused
解决办法
参考办法: https://stackoverflow.com/questions/61616203/nginx-ingress-controller-failed-calling-webhook
# 使用下面的命令查看 webhook
kubectl get validatingwebhookconfigurations
# 打印ingress-nginx-admission
# 删除ingress-nginx-admission
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
# 再创建ingress就不报错了
ingress没有adress,域名访问404
参考: 解决 Kubernetes NGINX Ingress Controller v1.0.0-Yamasa of the World 的 404 错误问题
老版本
的ingress可以域名访问,且有address
,新版本
的ingress访问404
且没有adress
发生错误的版本: controller-v1.1.2
解决办法: 声明ingressClass(指定ingress控制器)
必须声明ingressClass
(指定ingress控制器)
# 创建ingress时声明IngressClass就会有address,也不会404
annotations:
kubernetes.io/ingress.class: "nginx"