前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >作者太有才了,几句话就说清了Kubernetes,看完我已经学会了!

作者太有才了,几句话就说清了Kubernetes,看完我已经学会了!

作者头像
DevOps持续交付
发布2021-01-28 15:35:46
6970
发布2021-01-28 15:35:46
举报
文章被收录于专栏:DevOps持续交付DevOps持续交付

一、Kubernetes

Kubernetes 是一个可扩展的开源平台(Google 在 2014 年开源),用于管理容器化的工作负载和服务,可促进声明式配置和自动化。名称 Kubernetes 源于希腊语,意为“舵手”或“飞行员”,通常简称为k8s。

二、Kubernetes集群架构

和大多数集群一样,通常,一个Kubernetes集群也由多个节点(node)组成,分别叫做管理节点(master node)和工作节点(worker node)。工作节点托管Pod。管理节点管理集群中的工作节点和 Pod。最新的概念上,node特指工作节点,管理节点一般跨多个主机运行,则称为控制平面(control plane)。

三、控制平面组件

即master组件,四必备一可选:

1、kube-apiserver

该组件公开Kubernetes API,是Kubernetes控制平面的前端和核心。kube-apiserver可以通过部署多个实例进行水平伸缩,平衡流量。API 服务器负责提供 HTTP API,使你可以查询和操纵 Kubernetes API 中对象(例如:Pod、Namespace、ConfigMap 和 Event,Kubernetes 平台视一切皆为 API 对象)的状态。部分操作都可以通过 kubectl 命令行接口或 类似 kubeadm 这类命令行工具来执行, 这些工具在背后也是调用 API。当然,我们也可以使用 REST 调用来访问这些 API。

2、etcd

etcd是Kubernetes保存所有集群数据的数据库。是一个兼具一致性和高可用性的键值数据库。

3、kube-scheduler

调度器,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。

4、kube-controller-manager

运行控制器的组件。从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。控制器的全集:attachdetach、bootstrapsigner、cloud-node-lifecycle、clusterrole-aggregation、cronjob、csrapproving、csrcleaner、csrsigning、daemonsetdeployment、disruption、endpoint、endpointslice、endpointslicemirroring、ephemeral-volume、garbagecollector、horizontalpodautoscaling、jobnamespacenodeipamnodelifecycle、persistentvolume-binder、persistentvolume-expander、podgc、pv-protection、pvc-protection、replicasetreplicationcontroller、resourcequota、root-ca-cert-publisher、route、serviceserviceaccountserviceaccount-tokenstatefulset、tokencleaner、ttl、ttl-after-finished。标红部分是使用Kubernetes过程中中最经常接触到概念,可以看到它们都有对应的控制器,这些控制器都由kube-controller-manager管理。

5、cloud-controller-manager(可选)

云控制器管理器,是指嵌入特定云的控制逻辑的控制平面组件。仅运行特定于云平台的控制回路。

四、Node组件

即在工作节点上运行到组件,有三个:

1、kubelet

kubelet是一个在集群中每个节点(node)上运行的代理。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。

2、kube-proxy

kube-proxy是集群中每个节点上运行的网络代理,实现Kubernetes 服务(Service)概念的一部分。

3、容器运行时

容器运行时是负责运行容器的软件。可类比JVM之于Java程序。容器运行时不仅有我们常用到docker,还有containerd、CRI-O等。

五、插件(Addons)

Kubernetes是可扩展的。常用的KubernetesWeb界面(仪表盘)就是一个插件。插件使用 Kubernetes 资源(DaemonSet、 Deployment等)实现集群功能。

六、Pod

Pod (荚果,如豌豆荚)是一组(一个或多个)容器;这些容器共享存储、网络、以及怎样运行这些容器的声明。Pod是一个逻辑主机。相比Docker,Kubernetes不直接创建容器,而是创建Pod。创建Pod时要指定其中运行的容器。Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。

一个裸Pod的定义示例:

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    wechat: devopscd
  containers:
  - name: hello1
    image: gcr.io/google-samples/hello-app:1.0

七、工作负载资源

通常,作为用户,我们很少在 Kubernetes 中直接创建一个个的裸Pod,而是通过工作负载资源来创建和管理多个Pod。工作负载资源简称负载资源,Deployment、ReplicaSet、DaemonSet、Job是比较常见的负载资源。它们都有对应的控制器,在控制平面的kube-controller-manager组件介绍中,我们有列出。

负载资源的控制器通常使用 Pod 模板(Pod Template)来替我们创建和管理 Pod。Pod 模板是包含在工作负载资源中的规范,用来创建 Pod。工作负载的控制器会使用负载对象中的 PodTemplate 来生成实际的 Pod。 PodTemplate 是我们用来运行应用时指定的负载资源的目标状态的一部分。在资源定义yaml中,我们使用template来定义Pod模版。下面介绍几个常用的工作负载资源

1、ReplicaSet

我们以一个ReplicaSet负载资源的定义yaml,来学习template的使用:

代码语言:javascript
复制
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: hello1_app
    wechat: devopsce
spec:
  replicas: 3
  selector:
    matchLabels:
      wechat: devopscd
  template:
    metadata:
      labels:
        wechat: devopscd
    spec:
      containers:
      - name: hello1
        image: gcr.io/google-samples/hello-app:1.0

可以看到ReplicaSet的spec嵌套了template,template的spec和前面定义Pod的格式是一致的。

2、Deployment

ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。这意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。

一个Deployment示例:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

提交这个Deployment定义,Kubernetes将创建其中的.spec.replicas所定义的 ReplicaSet 及其管理的 Pod。

3、Job

Job 示例。它负责计算 π 到小数点后 2000 位,并打印结果。

代码语言:javascript
复制
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

Job通常作为一次性的任务执行使用,而非长时间驻留。Job有一些特有的模式,如串、并行、重试次数等。

八、服务(Service)

服务是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。简单说,即暴露外部访问的端口,供终端用户使用。

服务在 Kubernetes 中也是一个 REST 对象。也有对应的控制器。

以下是一个服务定义,它将Pod内部的80端口以8080端口对外暴露:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

九、总结

以上,先介绍了Kubernetes的起源、架构、管理平面组件+节点组件+插件,从点到面、由面到体,使得读者对Kubernetes有了宏观上的整体认识。然后介绍了Pod、工作负载资源、服务,由浅入深,循序渐进,让读者了解Kubernets常用概念的实际作用和区别。

小编看了一遍就懂了!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps持续交付 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档