上一篇我们通过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记录格式:

<service-name>.<namespace-name>.svc.cluster.local

示例:

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提供的是对外服务,则实际上实现的是边缘路由器的功能。

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 wide

vi /etc/hosts
(ingress-nginx-controller的集群ip) chester.k8s.com

测试访问

curl chester.k8s.com/test/

为Ingress配置https

配置HTTPS步骤:

  1. 准备域名证书文件(来自:openssl/cfssl工具自签或者权威机构颁发)

  2. 将证书文件保存到Secret

kubectl create secret tls chestertlssecret -- cert=chester.k8s.com.pem --key=chester.k8s.com-key.pem
  1. 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
 

K8S原来如此简单(四)Service+Ingress的更多相关文章

  1. K8S原来如此简单(七)存储

    emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...

  2. K8S原来如此简单(八)ServiceAccount+RBAC

    ServiceAccount ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户. Service ...

  3. K8S原来如此简单(三)Pod+Deployment

    上篇我们已经安装好k8s1.23集群,现在我们开始使用k8s部署我们的项目 Pod Pod 是一组容器集合,是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元.这些容器共享存储.网 ...

  4. K8S原来如此简单(五)Metrics Server与HPA

    什么是HPA https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/ 我们前面有通过kubectl ...

  5. K8S原来如此简单(六)Pod调度

    我们前面部署的pod调度取决于kube-scheduler,它会根据自己的算法,集群的状态来选择合适的node部署我们的pod. 下面我们来看下如何来根据我们自己的要求,来影响pod的调度. 定向no ...

  6. ROS学习(十三)—— 编写简单的Service和Client (C++)

    一.编写Service节点 1.节点功能: 我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. 2. ...

  7. 【转帖】k8s之Deployment与service

    k8s之Deployment与service 2018年08月05日 18:11:00 xiyou_pen/pen 阅读数 5894   版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权 ...

  8. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  9. k8s Nodeport方式下service访问,iptables处理逻辑(转)

    原文 https://www.myf5.net/post/2330.htm k8s Nodeport方式下service访问,iptables处理逻辑 2017年07月11日 0条评论 976次阅读 ...

随机推荐

  1. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  2. Solution -「ABC 213H」Stroll

    \(\mathcal{Description}\)   Link.   给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式, ...

  3. 用 Python 简单生成 WAV 波形声音文件

    Python 简单生成 WAV 波形声音文件 让机器发出声响,本身就是一件充满魔法的事情.有没有想过,用一段简单的代码,生成一个最简单的声音呢?Python 这门脚本语言的库十分丰富,借助于其中的三个 ...

  4. 深入MySQL(一):MySQL的组织架构

    今天开始将自己所学过的MySQL的知识都尝试融会贯通,并且用写博客的方式记录分享下来. 今天讲的主题是MySQL的组织架构,对于学习一个中间件或者开源项目而言,我觉得最重要的便是先知晓其组织架构,以一 ...

  5. Spring MVC拦截器(Interceptor)使用

    第一篇Spring MVC的小作文就是关于Interceptor的,而不是很多基础的东西呢,很无奈.因为实践的项目中用到了,用地不太好,导致重复跳转页面浏览器cookie溢出了. 这个过程中呢就将与I ...

  6. 施耐德NOE77101后门漏洞分析

    固件下载地址: GitHub - ameng929/NOE77101_Firmware 文件目录结构,这里只列出了一些主要的文件信息: ├── bin ├── ftp ├── fw ├── rdt ├ ...

  7. ansible中的hostvars

    首先来看一个例子:假设我想得到主机IP为172.25.250.9的完全限定域名(FQDN),但是我无法登录该主机,那么就可以用本机里面的hostvars魔法变量(后面会分享我对魔法这个词的理解)这个字 ...

  8. java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】

    一.设计模式基本介绍(是什么.作用.优点) 1.软件设计模式是什么? 软件设计模式(Software Design Pattern),又称设计模式. 2.设计模式的作用 ★ 提高代码的可复用性.可维护 ...

  9. jemter参数化是如何取值的?(数据分配)

    参数化文件数据 脚本设置 ${__threadNum}是线程号,${n}是取值 测试结果 第一次 线程1取值:1,4,7,10,12 线程2取值:2,3,6,11,16 线程3取值:5,9,15,17 ...

  10. RENIX流量发送模式——网络测试仪实操

    信而泰的RENIX平台支持5种传输模式, 如下图所示. 模式一: continuous Continuous:连续发送流 持续发送方式是默认的发送模式,  它不会自动的停止, 会一直发送, 直到用户手 ...