k8s service的概念以及创建方法

Service 的功能:

  • Service主要用于提供网络服务,通过Service的定义,能够为客户端应用提供稳定的访问地址(域名或IP地址)和负载均衡功能,以及屏蔽后端Endpoint的变化,是K8s实现微服务的核心资源。

Service主要解决了什么问题:

  • 引入Service主要是解决Pod的动态变化,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。
  • 由于pod的不稳定性,比如水平扩展时,pod异常时生成新的pod,都会让pod拥有新的ip地址,这不利于前端的访问,所以需要把pod绑定到固定的IP(域名)上,所以Service就出现了。

本文主要介绍Service的创建方法,命令行模式和声明模式,

Service主要是为Pod提供统一访问入口的资源对象,所有需要先创建一个pod

  1. 创建Pod

    复制代码
     kubectl run nginx --image=nginx --port=80 --labels="app=nginx" 
  • kubectl run nginx : 创建一个名为nginx的pod
  • --image=nginx:使用nginx镜像文件
  • --port=80:声明服务的端口
  • --labels="app=nginx" :给pod打上标签
    note: 如果pod想要外部访问,必须打上标签
  1. 命令行模式创建service并绑定" app = nginx" 的pod

    复制代码
     kubectl expose pod nginx --port=80 --target-port=80  --type=NodePort
  • kubectl expose pod nginx : 创建一个svc,svc的名称就是nginx,自动选择nginx pod的标签
  • --port=80: svc的端口
  • --target-port=80:容器的端口
  • --type=NodePort:svc的类型,NodePort模式,会自动把svc的80端口映射到所有node主机的随机端口(端口范围:30000-32767),这样客户端可以通过任意node主机的IP + 端口访问到Pod。

svc的几种类型

类型 描述
ClusterIP 集群内部使用
NodePort 对外暴露应用端口(集群外可访问)
LoadBalancer 对外暴露应用,将Service映射到一个已存在的负载均衡器的IP地址上,适合公有云
ExternalName 将Service映射为一个外部域名地址,通过externalName字段进行设置

查看svc

复制代码
# kubectl get svc nginx -o wide
bash 复制代码
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
nginx   NodePort   10.105.125.73   <none>        80:30974/TCP   12m   app=nginx
  • CLUSTER-IP : Service地址(是一个不会变化的ip地址)
  • PORT(S): svc端口和node端口的映射
  • SELECTOR: 通过标签选择绑定哪些Pod

由于已经通过NodePort模式将svc的端口映射到了node主机的 30974 端口,即可以通过node的ip加端口访问到Pod的服务

  1. 通过yaml 文件声明式的创建svc

    编写yaml文件

    复制代码
     # cat nginx.yaml
    bash 复制代码
    apiVersion: v1			# api版本
    kind: Service			# 绑定资源类型,首字符必须大写
    metadata:				# metadata 元数据
     name: nginx-svc			# 定义 svc的名称
     labels:				# 下面是定义标签
      tier: frontend		
    spec:				# 规格
     ports:				# 定义端口,svc和pod
      - port: 80		# svc的端口
    	protocol: TCP		# 协议
        targetPort: 80		# 容器的端口
     selector:			# 标签选择
      app: nginx
     type: NodePort		# svc 类型

    创建svc(svc 是service的简写)

    查看那些资源对象存在简写: kubectl api-resources

    复制代码
     # kubectl create -f  nginx.yaml

    查看svc

    复制代码
     # kubectl get svc nginx-svc -o wide
    bash 复制代码
    NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
    nginx-svc   NodePort   10.107.55.165   <none>        80:32238/TCP   5m40s   app=nginx
  • -o wide : 显示更多信息

    svc nginx-svc的类型为 NodePort 同样可以通过 node的ip加端口访问到pod 里的容器服务。

Additional information:

可以使用命令行创建svc的使用使用 -o yaml输出yaml格式信息。

例如:

复制代码
kubectl expose pod nginx --port=80 --target-port=80  --type=NodePort --dry-run=client  -o yaml
bash 复制代码
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
status:
  loadBalancer: {}
  • --dry-run=client : 以客户端的模式运行(运行测试并不生效)
  • -o yaml:以yaml格式输出

--dry-run=client ,以客户端的方式尝试运行,配置 -o yaml 输出简略的信息
--dry-run=server ,以服务端的方式运行,配合-o yaml 输出非常详细的信息

复制代码
kubectl expose pod nginx --port=80 --target-port=80  --type=NodePort --dry-run=server -o yaml
bash 复制代码
Error from server (AlreadyExists): services "nginx" already exists
  • 在server模式下,由于 svc nginx 已经存在所以报错,删除svc nginx即可正常显示
相关推荐
牛奔3 小时前
Docker配置远程连接
运维·docker·云原生·容器·eureka
在未来等你4 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
my_styles4 小时前
docker-compose部署项目(springboot服务)以及基础环境(mysql、redis等)ruoyi-ry
spring boot·redis·后端·mysql·spring cloud·docker·容器
格桑阿sir6 小时前
Kubernetes控制平面组件:Kubelet详解(七):容器网络接口 CNI
kubernetes·k8s·kubelet·flannel·cni·calico·网络模型
天天爱吃肉82186 小时前
【低成本STM32的T-BOX开发实战:高可靠的车联网解决方案】
stm32·单片机·嵌入式硬件·云原生
Liudef067 小时前
使用Docker部署MongoDB
mongodb·docker·容器
庸子7 小时前
Serverless技术深度整合:从冷启动优化到边缘场景落地
云原生·架构·serverless
Will_11309 小时前
如何实现k8s高可用
运维·docker·容器
编程、小哥哥9 小时前
互联网大厂Java面试场景:从缓存到容器化的技术问答
redis·docker·微服务·kubernetes·spring security·java面试·gitlab ci
叶子爱分享10 小时前
浅谈无服务器WebSocket的优势
websocket·云原生·serverless