k8s概述

1 k8s概述

1.1 什么是 k8s

k8s 是一个开源的容器编排平台,用于<font color="#d83931">自动化部署、扩展和管理容器化应用程序</font>。它最初由 Google 开发,现由 Cloud Native Computing Foundation(CNCF)维护。k8s 的目标是<font color="#d83931">简化应用程序的部署和管理,提供弹性、可扩展、高可用的服务。</font>

k8s 基于容器技术,如 docker,作为应用程序的基本构建块。容器是一种轻量级的虚拟化技术,可以将应用程序及其依赖项打包到一个独立的、可移植的运行环境中。通过使用容器,开发者可以将应用程序与其运行环境隔离开来,并实现快速部署和跨平台运行。

核心概念

  • Pod:Pod 是 k8s 管理的最小调度单位,它可以包含一个或多个容器,并共享网络和存储资源。Pod 提供了容器之间的通信和协作。

  • Deployment:Deployment 定义了应用程序的期望状态,并负责创建和管理 Pod 的副本。它支持滚动更新、回滚和扩缩容等操作。

  • Service:Service 定义了一组 Pod 的访问方式和网络策略,为 Pod 提供了稳定的网络端点。Service 可以通过负载均衡将请求分发到后端的 Pod上。

  • Namespace:Namespace 提供了一种逻辑隔离的机制,用于将集群中的资源划分为多个虚拟集群。不同的 Namespace 可以拥有独立的资源配额、访问控制策略等。

  • Volume:Volume 是用于持久化数据的抽象,它可以在 Pod 之间共享和持久化存储数据。k8s 支持多种类型的 Volume,如本地磁盘、网络存储等。

主要功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷

master节点

  • ETCD分布式持久化存储 – etcd保存了整个K8s集群的状态;
  • API服务器 – apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  • 调度器 – scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  • 控制器管理器 – controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

这些组件用来存储、管理集群状态,但它们不是运行应用的容器。

node节点

运行容器的任务依赖于每个工作节点上运行的组件:

  • Kubelet – 是 Node 的 agent,负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理;
  • Kubelet服务代理(kube-proxy) – 负责为Service提供cluster内部的服务发现和负载均衡;
  • 容器运行时(Docker、rkt或者其他) – Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

附加组件

除了控制平面(和运行在节点上的组件),还要有几个附加组件,这样才能提供所有之前讨论的功能。包含:

  • K8s DNS服务器 – CoreDNS负责为整个集群提供DNS服务
  • 仪表板(可选) – Dashboard提供GUI,作为高级运维人员,使用kubectl命令行工具管理足矣
  • Ingress控制器 – Ingress Controller为服务提供外网流量入口
  • 容器集群监控 – Metrics-server为K8s资源指标获取工具; Prometheus提供资源监控
  • CNI容器网络接口插件 – calico, flannel(如果没有实施网络策略的需求,那么就直接用flannel,开箱即用;否则就用calico了,但要注意如果网络使用了巨型帧,那么注意calico配置里面的默认值是1440,需要根据实际情况进行修改才能达到最佳性能)

Deployment资源提交流程

准备包含Deployment清单的YAML文件,通过kubectl提交到Kubernetes。kubectl通过HTTP POST请求发送清单到Kubernetes API服务器。API服务器检查Deployment定义,存储到etcd,返回响应给kubectl,如下图所示


[[k8s架构图]]

k8s集群部署参考
GitHub – easzlab/kubeasz: 使用Ansible脚本安装K8S集群,介绍组件交互原理,方便直接,不受国内网络环境影响
[[k8s集群部署]]

2 POD

[[k8s之pod]]
[[k8s之pod#6 pod状态!!!]]
[[k8s之pod#6.2 容器3种状态]]

[[k8s之pod#7 pod创建流程 !!!!!]]

2.1 pod故障排查技巧

[[k8s之pod#5 pod故障排查技巧总结]]

3 命名空间

  • 命名空间用于隔离 Kubernetes 集群资源。
  • 支持命名空间的资源称为局部资源,如 Pod、Service、ReplicationController 等。
  • 不支持命名空间的资源称为全局资源,如 ClusterRole、Node、Namespace 等。

查看 Pod 列表(指定命名空间):

kubectl get pods -n kube-system

查看所有命名空间的 Pod 列表:

kubectl get pods -A

查看资源是否支持命名空间:

kubectl api-resources

案例

 cat 01-ns-redis.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: cmy

---

apiVersion: v1
kind: Pod
metadata:
  labels:
    apps: redis
  name: redis-server
  # 指定pod在特定的名称空间,若不指定,则默认在default名称空间,指定的名称空间必须存在!
  namespace: cmy
spec:
  containers:
  - image: harbor.cmy.cn/redis/redis@sha256:244c2fe15fb3d2d2f8ae4ee9c0aa30925d22f012539eea1935d00e27f6b22e88
    name: c1

 kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
db-mysql80   1/1     Running   0          85m
wp           1/1     Running   0          66m
[root@master-231 /cmy/manifests/namespace]# kubectl get pods -n cmy
NAME           READY   STATUS    RESTARTS   AGE
redis-server   1/1     Running   0          21s

kubectl -n cmy exec -it redis-server  -- redis-cli ping
PONG
kubectl delete ns cmy 

4 常见控制器

[[控制器简述]]

5 services

[[k8s之services]]

[[k8s之services#3 附加组件coreDNS !!!!!]]

6 CICD集成k8s

7 API Server内置的访问控制机制

[[k8s之认证体系]]

8 helm

[[helm]]

9 ingress

上一篇
下一篇