kubernetes——发现pod并与之通信

介绍服务

kubernetes中服务是一种为一组相同功能的pod提供一个单一不变的接入点的资源。可以将一组提供相同服务的pod给定一个不变的接入资源。

创建服务

服务的后端可以不止有一个pod,服务连接所有的后端指定的pod,服务对后端的pod是负载均衡的。

服务是如何区分哪些pod属于服务,哪些pod不属于服务?

服务根据标签来选择pod。

也就是说,控制器根据标签控制pod,服务根据标签判断是否属于本服务。

通过yaml文件创建服务

apiVersion: v1
kind: Service
metadata:
  name: tservice
spec:
	#标签选择器
  selector:
    app: kubia-rc
  ports:
  #映射在主机上的端口
  - port: 80
	#容器内的端口
    targetPort: 8080

使用命令创建服务,并查看服务

#在该文件目录下执行,创建服务
kubectl create -f test.yaml
#查看服务
kubectl get svc
#或者
kubectl get service

刚才创建了一个服务,现在使用控制器创建一些pod,通过刚才创建的服务绑定

apiVersion: v1
kind: ReplicationController
metadata:
  name: kubia-rc
spec:   
  replicas: 3
  selector:
  	#监测的标签
    app: kubia-rc
  template:
    metadata:
      name: kubia-rc
      #控制器创建的pod携带的标签
      labels:
        app: kubia-rc
    spec:
      containers:
        - name: kubia-rc
          image: luksa/kubia
          ports:
            - containerPort: 8080
              protocol: TCP

这样pod就会和服务绑定,此时,服务并没有对外暴露,我们可以在节点中查看

#查看服务的ip
kubectl get services
#在使用minikube的情况下
minikube ssh
#进入到节点之后
curl -s http://ip地址:端口号

还可以在服务中指定多个端口

apiVersion: v1
kind: Service
metadata:
  name: tservice
spec:
  selector:
    app: kubia-rc
  ports:
  - port: 80
    targetPort: 8080
  - port: 8081
    targetPort: 8081

服务发现

创建服务之后,我们还要在其它pod中能够发现服务,并调用服务,这也是服务的一个作用。

通过环境变量发现服务

我们可以进入一个pod,在pod中查看环境变量来发现服务

#进入一个pod
kubectl exec -it podname bash

env

此时我们可以发现之前创建的服务的环境变量。

通过DNS发现服务

进入到pod中后,我们可以通过服务名称命名空间发现服务。

#例如服务名为kubia-rc
#进入到pod中
curl -s http://kubia-rc.default.svc.cluster.local

连接集群外部的服务

我们创建的服务,服务并不是和pod直接相连,而是通过服务和pod中间的endpoints层进行请求分发,我们既然想连接集群外部的服务,也就是说,将endpoints层的ip地址写外部的ip地址,这样请求分发时,就会分发到集群外部服务。

我们要创建没有节点选择器的服务,(如果有节点选择器,就会在本地集群中找目标pod)

apiVersion: v1
kind: Service
metadata:
  name: tend
spec:
  ports:
  - port: 8081

单独创建endpoints层

apiVersion: v1
kind: Endpoints
metadata:
  name: tend#注意,endpoints层的name要和service的name相同,否则不匹配
subsets:  
  - addresses:      #外部服务地址
      - ip: 150.158.178.239
    ports:      #端口号
      - port: 80

这样创建service和endpoints就会自动找到外部服务

#创建service和endpoints
kubectl create -f service.yaml
kubectl create -f endpoints.yaml
#端口暴露端口
minikube service tend

将服务暴露给外部服务

有几种方式可以在外部访问服务:

  • 使用NodePort,每个集群节点都会在节点上打开一个端口,将接收到的服务重定向到基础服务
  • 使用LoadBalance,有一个专用的负载均衡器,将流量重定向到节点端口。
  • Ingress资源,通过一个地址公开多个服务。

使用NodePort类型服务

创建NodePort服务

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: NodePorts
  selector:
  	#通过标签选择器确定pod
    app: myapps
  ports:
  - port: 80#映射出的端口
    targetPort: 8080#容器内的端口

#使用命令创建服务
kubectl create -f test.yaml
#暴露端口
minikube service myapp
#这时流量会自动转发到某一个pod

注意:我们使用NodePort类型时,当有流量访问时,会先到某一个节点,从某一个节点到服务控制器,进行流量转发。这就导致,如果客户端访问的某一个节点出现错误,就导致该请求不能正常响应


使用LoadBalance类型

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080

与上一个不同的是,在这种类型下,负载均衡会有一个独立的地址,不会因为某一个节点的失效,导致部分请求无响应。

通过Ingress暴露服务

首先确保ingress服务打开,
列出ingress类型的地址

kubectl get ingresses

我们还要在本地的DNS列表中增加一项,映射到ip地址
ingress工作机里

在地址栏中输入url,通过本地的DNS映射到ip地址,ip地址找到Ingress,从ingress中决定访问哪个服务,进入到服务之后,通过Endpoints决定进哪些pod,将请求发送给其中一个pod。

### Kubernetes 创建 Pod 的详细流程 #### 一、提交请求至 API Server 当用户通过 `kubectl` 提交了一个用于创建 Pod 的 YAML 文件时,该命令实际上会把文件中的配置发送给集群的入口——API Server。API Server 负责接收处理所有的 REST 请求,它会对传来的数据执行一系列的安全措施,比如身份验证和权限校验等操作来保障系统的安全性[^2]。 #### 二、资源对象存储于 Etcd 中 一旦上述安全检查顺利完成,API Server 不会立即着手构建新的 Pod 实体;相反地,其首要任务是将接收到的信息转换成一种内部使用的结构化形式(例如以 JSON 或者 YAML 表达的对象),随后将其持久化保存到键值数据库 Etcd 当中。这一步骤确保了即使发生意外情况也能恢复未完成的任务状态[^3]。 #### 三、调度器选取节点 紧接着,Scheduler 组件开始发挥作用。它依据预定策略挑选最合适的计算节点作为即将部署的目标位置,向选定目标发出指示以便后续工作能够顺利开展。值得注意的是,在此之前 Scheduler 已经从 Etcd 获取到了待分配的工作负载详情以及当前可用资源状况等相关情报[^1]。 #### 四、Kubelet 执行实际创建工作 随着指定主机被确认下来之后,位于各台机器上的代理服务 Kubelet 收到来自控制平面的通知消息后便开始了真正的行动:下载镜像、准备必要的环境变量设置等一系列前置条件满足以后,最终调用 Docker Daemon 来实例化具体的容器实体。此同时,为了保持管理端之间的沟通顺畅无阻,Kubelet 还需定期汇报最新进展直至整个生命周期结束为止[^4]。 #### 五、CNI 插件负责网络连接建立 对于那些涉及到跨宿主机通信需求的应用场景而言,则还需要额外借助 CNI (Container Network Interface) 类型插件的帮助才能达成目的。这类工具通常会在新成员加入集群之时自动为其分配 IP 地址以及其他必要参数从而使得各个组成部分之间可以相互识别访问[^5]。 ```bash # 使用 kubectl 命令查看 pod 状态变化过程 $ kubectl get pods -w ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值