一,暴露方法 1、hostNetwork:true 在pod中使用该配置,在这种Pod中运行的应用程序可以直接看到pod启动的主机的网络接口。 2、hostPort:直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过主机的IP来访问Pod了。 3、NodePort:是K8s里一个广泛应用的服务暴露方式。K8s中的service默认情况都是使用Cluster IP这种类型,会产生一个只能在内部访问的Cluster IP,如果想能够直接访问service,需要将service type修改为nodePort。同时给改service指定一个nodeport值(30000-32767), 4、LoadBalancer:只能在service上定义,是公有云提供的负载均衡器。 5、Ingress:ingress controller是由K8s管理的负载均衡容器,它的镜像包含一个nginx或HAProxy负载均衡器和一个控制器守护进程。 二,ingress部署 0. 概念: 通常情况下,Service 和 Pod 的 IP 仅可在集群内部访问, Ingress 就是为进入集群的请求提供路由规则的集合,ingress处于多个服务的前端,相当于智能路由或者集群入口。它允许你基于路径或者子域名来路由流量到后端服务。 ingress 控制器类型: Google Cloud Load Balance, Nginx , Contour , Istio等。 ingress 控制器插件: cert-manager 方法:如果想要应用这些规则,集群管理员需要部署一个ingress Controller,它监听Ingress和Service的变化,并根据规则配置负载均衡并提供访问入口。 1. 功能: 定义规则来允许进入集群的请求被转发到集群中对应服务上,从来实现服务暴漏。把集群内 Service 配置成外网能够访问的 URL。 2. ingress组成 1). Nginx 反向代理负载均衡器 2). Ingress Controller 跟 Kubernetes API 交互,实时获取后端 Service、Pod 等的变化,结合 Ingress 定义的规则生成配置, 更新上边的 Nginx 负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。 3). Ingress 定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。 可以通过 Yaml 文件定义,给一个或多个 Service 定义一个或多个 Ingress 规则。 3. 步骤 a. 创建ingress 控制器 ingress-nginx wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/mandatory.yaml wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.26.2/deploy/static/provider/baremetal/service-nodeport.yaml docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2 [下载比较慢,我的是国外服务器提前下载] docker save quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2 > nginx-ingress-controller.tar 传到k8s集群服务器 docker load < nginx-ingress-controller.tar docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2 192.168.89.132:5000/nginx-ingress-controller:0.26.2 docker push 192.168.89.132:5000/nginx-ingress-controller:0.26.2 vim mandatory.yaml image: 192.168.89.132:5000/nginx-ingress-controller:0.26.2 # 只需要修改image位置 kubectl create -f mandatory.yaml namespace/ingress-nginx 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 created deployment.apps/nginx-ingress-controller created limitrange/ingress-nginx created kubectl create -f service-nodeport.yaml service/ingress-nginx created kubectl describe svc ingress-nginx -n ingress-nginx Name: ingress-nginx Namespace: ingress-nginx Labels: app.kubernetes.io/name=ingress-nginx app.kubernetes.io/part-of=ingress-nginx Annotations: <none> Selector: app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx Type: NodePort IP: 169.169.129.128 Port: http 80/TCP TargetPort: 80/TCP NodePort: http 63867/TCP Endpoints: 10.1.70.6:80 Port: https 443/TCP TargetPort: 443/TCP NodePort: https 2609/TCP Endpoints: 10.1.70.6:443 Session Affinity: None External Traffic Policy: Cluster Events: <none> b. 验证ingress-nginx kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx --watch POD_NAMESPACE=ingress-nginx POD_NAME=$(kubectl get pods -n $POD_NAMESPACE -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}') kubectl exec -it $POD_NAME -n $POD_NAMESPACE -- /nginx-ingress-controller --version ------------------------------------------------------------------------------- NGINX Ingress controller Release: 0.26.2 Build: git-bde101c57 Repository: https://github.com/aledbf/ingress-nginx nginx version: openresty/1.15.8.2 ------------------------------------------------------------------------------- c. 创建tomcat.yaml vim tomcat.yaml apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-app spec: replicas: 2 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: '192.168.89.132:5000/tomcat:v3' ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: tomcat-http spec: ports: - port: 8080 targetPort: 8080 type: LoadBalancer selector: app: tomcat kubectl create -f tomcat.yaml deployment.apps/tomcat-app created service/tomcat-http created d. 部署Ingress vim ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-web annotations: # 指定 Ingress Controller 的类型 kubernetes.io/ingress.class: "nginx" # 指定我们的 rules 的 path 可以使用正则表达式 nginx.ingress.kubernetes.io/use-regex: "true" # 连接超时时间,默认为 5s nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" # 后端服务器回转数据超时时间,默认为 60s nginx.ingress.kubernetes.io/proxy-send-timeout: "600" # 后端服务器响应超时时间,默认为 60s nginx.ingress.kubernetes.io/proxy-read-timeout: "600" # 客户端上传文件,最大大小,默认为 20m nginx.ingress.kubernetes.io/proxy-body-size: "10m" # URL 重写 nginx.ingress.kubernetes.io/rewrite-target: / spec: # 路由规则 rules: # 主机名,只能是域名,修改为你自己的 - host: k8s.web.com http: paths: - path: backend: # 后台部署的 Service Name,与上面部署的 Tomcat 对应 serviceName: tomcat-http # 后台部署的 Service Port,与上面部署的 Tomcat 对应 servicePort: 8080 create -f ingress.yaml ingress.networking.k8s.io/nginx-web created kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-app 3/3 3 3 23h tomcat-app 2/2 2 2 9m17s kubectl get ingress NAME HOSTS ADDRESS PORTS AGE nginx-web k8s.web.com 169.169.129.128 80 2m8s kubectl get pods -n ingress-nginx -o wide [nginx-ingress代理地址] NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ingress-controller-6d96ccd6f4-g2d6b 1/1 Running 0 62m 10.1.70.6 192.168.89.133 <none> <none> e. 设置switchhosts,将192.168.89.133 k8s.web.com加入到本地dns服务域名解析中 dnsserver: k8s.web.com 是 web.com的子域名,所以只需要添加前缀配置即可 vim /var/named/web.com.zone # 结尾追加 k8s A 192.168.89.133 systemctl restart named nslookup k8s.web.com Server: 192.168.89.128 Address: 192.168.89.128#53 Name: k8s.web.com Address: 192.168.89.133 能够解析到,说明本地dns添加解析成功。 f. 测试访问 访问不到,有问题,后期排错
云计算之kubernetes服务暴露——ingress
最新推荐文章于 2024-04-15 10:29:57 发布