作者: LemonNan

原文地址: https://juejin.im/post/6863704173931593736

Service

Kubernetes 的 Service 可以为一组具有相同功能的容器应用(Pod)提供一个统一的入口地址, 然后将请求负载的分发到后端的各个容器组(Pod)上, 本篇将对 Kubernetes 的 Service 的使用做个简单介绍.

操作的基础

最近的文章都是基于 minikube 进行的操作, 所以时不时的需要进入到 minikube 里面进行一些操作的验证, 所以把进入 minikube 的操作记录在这.

# minikube 默认用户名:docker 密码:tcuser , 我的地址是 192.168.99.100
ssh docker@192.168.99.100

发布服务类型

说到服务, 自然是需要对外提供的, Kubernetes 中有几种不同的服务类型, ClusterIP, NodePort, LoadBalancer, 不同的服务类型对应的不同的系统结构及访问方式, 所以在介绍 Service 之前简单介绍一下它的服务类型.

ClusterIP

集群内部容器访问地址,会生成一个只能在集群内部访问的集群内部IP , 这也是 Service 默认的类型(也是本篇使用的类型).

NodePort

通过每个 Node(物理节点) 上的 IP 和静态端口(NodePort)向外暴露服务, 最终通过 {NodeIP : NodePort} 进行对应服务的访问.

LoadBalancer

使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务, 比如阿里云的 SLB。

创建 Service

配置文件 yaml

pod

由于要区分一些东西, 所以对系列一的 nginx.yaml 进行了一些修改, 最终结果如下:

# nginx.yaml
apiVersion: v1
kind: Pod # 创建的是Pod类型
metadata: # 元数据, 一些基础信息
name: pod-nginx # 名称
labels:
name: label-pod-nginx # 标签
spec:
containers:
- name: pod-nginx # 容器名称
image: nginx:latest # 使用的镜像
ports:
- containerPort: 80 # 容器监听的端口号

接着执行 kubectl create -f nginx.yaml 进行 pod 创建

service

接下来是 service 的yaml, service 需要设置管理的对应label, 才能将pod纳入管理范围, 最终配置文件如下:

# service.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: default # 命名空间,不填默认为 default
labels:
name: label-svc-nginx # service 的标签
annotations:
name: anno-nginx
spec:
selector:
name : label-pod-nginx # 管理具有 nginx 标签的 Pod
type: ClusterIP # 不填默认 ClusterIP, 用于集群内部 Pod 访问, 在 Node 上 kube-proxy 通过设置的规则进行转发
# clusterIP: 172.18.0.1 # 虚拟IP, type = ClusterIP 时, 可以不指定,不指定系统自动分发;
# type=LoadBalancer 时, 必须指定
sessionAffinity: ClientIP # 是否支持 session, 默认为空, 可选 ClientIP, 表示将同一个客户端(根据客户端IP决定)请求到一个 Pod 上
ports:
- name: p80 # 端口名称
protocol: TCP # 协议
port: 8080 # service 对外暴露的端口
targetPort: 80 # 后端 Pod 端口
# nodePort: 80 # 当上面的 type = NodePort 的时候, 指定宿主主机的端口
# status: # 当 type=LoadBalancer 的时候, 设置外部负载均衡的信息, 比如阿里云的 SLB
# loadBalancer:
# ingress:
# ip: xxx # 外部负载均衡地址
# hostname: xxx # 名称

接着执行 kubectl create -f service.yaml 进行 svc 创建

访问服务

现在测试一下, pod 和 svc 是不是已经关联上.

先分别拿到它们的 ip

pod的ip为: 172.17.0.6
svc的ip为: 10.110.146.133

先测试pod是否正常

curl 172.17.0.6

能正常访问到

接着试下访问 svc, 也能正常访问

# 这里是8080, service 的 yaml 里面设置的端口
curl 10.110.146.133:8080

快速创建

Kubernetes 除了通过 yaml 文件来进行 service 的创建, 还提供了一种更加快速的创建方法 kubectl expose.

kubectl expose 的意思是将资源暴露为新的 Kubernetes Service 以创建新的 Service, 所需端口号不指定的话将从 Pod 中复制而来.

下面试试它的功能

# 根据名字为 pod-nginx 的 pod 创建 svc
kubectl expose pod pod-nginx --port=9090 --target-port=80 --name=svc-expose-nginx

创建成功, 拿到它的 ip, 进入到 minikube 里面进行测试

在 minikube 里面进行 curl 测试, 能访问后端的 nginx 服务, 证明关联成功了

外部服务 Service

有时候, 业务系统需要将一个外部数据库作为后端进行连接, 或者将另一个集群或 Namespace 中的服务作为 Service, 下面是具体操作步骤:

  • 创建无 Label Selector 的 Service
  • 创建一个和 Service 同名的 Endpoint, 用于指向世纪的后端访问地址

创建无 Label Selector 的 Service

yaml 文件内容

# 无 label service
apiVersion: v1
kind: Service
metadata:
name: custiom-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80

创建 Endpoint

yaml 文件内容

apiVersion: v1
kind: Endpoints
metadata:
name: custiom-service # 名字跟 service 相同
subsets:
- addresses:
- ip: 14.215.177.xx # 某度地址
ports:
- port: 80

这两个都创建了之后, 外部系统访问这个 Service 的 80 端口, 请求将会被路由到外部的 14.215.177.xx 地址.

实际操作结果

创建 svc 后获取到它的ip: 10.107.234.212

进入到 minikube 执行命令进行查看

curl 10.107.234.212

结果很多, 选了一个比较象征性的某度关键字截图, 到此 通过 svc 访问外部服务 也成功了.

最后

本篇介绍了 Kubernetes 向外部暴露服务的方法以及几种创建 Service 的方式, 看着似乎是一路畅通无阻就搞定了, 但是别忘了 Kubernetes 是一个全自动化应用部署平台, 根据上面情况, 如果后端 Pod 宕机了, 并且此时对应的服务只由一个 Pod 提供, 则此时服务对外是不可用的, 并且不会做到开启新的 Pod 来继续提供服务, 无法恢复可用, 完全体现不出来自动化运维的特点.

so, 这也是下一篇将要介绍的 Deployment, 它能监控到对应服务下面有多少个应用(Pod)可用, 并且可以保证可用 Pod 的数量及水平扩容等其它很多的功能.

Kubernetes系列(二)Service的更多相关文章

  1. kubernetes系列08—service资源详解

    本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...

  2. Kubernetes系列二: 使用kubeadm安装k8s环境

    环境 三台主机,一台master,两台node 作为master 作为node节点 作为node节点 每台主机Centos版本使用 CentOS Linux release 7.6.1810 (Cor ...

  3. 【Kubernetes 系列二】从虚拟机讲到 Kubernetes 架构

    目录 什么是虚拟机? 什么是容器? Docker Kubernetes 架构 Kubernetes 对象 基础设施抽象 在认识 Kubernetes 之前,我们需了解下容器,在了解容器之前,我们得先知 ...

  4. Kubernetes系列(五) Ingress

    作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...

  5. Kubernetes系列(四) StatefulSet

    作者: LemonNan 原文地址: https://juejin.im/post/6870071267438329869 Kubernetes系列(四) StatefulSet Kubernetes ...

  6. Kubernetes系列(三) Deployment

    作者: LemonNan 原文地址: https://juejin.im/post/6865672466939150349/ Kubernetes 系列 Kubernetes系列(一) Pod Kub ...

  7. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  8. Kubernetes系列之理解K8s Service的几种模式

    今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...

  9. 从0到1使用Kubernetes系列(二):安装工具介绍

    该系列第一篇为:<从0到1使用Kubernetes系列--Kubernetes入门>.本文是Kubernetes系列的第二篇,将介绍使用Kubeadm+Ansible搭建Kubernete ...

随机推荐

  1. Ubuntu好用的文本编辑器-SciTE Text Editor

    Ubuntu下除了gedit之外,还可以使用SciTE编辑器,非常方便,安装 sudo apt install scite 不过刚刚装好在中文环境下还是不能够用的,因为会有中文乱码,还有很多设置也不符 ...

  2. 无脑安装——Python 及 安装python集成开发环境pycharm

    无脑安装--Python 及安装python集成开发环境pycharm 1.真机安装python 2.安装python集成开发环境pycharm Python 是一种解释型语言 Python 是面向对 ...

  3. 用Java模拟实现对系统文件以目录的拷贝功能

    要用Java对单个文件拷贝的话,其实思路很简单,循环读取被拷贝文件,放入byte数组,然后写入目标文件.当然我们也可以借助现有的类去完成,如InputStream中的transferTo()方法就可以 ...

  4. Involuting Bunny! (2021.8)

      CF1555F & Submission.   Tags:「A.生成树」「B.Tricks」   分类处理询问的 trick:连接两个连通块的边显然合法,先用这些边构建生成森林.发现每条边 ...

  5. Solution -「CF 917D」Stranger Trees

    \(\mathcal{Description}\)   Link.   给定一棵包含 \(n\) 个点的有标号树,求与这棵树重合恰好 \(0,1,\cdots,n-1\) 条边的树的个数,对 \(10 ...

  6. CentOS8系统上Zookeeper安装启动

    下载Zookeeper安装包,下载地址为:https://zookeeper.apache.org/releases.html.注意选择bin的gz包,否则安装不成功,提示找不到相应的类. 一.单机模 ...

  7. Linux 内存分析工具的命令大全介绍

    在Linux系统经常被用作服务器系统.当服务器内存吃紧的时候,free命令是我们最常使用的内存分析工具. free使用介绍# free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存, ...

  8. 使用Flask开发简单接口

    作为测试人员,在工作或者学习的过程中,有时会没有可以调用的现成的接口,导致我们的代码没法调试跑通的情况. 这时,我们使用python中的web框架Flask就可以很方便的编写简单的接口,用于调用或调试 ...

  9. 微服务从代码到k8s部署应有尽有系列(七、支付服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  10. 国内主流大数据厂商太多不知道怎么选?Smartbi满足你的需求

    ​目前的BI市场上有很多大数据的厂商,这也让许多客户眼花缭乱,不知如何下手.比如国内的亿信华辰跟国外的Tableau,QLK, PowerBI 都有非常多便于分析的可视化工具,但是在数据处理分析的功能 ...