Kubernetes基本概念

Pod

k8s的最终目标就是以应用为中心,来组织和围绕如何更好的以容器化的方式运行应用。而在k8s上运行容器的做小的原子单元是由k8s抽象出的pod。


Kubernetes基本概念



Pod的含义是豌豆荚的意思,它意味着一个豆荚内存在着好几个豌豆。而在k8s中pod则代表着一组关联度非常密切的容器。如主容器为应用容器,而辅助容器为日志收集的agent之类的容器。这种辅助容器可以称之为容器的SideCar。

在k8s中pod内的容器组合有以下几种:

  • SideCar
  • Adapter
  • Ambassador

在k8s的容器应用中,容器之间是存在关系的。这种关系是需要由容器编排系统进行管理,这种关系分为亲密和非紧密。

  • 亲密:k8s会将其放入几个pod内实现同进退。这些容器中的Network、IPC、UTS是共享的。并且共享一组存储卷。所以主容器会挂载一组存储卷,将所有数据写入存储卷中,SideCar也挂载同一组存储卷,所以主容器所写的内容都会被sidecar所收集。容器间通信使用lo接口即可。
  • 非紧密:容器各自是各自的Pod。通信需要借助网络插件。
  • pod-to-pod:网络插件实现
  • pod-to-service:ipvs、iptables规则实现
  • kube-proxy:kube-proxy会监视着apiserver上service的变动。把集群上的每一个service的定义转换为本地的ipvs或iptables规则。当service发生增删改查,kube-proxy会将其变化为本机iptables规则上的增删改查。

容器间的通信

容器间的通信有以下两种:

  • 同一主机:两个pod地址在同一网段内,直接通过宿主机的bridge进行通信。
  • 跨主机:使用叠加或者承载网络来进行通信,需要依靠网络插件来实现。

flannel的网络通信

在flannel网络插件中,默认创建的pod会自动挂载到宿主机的CNI0桥上。

# 宿主机上的cni0网桥
root@k8s-master01:~# ifconfig cni0
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.0.1  netmask 255.255.255.0  broadcast 10.244.0.255
        inet6 fe80::d8ca:b5ff:fea1:a90a  prefixlen 64  scopeid 0x20<link>
        ether da:ca:b5:a1:a9:0a  txqueuelen 1000  (Ethernet)
        RX packets 143158  bytes 11677858 (11.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 154789  bytes 14020277 (14.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

各宿主机上不但有cni0这个bridge设备,还存在一个flannel.1这个隧道网络,跨主机通信时报文会发送给bridge网络,bridge网络会通过flannel.1这个隧道网络发送给目标主机,目标主机发现为本地的地址转发给pod,从而实现pod间跨主机通信。

root@k8s-master01:~# ifconfig flannel.1
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.0.0  netmask 255.255.255.255  broadcast 10.244.0.0
        inet6 fe80::f0ff:71ff:fed7:612c  prefixlen 64  scopeid 0x20<link>
        ether f2:ff:71:d7:61:2c  txqueuelen 0  (Ethernet)
        RX packets 2944  bytes 4796228 (4.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1831  bytes 139032 (139.0 KB)
        TX errors 0  dropped 34 overruns 0  carrier 0  collisions 0

需要注意的是隧道报文需要封装一个额外的首部,这个首部会映像MTU,因此要设定内部容器间通信的MTU要小于1500,以便于额外封装首部时不会产生巨型帧。

控制器和pod间关系


Kubernetes基本概念



控制器使用标签选择器关联的pod上来,我们要定义一个控制器,需要指定运行几个副本(replicas)、pod的模板(template)。

当控制器中所关联的某个pod宕机后,控制器会自动再创建出一个pod以确保副本数量与指定的数量相同。

pod的宕机会被kubelet发现,kubelet会运行control loop来监控节点上的所有pod状态是否健康,当发现有pod宕机,kubelet会报告给apiserver。而控制器则会监视着apiserver,当发现有被自己所关联的pod宕机时,控制器会重新创建一个pod,并把原来宕机的pod删除。

API Server

k8s的API Server提供的是一个RESTful风格的接口,他把一切的资源都抽象为资源resource。

资源类型:Pod,Deployment,Service等等。

可以将每一个资源类型看作是一张表,每个表都存在一些对象。如果期望向这些表中插入数据,则需要向API Sever发送指令。调用API Server的API。

API server客户端

kubectl就是KUBE API Server的专用api调用客户端。

kubectl向资源列表中插入数据时有3种方式:

  • 命令式命令:在命令行种使用命令及选项实现。
  • 命令式配置文件:使用命令并通过选项传递一个配置文件来实现。
  • 声明式配置文件:使用命令并通过选项传递配置文件来实现。
# 声明式配置文件资源规范,yaml格式数据项。
apiVersion: ...  # 资源对象所属的API群组及版本
kind: ...        
metadata:       # 资源对象的元数据
 ...
spec:        # 所需状态,或称为期望状态
  ...

API群组及版本

k8s上存在的API群组和版本信息非常多,为了方便管理k8s把许多的资源类型按照相关性分成了组,每个组可以单独演进。

查询系统上所有的API群组版本

当前k8s上存在的所有API群组和版本可以通过命令查询获得。

root@k8s-master01:~# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
longhorn.io/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

api群组的版本分为3种:

  • v1:稳定版
  • v1beta1:beta版本,公测。
  • alpha:内测版本,在下个版本可能被丢弃。

查看某个资源所在的群组

以下以pod为例来查看其资源的群组

# 使用kubectl explain命令来查看相应资源的群组和配置清单的使用方式
root@k8s-master01:~# kubectl explain pod
KIND:     Pod
VERSION:  v1   # pod属于核心群组的v1版本

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   kind <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata     <Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec <Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

   status       <Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

k8s资源类型分类

k8s上资源类型分为以下几种:

  • 工作负载型(workload):Pod。
  • stateful:StatefulSet,Operator。
  • stateless:Deployment,DaemonSet
  • Job,Cronjob
  • 服务发现和负载均衡
  • service,Ingress
  • 配置和存储:
  • ConfigMap/Secret
  • PVC/PV
  • Downward API
  • 名称空间级别资源
  • role,rolebinding
  • 集群级别资源
  • namespace,node,clusterrole,clusterrolebinding
  • 元数据类型
  • LimitRange,…

k8s资源作用域的级别

k8s资源作用域的级别分为集群级别,名称空间级别。

名称空间级别的资源只能创建在名称空间内部。


原文始发于微信公众号(TechOps之窗):Kubernetes基本概念

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/278868.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!