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
1. 安全上下文
# 简介 在我们使用某些镜像挂载持久化存储后,经常遇到提示无权限写入的问题,这就是因为持久化存储目录用户和用户组为root,而容器运行用户非root导致,此时就需要使用安全上下文解决这个问题。<br />安全上下文定义 Pod 或 Container 的特权与访问控制设置。 安全上下文包括但不限于: - 自主访问控制(Discretionary Access Control): 基于用户 ID(UID)和组 ID(GID) 来判定对对象(例如文件)的访问权限。 - 安全性增强的 Linux(SELinux): 为对象赋予安全性标签。 - 以特权模式或者非特权模式运行。 - Linux 权能: 为进程赋予 root 用户的部分特权而非全部特权。 - AppArmor:使用程序配置来限制个别程序的权能。 - Seccomp:过滤进程的系统调用。 - allowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs标志。 当容器满足一下条件之一时,allowPrivilegeEscalation 总是为 true: - 以特权模式运行,或者 - 具有 CAP_SYS_ADMIN 权能 - readOnlyRootFilesystem:以只读方式加载容器的根文件系统。 # 设置pod安全性上下文 ## 配置字段 runAsUser字段:指定Pod中的所有容器内的进程都使用指定用户ID来运行。<br />runAsGroup 字段:指定所有容器中的进程都以主组 ID来运行。 如果忽略此字段,则容器的主组 ID 将是 root(0)。<br />fsGroup字段:容器中挂载卷及在该卷中创建的任何文件的属主都会是指定组ID。 ## 示例文件 ```yaml [root@k8s-master ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: mypod labels: name: mypod spec: containers: - name: mypod image: busybox command: [ "sh", "-c", "sleep 1h" ] volumeMounts: - name: data mountPath: /data/demo securityContext: runAsUser: 1000 # pod进程用户id runAsGroup: 3000 # pod进程用户组id fsGroup: 2000 # 挂载卷文件组id volumes: - name: data emptyDir: {} [root@k8s-master ~]# kubectl apply -f pod.yaml pod/mypod created [root@k8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 26s ``` ## 验证 ```bash # 进入容器 [root@k8s-master ~]# kubectl exec -it mypod -- sh # 查看进程信息,用户id为1000 / $ ps PID USER TIME COMMAND 1 1000 0:00 sleep 1h 7 1000 0:00 sh 13 1000 0:00 ps # 容器内创建文件,查看文件权限,用户组id为3000 / $ echo hello > /tmp/tmpfile / $ ls -l /tmp/tmpfile -rw-r--r-- 1 1000 3000 6 Jun 2 07:43 /tmp/tmpfile # 挂载卷内创建文件,查看文件权限,用户id为1000,用户组id为2000 / $ ls -l /data/demo/ total 4 -rw-r--r-- 1 1000 2000 6 Jun 2 07:38 testfile / $ ls -l /data/demo/testfile -rw-r--r-- 1 1000 2000 6 Jun 2 07:38 /data/demo/testfile ``` # 为container设置安全性上下文 除了可以对pod设置安全性上下文外,若一个pod中存在多个container,可以为每个containe单独设置安全性上下文,container的优先级高于pod。 ## 示例文件 ```yaml [root@k8s-master ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: mypod labels: name: mypod spec: containers: - name: polic1 image: busybox command: [ "sh", "-c", "sleep 1h" ] securityContext: runAsUser: 1100 - name: polic2 image: busybox command: [ "sh", "-c", "sleep 1h" ] securityContext: runAsGroup: 1200 securityContext: runAsUser: 1000 runAsGroup: 3000 [root@k8s-master ~]# kubectl apply -f pod.yaml pod/mypod created ``` ## 验证 查看polic1的安全信息 ```bash [root@k8s-master ~]# kubectl exec -it mypod -c polic1 -- sh # 查看用户ID信息,虽然pod指定用户id为1000,但是container指定用户id为1100,因此显示1100 / $ ps PID USER TIME COMMAND 1 1100 0:00 sleep 1h 19 1100 0:00 sh 25 1100 0:00 ps / $ echo hello > /tmp/file # 查看用户组ID信息,container未设置,使用pod设置的用户组id / $ ls -l /tmp/file -rw-r--r-- 1 1100 3000 6 Jun 2 08:01 /tmp/file ``` 查看polic2的信息,与container1同理 ```bash [root@k8s-master ~]# kubectl exec -it mypod -c polic2 -- sh / $ ps PID USER TIME COMMAND 1 1000 0:00 sleep 1h 7 1000 0:00 sh 13 1000 0:00 ps / $ echo hello > /tmp/file / $ ls -l /tmp/file -rw-r--r-- 1 1000 1200 6 Jun 2 08:01 /tmp/file ``` # pod访问目录权限不足问题 ## 目录指定权限问题 例如在部署pgsql过程中,要求数据目录必须为700,此时就需要在init过程中修改数据目录权限,yaml文件如下: ```yaml initContainers: - name: fix-permissions image: busybox:1.28.4-glibc command: ["sh", "-c", "chmod -R 700 /var/lib/postgresql; chown 999:999 /var/lib/postgresql"] securityContext: privileged: true # 特权模式执行 volumeMounts: - name: data mountPath: /var/lib/postgresql containers: - name: postgresql image: postgresql imagePullPolicy: IfNotPresent ports: - name: postgres containerPort: 5432 volumeMounts: - mountPath: /var/lib/postgresql name: data volumes: - name: data persistentVolumeClaim: claimName: postgresql-pvc ``` # 挂载hostPath无法创建文件问题 例如使用hostPath方式挂载宿主机目录,创建文件时会有以下报错。 ```bash httpd@hostpath-volume:/test-volume$ touch 123 touch: cannot touch '123': Permission denied ``` **问题的根源**<br />容器挂载hostPath写入时报错Permission denied时基本都是容器运行用户不是root的情况下,这就说明,启动容器的用户没有权限在宿主机中属主属组为root的目录或者文件中写入。 ## 方案1:赋予运行容器的用户写权限 只要赋予运行容器的用户写权限,这个问题就解决了。<br />**查看容器uid** ```bash ## 容器内 httpd@hostpath-volume:/test-volume$ id uid=1000(httpd) gid=1000(httpd) groups=1000(httpd) ``` **赋予宿主机对应uid用户权限**<br />如果没有相同uid的用户,则创建一个对应用户即可:useradd -u 1000 httpd ```bash ## 宿主机 chown httpd:httpd test/ ## 容器内 httpd@hostpath-volume:/test-volume$ touch 11 22 33 httpd@hostpath-volume:/test-volume$ ls 11 22 33 ``` ## 方案2:让pod以root用户运行 ```bash apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 0 runAsGroup: 0 fsGroup: 0 ```
Nathan
June 22, 2024, 12:46 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password