Kubernetes是一个开源的容器编排工具,专为自动化容器化应用程序的部署、扩展和管理而设计。它通过提供一种灵活的、可扩展的解决方案,帮助开发者和运维人员简化应用程序的管理流程。Kubernetes由Google开发,现在由云原生计算基金会(CNCF)维护。
在过去,应用程序通常以单体架构部署,这种方式存在一定的局限性,如更新和扩展困难。随着容器化技术的兴起,微服务架构成为主流,每个服务独立部署在自己的容器中。然而,随着容器数量的增加,管理这些容器变得非常复杂,这时就需要一个强大的编排工具来解决这个问题。Kubernetes应运而生,提供了自动化管理容器的能力。
Kubernetes不仅简化了容器化应用的管理,还支持自动扩展、自我修复和滚动更新等特性,使得应用程序可以更可靠地运行在生产环境中。它的跨云能力也使得应用可以轻松迁移到不同的云平台,提高了灵活性和可移植性。
本文带大家好好了解一下Kubernetes。
容器是一种轻量级的虚拟化技术,它将应用程序及其依赖项打包在一起,在独立的环境中运行。相比传统的虚拟机,容器具有更高的资源利用率和更快的启动速度。
随着应用程序的规模和复杂度增加,手动管理大量容器变得不可行。容器编排工具(如Kubernetes)通过自动化部署、管理和扩展容器,帮助运维人员高效地管理应用程序。
Kubernetes集群由一组节点组成,包括一个或多个控制平面节点和若干工作节点。控制平面节点负责管理集群的整体状态,而工作节点负责实际运行容器化的应用程序。
Kubernetes的架构包括以下主要组件:
下面详细的介绍一下控制平面和工作节点。
这块大家要仔细的看,基本上Kubernetes就是围绕这两个概念展开的,第一遍看不懂,就看第二遍😀😀😀。
Kube-APIServer 是 Kubernetes 控制平面的核心组件,负责处理所有的 REST 操作,暴露 Kubernetes API。它是整个集群的前端,所有的控制请求都要经过它。
功能:
当用户或其他组件向 Kube-APIServer 发送请求时,APIServer 首先进行身份验证和授权检查,然后对请求的数据进行验证和处理。处理完成后,APIServer 会将数据存储到 etcd 中,同时通知其他组件进行相应的操作。
Etcd 是一个分布式键值存储,用于存储 Kubernetes 集群的所有数据。它是 Kubernetes 集群的源数据存储系统,所有的配置信息、状态信息都存储在 etcd 中。
功能:
Kube-APIServer 通过 etcd API 进行数据的读写操作。当集群状态发生变化时,APIServer 会将新的状态数据写入 etcd,同时其他组件可以监听 etcd 的变化,从而进行相应的处理。
Kube-Scheduler 是 Kubernetes 的调度组件,负责将新创建的 Pod 调度到合适的工作节点上。它根据预设的调度策略和节点状态,选择最合适的节点来运行 Pod。
功能:
Kube-Scheduler 通过监听 Kube-APIServer 上的调度请求,获取需要调度的 Pod 列表。然后,它根据预设的调度策略和节点的状态,选择最合适的节点,并将调度结果写回 APIServer,最终由相应的节点来运行 Pod。
Kube-Controller-Manager 是 Kubernetes 控制平面的控制管理组件,负责管理集群的各种控制器。这些控制器是用于处理集群状态变化的后台进程。
功能:
Kube-Controller-Manager 通过监听 Kube-APIServer 的事件,获取集群状态变化的信息。根据不同的控制器,它会执行相应的操作,如创建或删除 Pod、副本调整、节点故障处理等,并将结果写回 APIServer,从而更新集群状态。
Cloud-Controller-Manager 是 Kubernetes 控制平面的云服务管理组件,用于将 Kubernetes 与底层的云服务集成。它抽象了底层云平台的差异,使得 Kubernetes 可以在不同的云平台上运行。
功能:
Cloud-Controller-Manager 通过调用底层云平台的 API,执行相应的操作,如节点创建、负载均衡配置、存储卷管理等。它通过监听 Kube-APIServer 的事件,获取需要执行的操作,然后调用云平台的 API 来完成相应的操作,并将结果写回 APIServer,从而更新集群状态。
Kubelet 是运行在每个工作节点上的主要代理进程,负责管理节点上的 Pod 和容器。它通过与 Kube-APIServer 交互,确保节点上容器的正确运行。
功能:
Kubelet 通过监听 Kube-APIServer 的调度信息,获取需要在本节点上运行的 Pod 列表。它根据 Pod 的配置文件,调用容器运行时(如 Docker、containerd)来启动和管理容器。同时,Kubelet 会定期向 Kube-APIServer 发送心跳信号和状态报告,确保控制平面能够及时了解节点和 Pod 的运行状况。
Kube-Proxy 是 Kubernetes 中的网络代理服务,运行在每个工作节点上,负责维护网络规则,管理 Pod 间的网络通信和负载均衡。
功能:
Kube-Proxy 通过监听 Kube-APIServer 获取服务和端点的变化信息,然后根据这些信息动态更新节点上的网络规则。它使用 IPTables 或 IPVS 来实现网络流量的转发和负载均衡,确保请求能够正确分发到相应的 Pod 上。
容器运行时(Container Runtime)是 Kubernetes 中用于运行和管理容器的组件,常见的容器运行时有 Docker、containerd、CRI-O 等。
功能:
Kubelet 通过 CRI(Container Runtime Interface)与容器运行时进行交互,向其发送启动和停止容器的指令。容器运行时根据这些指令,调用底层操作系统的容器技术(如 cgroup、namespace)来管理容器的生命周期和资源使用。同时,容器运行时还负责从镜像仓库拉取和管理容器镜像,确保容器能够按需启动。
Node Local Controller 是 Kubernetes 中的一种节点本地控制器,负责在每个节点上执行一些特定的控制任务,如本地存储管理、节点健康检查等。
功能:
Node Local Controller 运行在每个工作节点上,通过监听 Kubelet 和 Kube-APIServer 的事件,获取节点的状态信息。根据这些信息,它执行相应的控制操作,如调整存储卷、进行健康检查等,并将结果报告给 Kube-APIServer,从而更新集群的状态。
Kubernetes 的网络模型基于 Pod 和 Service 的通信,通过统一的 IP 地址和端口分配,确保集群内的各个组件能够无缝通信。
网络策略是 Kubernetes 中用于定义 Pod 之间通信规则的机制,通过配置网络策略,可以控制哪些 Pod 可以互相通信。
功能:
网络策略是基于标签的规则,通过定义一组规则,指定允许或拒绝哪些 Pod 的通信。网络策略由网络插件实现,通过监听和解析网络策略的配置,动态更新网络规则,确保 Pod 间的通信符合预期。
Kubernetes 提供了多种存储解决方案,以满足不同应用场景下的数据持久化需求。存储在 Kubernetes 中主要通过卷(Volume)和持久化卷(Persistent Volume, PV)来实现。
卷是与 Pod 生命周期相关联的存储单元,用于在 Pod 内部或多个容器之间共享数据。Kubernetes 支持多种类型的卷,每种卷类型具有不同的特性和用途。
在 Pod 的定义中,可以通过 volumes 字段指定所需的卷,并通过 volumeMounts 字段将卷挂载到容器的文件系统中。例如:
- apiVersion: v1
- kind: Pod
- metadata:
- name: my-pod
- spec:
- containers:
- - name: my-container
- image: nginx
- volumeMounts:
- - mountPath: /usr/share/nginx/html
- name: my-volume
- volumes:
- - name: my-volume
- emptyDir: {}
-
持久化卷是集群级别的存储资源,独立于 Pod 生命周期存在。PV 提供了一种抽象,用于管理不同类型的底层存储(如 NFS、iSCSI、云存储等)。
PV 的使用涉及两部分:持久化卷(PV)的定义和持久化卷声明(PVC)。PV 由管理员创建和管理,而 PVC 由用户创建,用于请求和使用存储资源。
示例:创建 PV
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: my-pv
- spec:
- capacity:
- storage: 10Gi
- accessModes:
- - ReadWriteOnce
- nfs:
- path: /path/to/nfs
- server: nfs-server.example.com
-
示例:创建 PVC
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: my-pvc
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 10Gi
-
在 Pod 中使用 PVC
- apiVersion: v1
- kind: Pod
- metadata:
- name: my-pod
- spec:
- containers:
- - name: my-container
- image: nginx
- volumeMounts:
- - mountPath: /usr/share/nginx/html
- name: my-storage
- volumes:
- - name: my-storage
- persistentVolumeClaim:
- claimName: my-pvc
-
存储类是用于动态供应 PV 的机制,提供了一种抽象来定义存储资源的不同特性和配置。通过 StorageClass,用户可以根据需求自动创建 PV。
管理员可以创建多个 StorageClass,为用户提供不同的存储选项。用户在创建 PVC 时,可以指定使用哪种 StorageClass。
示例:创建 StorageClass
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: fast
- provisioner: kubernetes.io/aws-ebs
- parameters:
- type: io1
- iopsPerGB: "10"
- fsType: ext4
-
示例:使用 StorageClass 创建 PVC
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: my-fast-pvc
- spec:
- storageClassName: fast
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 10Gi
-
Kubernetes 提供了多层次的安全机制,涵盖身份认证、授权、网络安全和密钥管理等方面,确保集群和应用的安全性。
身份认证是验证用户或组件身份的过程,确保只有合法的用户和组件才能访问 Kubernetes API。Kubernetes 支持多种认证机制,包括客户端证书、静态 Token、服务账户和外部认证系统。
使用客户端证书进行认证
创建证书和密钥:
- openssl genrsa -out user.key 2048
- openssl req -new -key user.key -out user.csr
- openssl x509 -req -in user.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out user.crt -days 365
-
配置 kubeconfig 文件:
- apiVersion: v1
- kind: Config
- users:
- - name: my-user
- user:
- client-certificate: /path/to/user.crt
- client-key: /path/to/user.key
-
授权是控制用户或组件对 Kubernetes 资源的访问权限。Kubernetes 提供了多种授权机制,包括基于角色的访问控制(RBAC)、属性基础访问控制(ABAC)和节点授权等。
使用 RBAC 进行授权
创建角色和角色绑定:
- apiVersion: rbac.authorization.k8s.io/v1
- kind: Role
- metadata:
- namespace: default
- name: pod-reader
- rules:
- - apiGroups: [""]
- resources: ["pods"]
- verbs: ["get", "watch", "list"]
- ---
- apiVersion: rbac.authorization.k8s.io/v1
- kind: RoleBinding
- metadata:
- name: read-pods
- namespace: default
- subjects:
- - kind: User
- name: my-user
- apiGroup: rbac.authorization.k8s.io
- roleRef:
- kind: Role
- name: pod-reader
- apiGroup: rbac.authorization.k8s.io
-
网络安全是确保集群内外的网络通信安全,防止未经授权的访问和攻击。Kubernetes 提供了多种网络安全机制,包括网络策略、网络隔离和加密通信等。
使用网络策略控制通信
定义网络策略:
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: allow-nginx
- namespace: default
- spec:
-
-
- podSelector:
- matchLabels:
- app: nginx
- policyTypes:
- - Ingress
- ingress:
- - from:
- - podSelector:
- matchLabels:
- app: frontend
- ports:
- - protocol: TCP
- port: 80
-
密钥管理是保护敏感数据(如密码、令牌、证书等)的重要机制。Kubernetes 提供了 Secret 对象,用于安全地存储和管理敏感数据。
创建和使用 Secret
创建 Secret:
- apiVersion: v1
- kind: Secret
- metadata:
- name: my-secret
- type: Opaque
- data:
- username: YWRtaW4= # base64 编码的 'admin'
- password: MWYyZDFlMmU2N2Rm # base64 编码的 '1f2d1e2e67df'
-
在 Pod 中使用 Secret:
- apiVersion: v1
- kind: Pod
- metadata:
- name: my-pod
- spec:
- containers:
- - name: my-container
- image: nginx
- env:
- - name: USERNAME
- valueFrom:
- secretKeyRef:
- name: my-secret
- key: username
- - name: PASSWORD
- valueFrom:
- secretKeyRef:
- name: my-secret
- key: password
-
Kubernetes 调度器是负责将 Pod 分配到集群中合适的节点上的组件。调度器在 Pod 创建时决定其运行的节点,并根据多种因素优化调度决策。
调度策略是调度器在选择节点时遵循的一系列规则和约束。通过配置调度策略,Kubernetes 可以实现高效的资源利用和应用的高可用性。
使用节点选择器调度 Pod
- apiVersion: v1
- kind: Pod
- metadata:
- name: my-pod
- spec:
- containers:
- - name: my-container
- image: nginx
- nodeSelector:
- disktype: ssd
-
使用亲和性和反亲和性调度 Pod
- apiVersion: v1
- kind: Pod
- metadata:
- name: my-pod
- spec:
- containers:
- - name: my-container
- image: nginx
- affinity:
- nodeAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- nodeSelectorTerms:
- - matchExpressions:
- - key: disktype
- operator: In
- values:
- - ssd
- podAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- - labelSelector:
- matchExpressions:
- - key: app
- operator: In
- values:
- - frontend
- topologyKey: "kubernetes.io/hostname"
- podAntiAffinity:
- preferredDuringSchedulingIgnoredDuringExecution:
- - weight: 100
- podAffinityTerm:
- labelSelector:
- matchExpressions:
- - key: app
- operator: In
- values:
- - backend
- topologyKey: "kubernetes.io/hostname"
-
Kubernetes 提供了多种机制来管理和部署应用,包括 Deployment、StatefulSet、DaemonSet 和 Job 等。这些机制帮助开发和运维人员高效地管理容器化应用。
Deployment 是用于管理无状态应用的控制器,通过声明式配置和滚动更新,确保应用的高可用性和稳定性。
创建 Deployment
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx-deployment
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.14.2
- ports:
- - containerPort: 80
-
StatefulSet 是用于管理有状态应用的控制器,确保 Pod 有稳定的网络标识和存储,适用于数据库、缓存等有状态服务。
创建 StatefulSet
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: web
- spec:
- serviceName: "nginx"
- replicas: 3
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.14.2
- ports:
- - containerPort: 80
- name: web
- volumeClaimTemplates:
- - metadata:
- name: www
- spec:
- accessModes: ["ReadWriteOnce"]
- resources:
- requests:
- storage: 1Gi
-
DaemonSet 是用于在每个节点上运行一个 Pod 的控制器,适用于日志收集、监控等全节点运行的应用。
创建 DaemonSet
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: fluentd
- labels:
- app: fluentd
- spec:
- selector:
- matchLabels:
- name: fluentd
- template:
- metadata:
- labels:
- name: fluentd
- spec:
- containers:
- - name: fluentd
- image: fluentd:v1.12
- resources:
- limits:
- memory: 200Mi
- cpu: 0.5
-
Job 和 CronJob 是用于批处理任务的控制器,Job 负责一次性任务的执行,而 CronJob 则用于定时任务的管理。
创建 Job
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: pi
- spec:
- template:
- metadata:
- name: pi
- spec:
- containers:
- - name: pi
- image: perl
- command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
- restartPolicy: Never
- backoffLimit: 4
-
创建 CronJob
- apiVersion: batch/v1beta1
- kind: CronJob
- metadata:
- name: hello
- spec:
- schedule: "*/1 * * * *"
- jobTemplate:
- spec:
- template:
- spec:
- containers:
- - name: hello
- image: busybox
-
-
- args:
- - /bin/sh
- - -c
- - date; echo Hello from the Kubernetes cluster
- restartPolicy: OnFailure
-
Kubernetes 架构涵盖了从基础组件到高级功能的方方面面,为应用的容器化部署、管理和运维提供了强大的工具和机制。通过详细了解和掌握这些组件和机制,可以帮助开发和运维人员更高效地管理和优化 Kubernetes 集群,确保应用的高可用性、可扩展性和安全性。在实际应用中,结合具体业务需求和环境,灵活运用 Kubernetes 提供的各种功能和特性,才能充分发挥其优势,实现持续集成和持续交付(CI/CD)的目标。