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]]