Kubernetes
一、基础知识
1. 概念和术语
2. Kubernetes特性
3. 集群组件
4. 抽象对象
5. 镜像加速下载
二、安装部署kubeadm
1. 基础环境准备
2. 安装runtime容器(Docker)
3. 安装runtime容器(Contained)
4. Containerd进阶使用
5. 部署kubernets集群
6. 部署calico网络组件
7. 部署NFS文件存储
8. 部署ingress-nginx代理
9. 部署helm包管理工具
10. 部署traefik代理
11. 部署dashboard管理面板(官方)
12. 部署kubesphere管理面板(推荐)
12. 部署metrics监控组件
13. 部署Prometheus监控
14. 部署elk日志收集
15. 部署Harbor私有镜像仓库
16. 部署minIO对象存储
17. 部署jenkins持续集成工具
三、kubectl命令
1. 命令格式
2.node操作常用命令
3. pod常用命令
4.控制器常用命令
5.service常用命令
6.存储常用命令
7.日常命令总结
8. kubectl常用命令
四、资源对象
1. K8S中的资源对象
2. yuml文件
3. Kuberbetes YAML 字段大全
4. 管理Namespace资源
5. 标签与标签选择器
6. Pod资源对象
7. Pod生命周期与探针
8. 资源需求与限制
9. Pod服务质量(优先级)
五、资源控制器
1. Pod控制器
2. ReplicaSet控制器
3. Deployment控制器
4. DaemonSet控制器
5. Job控制器
6. CronJob控制器
7. StatefulSet控制器
8. PDB中断预算
六、Service和Ingress
1. Service资源介绍
2. 服务发现
3. Service(ClusterIP)
4. Service(NodePort)
5. Service(LoadBalancer)
6. Service(ExternalName)
7. 自定义Endpoints
8. HeadlessService
9. Ingress资源
10. nginx-Ingress案例
七、Traefik
1. 知识点梳理
2. 简介
3. 部署与配置
4. 路由(IngressRoute)
5. 中间件(Middleware)
6. 服务(TraefikService)
7. 插件
8. traefikhub
9. 配置发现(Consul)
10. 配置发现(Etcd)
八、存储
1. 配置集合ConfigMap
6. downwardAPI存储卷
3. 临时存储emptyDir
2. 敏感信息Secret
5. 持久存储卷
4. 节点存储hostPath
7. 本地持久化存储localpv
九、rook
1. rook简介
2. ceph
3. rook部署
4. rbd块存储服务
5. cephfs共享文件存储
6. RGW对象存储服务
7. 维护rook存储
十、网络
1. 网络概述
2. 网络类型
3. flannel网络插件
4. 网络策略
5. 网络与策略实例
十一、安全
1. 安全上下文
2. 访问控制
3. 认证
4. 鉴权
5. 准入控制
6. 示例
十二、pod调度
1. 调度器概述
2. label标签调度
3. node亲和调度
4. pod亲和调度
5. 污点和容忍度
6. 固定节点调度
十三、系统扩展
1. 自定义资源类型(CRD)
2. 自定义控制器
十四、资源指标与HPA
1. 资源监控及资源指标
2. 监控组件安装
3. 资源指标及其应用
4. 自动弹性缩放
十五、helm
1. helm基础
2. helm安装
3. helm常用命令
4. HelmCharts
5. 自定义Charts
6. helm导出yaml文件
十六、k8s高可用部署
1. kubeadm高可用部署
2. 离线二进制部署k8s
3. 其他高可用部署方式
十七、日常维护
1. 修改节点pod个数上限
2. 集群证书过期更换
3. 更改证书有效期
4. k8s版本升级
5. 添加work节点
6. master节点启用pod调度
7. 集群以外节点控制k8s集群
8. 删除本地集群
9. 日常错误排查
10. 节点维护状态
11. kustomize多环境管理
12. ETCD节点故障修复
13. 集群hosts记录
14. 利用Velero对K8S集群备份还原与迁移
15. 解决K8s Namespace无法正常删除的问题
16. 删除含指定名称的所有资源
十八、k8s考题
1. 准备工作
2. 故障排除
3. 工作负载和调度
4. 服务和网络
5. 存储
6. 集群架构、安装和配置
本文档使用 MrDoc 发布
-
+
home page
11. kustomize多环境管理
# kustomize简介 ## kustomize功能 一般应用都会存在多套部署环境:开发环境、测试环境、生产环境,多套环境意味着存在多套 K8S 应用资源 YAML。而这么多套 YAML 之间只存在微小配置差异,比如镜像版本不同、Label 不同等,而这些不同环境下的YAML 经常会因为人为疏忽导致配置错误。再者,多套环境的 YAML 维护通常是通过把一个环境下的 YAML 拷贝出来然后对差异的地方进行修改。一些类似 Helm 等应用管理工具需要额外学习DSL 语法。总结以上,在 k8s 环境下存在多套环境的应用,经常遇到以下几个问题: - 如何管理不同环境或不同团队的应用的 Kubernetes YAML 资源 - 如何以某种方式管理不同环境的微小差异,使得资源配置可以复用,减少 copy and change 的工作量 - 如何简化维护应用的流程,不需要额外学习模板语法 Kustomize 通过以下几种方式解决了上述问题: - kustomize 通过 Base & Overlays 方式(下文会说明)方式维护不同环境的应用配置 - kustomize 使用 patch 方式复用 Base 配置,并在 Overlay 描述与 Base 应用配置的差异部分来实现资源复用 - kustomize 管理的都是 Kubernetes 原生 YAML 文件,不需要学习额外的 DSL 语法 ## kustomize 术语 在 kustomize 项目的文档中,经常会出现一些专业术语,这里总结一下常见的术语,方便后面讲解 - **kustomization** 术语 kustomization 指的是 kustomization.yaml 文件,或者指的是包含 kustomization.yaml 文件的目录以及它里面引用的所有相关文件路径 - **base** base 指的是一个 kustomization , 任何的 kustomization 包括 overlay (后面提到),都可以作为另一个 kustomization 的 base (简单理解为基础目录)。base 中描述了共享的内容,如资源和常见的资源配置 - **overlay** overlay 是一个 kustomization, 它修改(并因此依赖于)另外一个 kustomization. overlay 中的 kustomization指的是一些其它的 kustomization, 称为其 base. 没有 base, overlay 无法使用,并且一个 overlay 可以用作 另一个 overlay 的 base(基础)。简而言之,overlay 声明了与 base 之间的差异。通过 overlay 来维护基于 base 的不同 variants(变体),例如开发、QA 和生产环境的不同 variants - **variant** variant 是在集群中将 overlay 应用于 base 的结果。例如开发和生产环境都修改了一些共同 base 以创建不同的 variant。这些 variant 使用相同的总体资源,并与简单的方式变化,例如 deployment 的副本数、ConfigMap使用的数据源等。简而言之,variant 是含有同一组 base 的不同 kustomization - **resource** 在 kustomize 的上下文中,resource 是描述 k8s API 对象的 YAML 或 JSON 文件的相对路径。即是指向一个声明了 kubernetes API 对象的 YAML 文件 - **patch** 修改文件的一般说明。文件路径,指向一个声明了 kubernetes API patch 的 YAML 文件 # 安装 在kubernetes 1.14版本以上,已经集成到kubectl中了,你可以通过kubectl --help来进行查看命令。 ```bash [root@k8s-master ~]# kubectl --help | grep kustomize kustomize Build a kustomization target from a directory or URL. ``` 但是内置的kustomize功能较少,推荐安装完整的kustomize客户端,使用更多功能。 ```bash [root@k8s-master ~]# wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.0.1/kustomize_v5.0.1_linux_amd64.tar.gz [root@k8s-master ~]# tar -zxvf kustomize_v5.0.1_linux_amd64.tar.gz [root@k8s-master ~]# mv kustomize /usr/local/bin/ [root@k8s-master ~]# kustomize version v5.0.1 ``` # 实践使用 ## 环境说明 | | 副本数 | 环境变量 | 名称空间 | | --- | --- | --- | --- | | 测试环境 | 1 | env_test | test | | 生产环境 | 5 | emv_prod | prod | ## 创建基础模板文件 首先创建一个项目目录,并在其中新建一个base目录作为基础目录,后续其他环境配置以此为基础更改。 ```bash [root@k8s-master k8s-test]# tree kustomize-test/ kustomize-test/ └── base ├── deployment.yaml ├── kustomization.yaml └── service.yaml ``` yaml资源文件内容如下: ```yaml [root@k8s-master base]# cat deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v1 resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80 [root@k8s-master base]# cat service.yaml apiVersion: v1 kind: Service metadata: name: myapp spec: type: ClusterIP selector: app: myapp ports: - port: 80 targetPort: 80 ``` kustomization.yaml内容如下,在resources中列出所有base的yaml文件即可。 ```yaml [root@k8s-master base]# cat kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - deployment.yaml - service.yaml ``` 查看构建后的文件,实际上就是将多个yaml文件合并到一个文件中。 ```yaml [root@k8s-master base]# kustomize build . apiVersion: v1 kind: Service metadata: name: myapp spec: ports: - port: 80 targetPort: 80 selector: app: myapp type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - image: ikubernetes/myapp:v1 name: myapp ports: - containerPort: 80 resources: limits: cpu: 500m memory: 128Mi ``` 创建资源,用法和kubectl创建资源一样,只不过将-f改为-k ```bash [root@k8s-master base]# kubectl apply -k . service/myapp created deployment.apps/myapp created [root@k8s-master base]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-7b5d6dcdd5-gc7rv 1/1 Running 0 7s [root@k8s-master base]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.99.127.46 <none> 80/TCP 11s ``` 还可以通过kustomize命令创建 ```bash kustomize build . | kubectl apply -f - ``` 删除命令创建命令类似,使用delete即可。 ```bash [root@k8s-master base]# kubectl delete -k . service "myapp" deleted deployment.apps "myapp" deleted ``` ## 配置测试环境 在base目录同级下新建overlays目录,然后再按不同的环境建立子目录即可。 ```bash [root@k8s-master kustomize-test]# tree . . ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays └── test ├── env.yaml └── kustomization.yaml ``` 在测试环境,我们需要新增环境变量,直接根据deployment.yaml修改即可,注意deployment的name和containers的name要和base中的保持一致,才能匹配到并覆盖。 ```yaml [root@k8s-master test]# cat env.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: template: spec: containers: - name: myapp env: - name: ENV_NAME value: test ``` 在kustomization.yaml中,要将resources改为base目录路径,并加载env.yaml文件,指定名称空间 ```yaml [root@k8s-master test]# cat kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - path: env.yaml namespace: test ``` 创建资源测试 ```yaml [root@k8s-master test]# kustomize build . apiVersion: v1 kind: Service metadata: name: myapp namespace: test spec: ports: - port: 80 targetPort: 80 selector: app: myapp type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp namespace: test spec: selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - env: - name: ENV_NAME value: test image: ikubernetes/myapp:v1 name: myapp ports: - containerPort: 80 resources: limits: cpu: 500m memory: 128Mi [root@k8s-master test]# kubectl apply -k . service/myapp created deployment.apps/myapp created [root@k8s-master test]# kubectl get all -n test NAME READY STATUS RESTARTS AGE pod/myapp-7f88884b4-ls97g 1/1 Running 0 19s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/myapp ClusterIP 10.105.95.46 <none> 80/TCP 19s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp 1/1 1 1 19s NAME DESIRED CURRENT READY AGE replicaset.apps/myapp-7f88884b4 1 1 1 19s ``` ## 配置生产环境 在overlays目录,然后再新建prod目录,此时目录结构如下: ```bash [root@k8s-master kustomize-test]# tree . . ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays ├── prod │ ├── env.yaml │ ├── kustomization.yaml │ └── replicas.yaml └── test ├── env.yaml └── kustomization.yaml ``` 在生成环境,我们需要新增环境变量,修改副本数 ```yaml [root@k8s-master prod]# cat env.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: template: spec: containers: - name: myapp env: - name: ENV_NAME value: prod [root@k8s-master prod]# cat replicas.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 ``` 在kustomization.yaml中,要将resources改为base目录路径,并加载env.yaml文件,指定名称空间 ```yaml [root@k8s-master prod]# cat kustomization.yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - path: env.yaml - path: replicas.yaml namespace: prod ``` 创建资源测试 ```yaml [root@k8s-master prod]# kustomize build . apiVersion: v1 kind: Service metadata: name: myapp namespace: prod spec: ports: - port: 80 targetPort: 80 selector: app: myapp type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp namespace: prod spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - env: - name: ENV_NAME value: prod image: ikubernetes/myapp:v1 name: myapp ports: - containerPort: 80 resources: limits: cpu: 500m memory: 128Mi [root@k8s-master prod]# kubectl create ns prod namespace/prod created [root@k8s-master prod]# kubectl apply -k . service/myapp created deployment.apps/myapp created [root@k8s-master prod]# kubectl get all -n prod NAME READY STATUS RESTARTS AGE pod/myapp-87c99f65c-hvs2b 1/1 Running 0 10s pod/myapp-87c99f65c-kzhgk 1/1 Running 0 10s pod/myapp-87c99f65c-zlpl8 1/1 Running 0 10s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/myapp ClusterIP 10.99.161.128 <none> 80/TCP 10s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp 3/3 3 3 10s NAME DESIRED CURRENT READY AGE replicaset.apps/myapp-87c99f65c 3 3 3 10s ``` ## 其他操作 在进行持续部署的时候每次都需要修改镜像地址为最新的版本,使用kustomize也可以简单的实现。<br />加入我们要修改test环境下的镜像地址为nginx,命令如下 ```yaml cd overlays/test kustomize edit set image monopole/hello=nginx:latest ``` 同样,修改namespace可以使用如下命令。 ```yaml kustomize edit set namespace test ```
Nathan
June 22, 2024, 12:48 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password