K8S原来如此简单(四)Service+Ingress
上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问
Service
service为一组pod提供一个统一的入口,实现负载,也可实现外部访问。
原理
在Kubernetes集群的每个Node上都会运行一个kube-proxy服务进程,kube-proxy会通过我们定义的service,自动生成iptables规则,这样就能将到某个Service的访问请求转发到后端的多个Pod实例上。
Service类型
ClusterIP
通过集群的内部 IP 暴露服务,选择该模式时服务只能够在集群内部访问。 这也是默认的 ServiceType。
文章图片
NodePort
通过每个节点上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
文章图片
LoadBalancer
使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
Service的Cluster IP与NodePort等概念是kube-proxy服务通过iptables 的NAT转换实现的。kube-proxy在运行过程中动态创建与Service相关的 iptables规则,这些规则实现了将访问服务(Cluster IP或NodePort)的请 求负载分发到后端Pod的功能。
文章图片
文章图片
kubeadm方式修改ipvs模式:
kubeadm方式修改ipvs模式: kubectl edit configmap kube-proxy -n kube-system... mode: “ipvs“ ...
定义Service 创建一个ClusterIP的service
apiVersion: v1 kind: Service metadata: name: chesterservice namespace: chesterns spec: selector: app: chesterapi ports: - protocol: TCP port: 5000 targetPort: 5000
部署service,并通过service访问oneapi
kubectl apply -f service.yaml kubectl get service -n chesterns kubectl describe service chesterservice -n chesterns curl clusterip:5000/test
clusterip模式的service不能通过外网访问,我们来定义一个nodeport模式的service,实现外部访问
apiVersion: v1 kind: Service metadata: name: chesterservice namespace: chesterns spec: type: NodePort selector: app: chesterapi ports: - protocol: TCP port: 5000 targetPort: 5000 nodePort: 30111
kubectl delete -f service.yaml kubectl apply -f service.yaml kubectl get service -n chesterns kubectl describe service chesterservice -n chesterns curl nodeip:30111/test
服务发现 k8s通过两种方式实现服务的发现
环境变量 当 Pod 运行在 Node 上,kubelet 会为每个活跃的 Service 添加一组环境变量
{SVCNAME}_SERVICE_HOST
{SVCNAME}_SERVICE_PORT
通过以下命令即可看到
kubectl get pod -n chesternskubectl exec chesterdeployment-6d89bc6b45-c5vbv-n chesterns -- env
DNS CoreDNS 是一种灵活的,可扩展的 DNS 服务器,可以 安装为集群内的 Pod 提供 DNS 服务。
文章图片
ClusterIP A记录格式:
.
示例:
my-svc.my-namespace.svc.cluster.local
Ingress NodePort存在端口不足,只支持4层负载(IP:Port)不支持7层网络负载的缺点。Ingress为了弥补这些缺点而生。
对于基于HTTP的服务来说,不同的URL地址经常对应到不同的后端服务或者虚拟服务器(Virtual Host),这些应用层的转发机制仅通过Kubernetes的Service机制是无法实现的。
使用Ingress进行负载分发时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样会跳过kube-proxy的转发功能,kube-proxy不再起作用。如果Ingress Controller提供的是对外服务,则实际上实现的是边缘路由器的功能。
文章图片
【K8S原来如此简单(四)Service+Ingress】
Ingress Nginx Ingress nginx是我们常用的一种ingress controller,他的原理是监听Ingress资源,把用户定义的Ingress转移成Nginx的配置信息
核心代码如下
文章图片
安装Ingress Nginx 通过以下链接下载yaml文件:
https://kubernetes.github.io/ingress-nginx/deploy/
创建Ingress Controller
kubectl apply -f nginx-ingress.yamlkubectl get pods --namespace=ingress-nginx
创建Ingress
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: chesteringress namespace: chesterns annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: chester.k8s.com http: paths: - pathType: Prefix path: "/test" backend: service: name: chesterservice port: number: 5000
部署
kubectl apply -f ingress.yaml
查看nginx配置信息,判断ingress是否生效
kubectl cp ingress-nginx-controller-58fccdc57c-gzkns:/etc/nginx/nginx.conf /tmp/nginx.conf -n ingress-nginx
cat /tmp/nginx.conf
配置hosts
kubectl get pods --namespace=ingress-nginx -o widevi /etc/hosts (ingress-nginx-controller的集群ip) chester.k8s.com
测试访问
curl chester.k8s.com/test/
为Ingress配置https
配置HTTPS步骤:
- 准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)
- 将证书文件保存到Secret
kubectl create secret tls chestertlssecret -- cert=chester.k8s.com.pem --key=chester.k8s.com-key.pem
- Ingress规则配置tls
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: chesteringress spec: tls: - hosts: - chester.k8s.com secretName: chestertlssecret rules: - host: chester.k8s.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80
推荐阅读
- python读取excel画折线图_python读取excel数据绘制简单曲线图的完整步骤记录
- 动态规划|AcWing 271. 杨老师的照相排列(简单DP)+ 十一届蓝桥杯B组试题E--矩阵
- 《LeetCode算法全集》|?算法入门?《二分枚举》简单13 —— LeetCode 1351. 统计有序矩阵中的负数
- 数据库|Oracle12cWindows安装、介绍及简单使用(图文)
- 剑指offer|剑指 Offer 03. 数组中重复的数字(简单)
- C++|基于QT实现简单的TCP通信
- 大白话|图解 K8S(06)(调度利器之污点与容忍度(压力驱逐))
- 图解|图解 K8S(07)(调度利器之亲和与反亲和(服务容灾))
- k8s学习笔记一(搭建&部署helloworld应用)
- vuejs 类gannt图,支持左右、上下虚拟列表,性能还能用,demo简单,做个记录