使用 Service NodePort 可以实现 IP:端口
对外访问,通过任意 Node 节点可访问对应的资源,这意味着每个端口只能使用一次,一个端口对应一个应用。
实际场景中,业务是通过域名访问的,根据不同的域名跳转到不同端口服务。
**ingress 和 Pod 的关系**
pod 和 ingress 通过 service 进行关联,ingress 作为统一入口,由 service 关联一组 Pod。
ingress 由两部分组成:
ingress controller 目前主要有两种:
基于 nginx 服务的 ingress controller 根据不同的开发公司,又分为 k8s 社区的 ingres-nginx 和 nginx 公司的 nginx-ingress。
# k8s社区提供的ingress
https://github.com/kubernetes/ingress-nginx
# nginx社区提供的ingress
https://github.com/nginxinc/kubernetes-ingress
#https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
#https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
因为 ingress-controller 的 pod 需要使用node 节点的 80/443端口,所以网络需要配置为 hostNetwork 模式。
sed -i '/nodeSelector:/i\ hostNetwork: true' mandatory.yaml
由于镜像在 quay.io,所有需要替换国内可以访问的镜像地址。
sed -i 's/quay.io/quay.mirrors.ustc.edu.cn/' mandatory.yaml
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
目前 ingress-controller 会被调度器分配到某一个节点,如果需要指定一台独立的 node 节点运行 ingress-controller,就需要 node 节点打标签。
# 获取节点标签
kubectl get nodes --show-labels
# 给指定的节点打标签
kubectl label nodes 节点\_IP nginx=nginx
调整 deployment 中节点选择器的标签
更新配置
kubectl apply -f mandatory.yaml
kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-56bcc7fc88-v6c8f 1/1 Running 0 77m
首先先创建一个 nginx 应用并且对外暴露端口(nodeport)
# 创建
kubectl create deployment web --image=nginx
# 检查
kubectl get pods
# 创建
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
# 检查
kubectl get svc
然后创建 nginx 规则:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: traffic-route
spec:
rules:
- host: example.ingressdemo.com
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 80
➜ ~ kubectl apply -f ingress-http.yaml
ingress.extensions/traffic-router created
➜ ~ kubectl get pods -n ingress-nginx -o wide
➜ ~ kubectl get ingress [-o yaml]
https://raw.githubusercontent.com/Simontage/k8s/main/ingress-nginx-demo/ingress-nginx-daemonset.yaml
官方原始文件使用的是 deployment,replicate 为 1,这样将会在某一台节点上启动对应的 nginx-ingress-controller pod。外部流量访问至该节点,由该节点负载分担至内部的 service。测试环境考虑防止单点故障,改为 DaemonSet 然后删掉 replicate ,配合亲和性部署在指定节点上启动 nginx-ingress-controller pod,确保有多个节点启动 nginx-ingress-controller pod,后续将这些节点加入到外部硬件负载均衡组实现高可用性。
1)添加 hostNetwork
true:添加该字段,暴露 nginx-ingress-controller pod 的服务端口(80)
2)添加亲和性属性
增加亲和性部署,有 custom/ingress-controller-ready 标签的节点才会部署该 DaemonSet
3)设置节点的 label
kubectl label nodes 节点\_IP custom/ingress-controller-ready=true
kubectl label nodes 节点\_IP custom/ingress-controller-ready=true
kubectl label nodes 节点\_IP custom/ingress-controller-ready=true
4) 修改 yaml 文件
https://www.jianshu.com/p/52889bc8571d
https://blog.csdn.net/weixin_44729138/article/details/105978555
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。