searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

k8s入门(2)

2023-12-22 01:56:10
28
0

k8s 架构

k8s

MasterNode包含3个程序,分别是:

  • ApiServer: 提供HTTP Rest接口,是集群中各种核心资源的CRUD的统一入口,是集群中各个组件交互的核心枢纽 集群资源配额的统一入口 提供了完备的集群安全机制
  • ControllerManager: 实时监控集群中如Service等各种资源的状态变化,不断尝试将它们的副本数量维持在一个期望的状态。
  • Scheduler: 负责调度功能,如:为Pod找到一个合适的宿主机器

WorkerNode包含两个组件, 分别是:

  • kubelet Node节点管理 Pod管理,同容器运行时交互下发容器的创建/关闭命令 容器健康状态检查
  • kube-proxy 通过为Service资源的ClusterIP生成iptable或ipvs规则,实现将K8S内部的服务暴露到集群外面去

概念

Pod

Pod 是一组紧密关联的容器集合,它们共享 IPC 和 Network namespace,是 Kubernetes 调度的基本单位。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod的实现基于共享网络和共享存储:

  • 共享网络:共享IP、Ports及MAC地址

    在POD的初始化中,会首先建立1个叫做Pause或info根容器。在这个根容器中,会被分配1个ip地址,mac地址和 ports端口。POD会继续根据要求创造若干个应用容器,每个应用容器都会作为子容器加入到根容器中,这些子容器就可以共享根容器的网络资源。

    pod
    共享网络

     

  • 共享存储:共享volumes K8S引入数据卷概念,使用数据卷进行持久化存储, Pod中的多个容器可以公用同一个卷进行读写, 不同Node里面的Pod也可以共用卷。

    pod
    共享存储

     

yaml例子,Pod1中创建了两个容器app1和app2,两个容器共享data卷和网络

apiVersion: v1
kind: Pod
metadata:
  name: Pod1
spec:
  containers:
    - name: app1
      image: centos
      command: ["./app1"]
      volumeMounts:
        - name: data
          mountPath: /data

    - name: app2
      image: centos
      command: ["./app2"]
      volumeMounts:
      - name: data
        mountPath: /data

  volumns:
    - name: data
      emptyDir: {}

Service

在 Kubernetes(通常简称为K8s)中,Pod 是有生命周期的,它们可以被创建和销毁,一旦被销毁生命就永远结束。通过ReplicationController 能够动态地创建和销毁 Pod,但 Pod 的 IP 地址不是稳定可依赖的。若其他应用依赖该 Pod,Pod 被删除重建后,因为 IP 变化的缘故其他应用无法访问该 Pod 上的服务。Service 是一种抽象,用于定义一组 Pod 的访问方式。Service 提供了一种稳定的网络终结点,使得其他应用或服务能够通过该终结点访问到一组运行在集群中的 Pod。

Service 允许其他应用或服务通过 Service 名称而不是具体的 Pod IP 地址来访问后端服务。这样,当 Pod 的 IP 地址发生变化时,不会影响其他服务的访问,因为它们只需要知道 Service 的名字。总体而言,Service 是 Kubernetes 中非常重要的概念,它提供了一种抽象层,简化了对底层 Pod 的访问和管理,使得应用和服务更容易地进行扩展和维护。

kind: Service  # 资源类型
apiVersion: v1  # 资源版本
metadata: # 元数据
  name: service # 资源名称
  namespace: dev # 命名空间
spec: # 描述
  selector: # 标签选择器,用于确定当前service代理哪些pod
    app: nginx
  type: # Service类型,指定service的访问方式
  clusterIP:  # 虚拟服务的ip地址
  sessionAffinity: # session亲和性,支持ClientIP、None两个选项
  ports: # 端口信息
    - protocol: TCP 
      port: 3017  # service端口
      targetPort: 5003 # pod端口
      nodePort: 31122 # 主机端口, 将Service通过指定的Node上的端口暴露给外部

Service类型

在Kubernetes中,Service有不同的类型,每种类型都用于不同的用例和场景。以下是Kubernetes中Service的主要类型:

  • ClusterIP:

这是默认的Service类型。它为Service创建一个稳定的虚拟IP地址,只能在集群内部访问。这种类型通常用于将服务暴露给集群内的其他服务或Pod。

apiVersion: v1
kind: Service
metadata:
  name: my-service  # Service的名称
spec:
  selector:
    app: my-app  # 选择具有标签'app: my-app'的Pod
  ports:
    - protocol: TCP
      port: 80  # Service的Cluster IP端口
      targetPort: 8080  # 将流量转发到Pod的端口8080
   
  • NodePort:

这种类型在ClusterIP的基础上,为Service在每个节点上绑定一个静态端口,使得可以通过节点的IP地址和该静态端口从集群外部访问Service。

apiVersion: v1
kind: Service
metadata:
  name: my-service  # Service的名称
spec:
  selector:
    app: my-app  # 选择具有标签'app: my-app'的Pod
  ports:
    - protocol: TCP
      port: 80  # Service的Cluster IP端口
      targetPort: 8080  # 将流量转发到Pod的端口8080
  type: NodePort  # 将Service的类型设置为NodePort,使其在每个节点上绑定一个静态端口
  • LoadBalancer:

这种类型在NodePort的基础上,通过云服务提供商(例如AWS、GCP、Azure)的负载均衡器创建外部可访问的IP地址。这样可以将服务公开给互联网或其他外部网络。

apiVersion: v1
kind: Service
metadata:
  name: my-service  # Service的名称
spec:
  selector:
    app: my-app  # 选择具有标签'app: my-app'的Pod
  ports:
    - protocol: TCP
      port: 80  # Service的Cluster IP端口
      targetPort: 8080  # 将流量转发到Pod的端口8080
  type: LoadBalancer  # 将Service的类型设置为LoadBalancer,通过云服务提供商创建外部可访问的IP地址

  • ExternalName:

这种类型允许Service通过DNS CNAME记录映射到外部服务的名称。它通常用于将Kubernetes内的服务与集群外的服务集成。

apiVersion: v1
kind: Service
metadata:
  name: my-service  # Service的名称
spec:
  type: ExternalName  # 将Service的类型设置为ExternalName
  externalName: external-service.example.com  # 使用外部服务的名称
0条评论
0 / 1000
t****n
6文章数
0粉丝数
t****n
6 文章 | 0 粉丝