From ec0fa158357976440c72cb09e2e1144023ce3f89 Mon Sep 17 00:00:00 2001 From: yeasy Date: Fri, 22 May 2026 00:53:38 -0700 Subject: [PATCH] docs(content): harden Kubernetes and supply-chain examples --- 13_kubernetes_concepts/README.md | 2 +- 18_security/18.3_daemon_sec.md | 6 ++++-- 18_security/18.6_image_security.md | 18 ++++++++---------- 21_case_devops/21.1_devops_workflow.md | 3 ++- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/13_kubernetes_concepts/README.md b/13_kubernetes_concepts/README.md index d2b4a54..fcc27e8 100644 --- a/13_kubernetes_concepts/README.md +++ b/13_kubernetes_concepts/README.md @@ -6,7 +6,7 @@ Kubernetes 的最小调度单位是 `Pod`。一个 `Pod` 由一组紧密协作的容器构成,它们共享网络命名空间、IP 以及部分存储资源,也可以根据需要对 Pod 进行端口映射。 -如果你已经熟悉 Docker,可以用以下对照来理解 Kubernetes 的核心概念:Docker 中的"容器"对应 Kubernetes 的 `Pod`(一个或多个容器的组合);`docker-compose.yml` 的角色类似于 Kubernetes 的 `Deployment` + `Service` 声明;`docker run` 的端口映射和网络配置,在 Kubernetes 中由 `Service` 和 `Ingress` 接管。掌握这些映射关系,有助于从单机 Docker 平滑过渡到集群编排。 +如果你已经熟悉 Docker,可以用以下对照来理解 Kubernetes 的核心概念:Docker 中的“容器”对应 Kubernetes 的 `Pod`(一个或多个容器的组合);`docker-compose.yml` 的角色类似于 Kubernetes 的 `Deployment` + `Service` 声明;`docker run` 的端口映射和网络配置,在 Kubernetes 中由 `Service` 和 `Ingress` 接管。掌握这些映射关系,有助于从单机 Docker 平滑过渡到集群编排。 本章将分为 5 节介绍 `Kubernetes`: diff --git a/18_security/18.3_daemon_sec.md b/18_security/18.3_daemon_sec.md index e1459db..b501ac5 100644 --- a/18_security/18.3_daemon_sec.md +++ b/18_security/18.3_daemon_sec.md @@ -68,9 +68,11 @@ $ sudo apt-get install uidmap $ su - testuser ``` -3. 运行 Docker 官方提供的 Rootless 安装脚本: +3. 下载并检查 Docker 官方提供的 Rootless 安装脚本,确认来源和内容后再执行: ```bash -$ curl -fsSL https://get.docker.com/rootless | sh +$ curl -fsSL https://get.docker.com/rootless -o install-rootless-docker.sh +$ less install-rootless-docker.sh +$ sh install-rootless-docker.sh ``` 4. 配置环境变量指向新创建的私有 socket: diff --git a/18_security/18.6_image_security.md b/18_security/18.6_image_security.md index 109fea5..1a548b4 100644 --- a/18_security/18.6_image_security.md +++ b/18_security/18.6_image_security.md @@ -502,29 +502,29 @@ variables: build: stage: build - image: docker:latest + image: docker:-cli@sha256: services: - - docker:dind + - name: docker:-dind@sha256: script: - docker build -t $IMAGE_NAME:$CI_COMMIT_SHA . - docker save $IMAGE_NAME:$CI_COMMIT_SHA > image.tar scan:trivy: stage: scan - image: aquasec/trivy:latest + image: aquasec/trivy:@sha256: script: - trivy image --severity HIGH,CRITICAL --exit-code 1 docker-archive://image.tar allow_failure: false scan:grype: stage: scan - image: anchore/grype:latest + image: anchore/grype:@sha256: script: - grype docker-archive://image.tar generate:sbom: stage: scan - image: anchore/syft:latest + image: anchore/syft:@sha256: script: - syft docker-archive://image.tar -o cyclonedx > sbom.xml artifacts: @@ -533,9 +533,9 @@ generate:sbom: push: stage: push - image: docker:latest + image: docker:-cli@sha256: services: - - docker:dind + - name: docker:-dind@sha256: script: - docker load < image.tar - echo "$REGISTRY_PASSWORD" | docker login --username "$REGISTRY_USER" --password-stdin "$REGISTRY" @@ -550,13 +550,11 @@ push: sign: stage: sign - image: gcr.io/projectsigstore/cosign:latest + image: gcr.io/projectsigstore/cosign:@sha256: script: - cosign sign --key $COSIGN_KEY "$(cat image-digest.txt)" only: - main - only: - - main ``` ### 18.6.6 常见问题与最佳实践 diff --git a/21_case_devops/21.1_devops_workflow.md b/21_case_devops/21.1_devops_workflow.md index e24be4a..a43107d 100644 --- a/21_case_devops/21.1_devops_workflow.md +++ b/21_case_devops/21.1_devops_workflow.md @@ -66,7 +66,8 @@ deploy_staging: stage: deploy image: dtzar/helm-kubectl script: - - kubectl config set-cluster k8s --server=$KUBE_URL --insecure-skip-tls-verify=true + - printf '%s' "$KUBE_CA_PEM" > kube-ca.crt + - kubectl config set-cluster k8s --server=$KUBE_URL --certificate-authority=kube-ca.crt --embed-certs=true - kubectl config set-credentials admin --token=$KUBE_TOKEN - kubectl config set-context default --cluster=k8s --user=admin - kubectl config use-context default