作者: 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. memcached 测试代码

    转载请注明来源:https://www.cnblogs.com/hookjc/ #include<stdio.h> #include <iostream> #include & ...

  2. 在CentOS中安装与配置Server JRE 8

    感谢大佬:https://my.oschina.net/zx0211/blog/508221?p=1 其实也很简单: 1.从http://www.oracle.com/technetwork/java ...

  3. spring property标签中的 ref属性和ref 标签有什么不同

    spring的配置文件可能会有多个<property name="a" ref="b" />就是找当前配置文件里的bean 也就是b <ref ...

  4. 给 zsh 自定义命令添加参数自动补全

    有时我会自定义一些 zsh 命令,以便提升某些高频操作的效率.本文记录我给一个自定义命令添加参数自动补全的方法. 场景 我自定义了一个 zsh 命令 gmt,执行 gmt <b2>,可以将 ...

  5. PHP面试笔试宝典

    PHP面试笔试宝典 来自<PHP程序员面试笔试宝典>,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书. PHP题目 一.单例模式是在应用程序中最多 ...

  6. PHP7.x环境下安装redis扩展

    注:以下介绍的安装方式为PHP的安装路径为/usr/local/php,如果你的服务器上PHP的安装目录不一致请按实际情况处理. 首先下载PHP7的redis扩展 wget https://githu ...

  7. 3D 世界的钥匙「GitHub 热点速览 v.22.08」

    有没有想过把身边的物件儿转成 3D 动画,在网页上实现一把?本期特推的项目 Three.js 就是帮你创建 3D 页面的知名开源项目,好玩的 3D 世界在向你招手.除了打开浏览器 3D 世界的钥匙外, ...

  8. python的标识符&&关键字

    和Java语言一样,python也有标识符和关键字.那么,你是否知道python的关键字呢?一起先从标识符了解python吧. 什么是标识符? 标识符,开发人员在开发过程中自定义的一些符号和名称. 标 ...

  9. 用图帮你了解https的原理

    Http存在的问题 上过网的朋友都知道,网络是非常不安全的.尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵.还有大家平时喜欢用的万能钥匙,等等.那我们平时上网可能会存在哪些风险呢? 泄密, ...

  10. 【C# .Net GC】延迟模式 latencyMode 通过API-GC调优

    延迟模式 lowlatency 使用环境:后台工作方式只影响第 2 代中的垃圾回收:第 0 代和第 1 代中的垃圾回收始终是非并发的,因为它们完成的速度很快.GC模式是针对进程配置的,进程运行期间不能 ...