1. Kubernetes 1.27集群初始化指南概述

Kubernetes作为当前容器编排领域的事实标准,其集群初始化是每个运维人员和开发者的必修课。1.27版本带来了多项改进,包括更高效的kubelet资源管理、增强的调度器性能以及更稳定的API服务。对于刚接触Kubernetes的新手来说,集群初始化往往是第一个需要跨越的门槛;而对于有经验的用户,每次版本更新都可能意味着初始化流程的细微变化需要重新适应。

在实际工作中,我发现很多人在初始化集群时容易陷入几个典型误区:要么过于依赖自动化工具而忽略底层原理,要么死记硬背命令而不理解参数含义,还有人在遇到网络问题时束手无策。本文将基于1.27版本特性,带你从零开始构建生产可用的Kubernetes集群,同时解释每个步骤背后的设计考量。

2. 环境准备与系统配置

2.1 硬件资源规划

对于生产环境,建议至少准备:

  • 控制平面节点:4核CPU/8GB内存/100GB存储(SSD优先)
  • 工作节点:根据工作负载调整,建议8核CPU/16GB内存起
  • 网络:节点间延迟<1ms,带宽≥1Gbps

测试环境可使用更低配置,但要注意:

  • 单节点集群至少需要2核CPU/4GB内存
  • 使用SSD可显著提升etcd性能
  • 交换分区必须禁用( sudo swapoff -a 并永久注释/etc/fstab中的swap行)

重要提示:所有节点的时间必须同步(NTP服务),时区设置一致,否则会导致证书验证失败等诡异问题。

2.2 操作系统要求

推荐使用以下经过验证的Linux发行版:

  • Ubuntu 20.04/22.04 LTS
  • CentOS 7/8 Stream
  • RHEL 8/9

内核版本要求≥5.4,需开启以下内核模块:

lsmod | grep -e overlay -e br_netfilter

若未加载,需执行:

sudo modprobe overlay
sudo modprobe br_netfilter

2.3 网络预配置

确保满足以下条件:

  1. 各节点hostname解析正确(/etc/hosts或DNS)
  2. 防火墙放行必要端口:
    • 控制平面:6443, 2379-2380, 10250, 10259, 10257
    • 工作节点:10250, 30000-32767
  3. 启用IP转发和桥接流量:
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

3. 容器运行时安装与配置

3.1 containerd安装

  1. 安装依赖:
sudo apt-get update && sudo apt-get install -y \
    containerd runc
  1. 生成默认配置并启用systemd cgroup:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
  1. 重启服务:
sudo systemctl restart containerd
sudo systemctl enable containerd

3.2 CRI-O方案(替代选项)

如需使用CRI-O:

# Ubuntu示例
OS=xUbuntu_22.04
VERSION=1.27
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | sudo apt-key add -
sudo apt-get update && sudo apt-get install -y cri-o cri-o-runc

4. Kubernetes组件安装

4.1 软件源配置

sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.27/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.27/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4.2 组件安装

指定版本安装(避免自动升级导致意外):

sudo apt-get update && sudo apt-get install -y \
    kubelet=1.27.4-1.1 \
    kubeadm=1.27.4-1.1 \
    kubectl=1.27.4-1.1
sudo apt-mark hold kubelet kubeadm kubectl

5. 控制平面初始化

5.1 初始化命令解析

典型初始化命令:

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.1.100 \
  --control-plane-endpoint=cluster.example.com:6443 \
  --upload-certs

关键参数说明:

  • --pod-network-cidr :必须与后续安装的CNI插件匹配
  • --apiserver-advertise-address :指定API服务器监听地址
  • --control-plane-endpoint :高可用集群的负载均衡器地址
  • --upload-certs :自动分发证书到其他控制平面节点

5.2 初始化后操作

  1. 配置kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 保存join命令:
kubeadm token create --print-join-command > join-command.sh
  1. 检查组件状态:
kubectl get pods -n kube-system

6. 网络插件安装

6.1 Flannel部署

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

验证安装:

kubectl get pods -n kube-system -l app=flannel

6.2 Calico方案(替代选项)

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

7. 工作节点加入集群

7.1 标准加入流程

在工作节点执行之前保存的join命令:

sudo $(cat join-command.sh)

7.2 节点状态检查

在控制平面执行:

kubectl get nodes

正常状态应为Ready:

NAME       STATUS   ROLES           AGE   VERSION
master01   Ready    control-plane   10m   v1.27.4
worker01   Ready    <none>          2m    v1.27.4

8. 常见问题排查

8.1 初始化卡住问题

现象:kubeadm init长时间无响应 排查步骤:

  1. 检查容器运行时日志:
journalctl -u containerd -f
  1. 查看kubelet状态:
systemctl status kubelet
  1. 常见原因:
    • 镜像拉取失败(配置国内镜像源)
    • 端口冲突(检查6443等端口占用)
    • 证书问题(删除/etc/kubernetes/重新初始化)

8.2 网络连通性问题

现象:Pod间无法通信或无法访问服务 排查工具:

# 检查网络策略
kubectl get networkpolicy -A

# 测试DNS解析
kubectl run -it --rm --image=busybox:1.28 test-dns -- nslookup kubernetes.default

8.3 证书过期处理

查看证书有效期:

kubeadm certs check-expiration

更新证书:

kubeadm certs renew all
systemctl restart kubelet

9. 生产环境增强配置

9.1 审计日志启用

修改/etc/kubernetes/manifests/kube-apiserver.yaml:

spec:
  containers:
  - command:
    - kube-apiserver
    - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
    - --audit-log-path=/var/log/kubernetes/audit/audit.log
    - --audit-log-maxage=30
    - --audit-log-maxbackup=10
    - --audit-log-maxsize=100

9.2 资源限制配置

kubelet配置示例(/var/lib/kubelet/config.yaml):

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
  memory.available: "500Mi"
  nodefs.available: "10%"
  nodefs.inodesFree: "5%"
  imagefs.available: "15%"

10. 集群验证与测试

10.1 基本功能测试

部署测试应用:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

验证服务访问:

curl http://$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}'):$(kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}')

10.2 性能基准测试

使用kube-bench进行CIS基准测试:

docker run --rm --pid=host -v /etc:/etc:ro -v /var:/var:ro -t aquasec/kube-bench:latest run

11. 版本升级策略

11.1 控制平面升级

  1. 先升级kubeadm:
sudo apt-get update && sudo apt-get install -y kubeadm=1.27.5-1.1
  1. 执行升级计划:
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.27.5
  1. 升级节点组件:
sudo apt-get update && sudo apt-get install -y kubelet=1.27.5-1.1 kubectl=1.27.5-1.1
sudo systemctl daemon-reload
sudo systemctl restart kubelet

11.2 工作节点升级

  1. 排空节点:
kubectl drain <node-name> --ignore-daemonsets
  1. 升级组件后取消排空:
kubectl uncordon <node-name>

12. 备份与恢复方案

12.1 etcd数据备份

ETCDCTL_API=3 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save snapshot.db

12.2 关键配置备份

# 备份证书和配置文件
sudo tar czvf k8s-backup-$(date +%Y%m%d).tar.gz \
  /etc/kubernetes/pki \
  /etc/kubernetes/*.conf \
  /var/lib/kubelet/config.yaml

13. 安全加固建议

13.1 RBAC最小权限

创建服务账户示例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: limited-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
subjects:
- kind: ServiceAccount
  name: limited-user
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

13.2 Pod安全策略

使用PodSecurity Admission:

apiVersion: v1
kind: Namespace
metadata:
  name: restricted
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/warn: restricted

14. 监控与日志方案

14.1 基础监控部署

使用kube-prometheus-stack:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace

14.2 日志收集方案

EFK栈部署示例:

helm install elasticsearch elastic/elasticsearch --namespace logging
helm install fluent-bit fluent/fluent-bit --namespace logging
helm install kibana elastic/kibana --namespace logging

15. 存储方案集成

15.1 Local PV配置

创建存储类:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

15.2 NFS动态供应

使用nfs-subdir-external-provisioner:

helm install nfs-subdir-external-provisioner \
  nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=192.168.1.200 \
  --set nfs.path=/data/nfs

16. 高可用架构设计

16.1 控制平面高可用

使用kube-vip实现负载均衡:

kube-vip manifest pod \
  --interface eth0 \
  --vip 192.168.1.150 \
  --controlplane \
  --bgp \
  --localAS 65000 \
  --peerAS 65000 \
  --peerAddress 192.168.1.1 \
  --peerPass myBGPpass | kubectl apply -f -

16.2 工作节点自动扩展

集群自动扩缩容配置:

apiVersion: "autoscaling.k8s.io/v1"
kind: ClusterAutoscaler
metadata:
  name: cluster-autoscaler
spec:
  scaleDownDelayAfterAdd: 10m
  scaleDownUnneededTime: 5m
  resourceLimits:
    maxNodesTotal: 20
  cloudProvider: aws

17. 性能调优技巧

17.1 kubelet参数优化

调整/var/lib/kubelet/config.yaml:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
maxPods: 150
kubeAPIQPS: 50
kubeAPIBurst: 100
serializeImagePulls: false

17.2 调度器配置

自定义调度器profile:

apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: default-scheduler
    plugins:
      preScore:
        enabled:
          - name: NodeResourcesFit
          - name: InterPodAffinity

18. 多集群管理方案

18.1 kubefed部署

安装Kubefed控制平面:

helm install kubefed kubefed-charts/kubefed \
  --namespace kube-federation-system \
  --create-namespace \
  --set global.scope=Cluster

18.2 集群注册

加入成员集群:

kubefedctl join cluster1 \
  --cluster-context cluster1 \
  --host-cluster-context federation-host \
  --v=2

19. 服务网格集成

19.1 Istio安装

使用istioctl安装:

istioctl install --set profile=demo -y
kubectl label namespace default istio-injection=enabled

19.2 Linkerd方案

替代安装方案:

curl -sL https://run.linkerd.io/install | sh
linkerd install | kubectl apply -f -
linkerd check

20. 持续交付流水线

20.1 Argo CD部署

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

20.2 Tekton方案

替代CI/CD方案:

kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

21. 故障演练方案

21.1 Chaos Mesh安装

helm install chaos-mesh chaos-mesh/chaos-mesh --namespace=chaos-testing --create-namespace --set chaosDaemon.runtime=containerd --set chaosDaemon.socketPath=/run/containerd/containerd.sock

21.2 网络故障注入

模拟网络延迟:

apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
  name: network-delay
spec:
  action: delay
  mode: one
  selector:
    namespaces:
      - default
    labelSelectors:
      "app": "nginx"
  delay:
    latency: "100ms"
    correlation: "100"
    jitter: "10ms"

22. 自定义扩展开发

22.1 准入控制器开发

示例Webhook配置:

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: example-webhook
webhooks:
- name: example-webhook.example.com
  rules:
  - operations: ["CREATE"]
    apiGroups: [""]
    apiVersions: ["v1"]
    resources: ["pods"]
  clientConfig:
    service:
      name: webhook-service
      namespace: default
      path: "/mutate"
  admissionReviewVersions: ["v1"]
  sideEffects: None

22.2 自定义资源定义

CRD示例:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myresources.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                size:
                  type: integer
                image:
                  type: string
  scope: Namespaced
  names:
    plural: myresources
    singular: myresource
    kind: MyResource

23. 混合云部署策略

23.1 跨云集群连接

使用Submariner实现:

subctl deploy-broker --kubeconfig cluster1-config
subctl join --kubeconfig cluster2-config broker-info.subm --clusterid cluster2

23.2 应用分发策略

使用Karmada:

karmadactl init --karmada-context karmada-host --cluster-context cluster1
karmadactl join cluster2 --cluster-context cluster2

24. 边缘计算场景

24.1 KubeEdge部署

云端组件:

keadm init --kubeedge-version=1.12.0 --advertise-address=192.168.1.100

边缘节点:

keadm join --cloudcore-ipport=192.168.1.100:10000 --token=xxxx

24.2 OpenYurt方案

替代边缘方案:

yurtctl convert --provider kubeadm --cloud-nodes node1

25. 成本优化实践

25.1 资源请求优化

使用Vertical Pod Autoscaler:

helm install vpa recommender \
  --repo https://charts.fairwinds.com/stable \
  --namespace vpa-system \
  --create-namespace

25.2 闲置资源回收

使用Descheduler:

helm install descheduler descheduler \
  --repo https://kubernetes-sigs.github.io/descheduler/ \
  --namespace kube-system \
  --set cmdOptions.v=3

26. 安全扫描方案

26.1 Trivy部署

扫描集群漏洞:

trivy k8s --report summary cluster

26.2 Kube-bench使用

CIS基准测试:

docker run --rm --pid=host -v /etc:/etc:ro -v /var:/var:ro -t aquasec/kube-bench:latest run --targets=master,node

27. 备份与迁移工具

27.1 Velero配置

安装与备份:

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.5.0 \
  --bucket my-backup-bucket \
  --backup-location-config region=us-west-2 \
  --snapshot-location-config region=us-west-2

velero backup create daily-backup --include-namespaces=production

27.2 Kasten K10

企业级方案:

helm install k10 kasten/k10 --namespace=kasten-io --create-namespace

28. 网络策略实战

28.1 默认拒绝策略

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

28.2 应用间隔离

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: frontend-allow-backend
spec:
  podSelector:
    matchLabels:
      app: frontend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: backend
    ports:
    - protocol: TCP
      port: 8080

29. 自定义调度策略

29.1 节点亲和性示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gpu-app
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: accelerator
                operator: In
                values:
                - nvidia-tesla-v100

29.2 自定义调度器

开发示例:

func prioritizeNodes(pod *v1.Pod, nodes []*v1.Node) (schedulerapi.HostPriorityList, error) {
    var priorityList schedulerapi.HostPriorityList
    for _, node := range nodes {
        priorityList = append(priorityList, schedulerapi.HostPriority{
            Host:  node.Name,
            Score: calculateScore(pod, node),
        })
    }
    return priorityList, nil
}

30. 集群运维自动化

30.1 使用Cluster API

创建管理集群:

clusterctl init --infrastructure=aws
clusterctl generate cluster my-cluster --flavor=dev --kubernetes-version=v1.27.4 | kubectl apply -f -

30.2 GitOps实践

Argo CD应用示例:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: production-apps
spec:
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  source:
    repoURL: https://github.com/myorg/cluster-manifests.git
    path: production
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

31. 内核参数调优

31.1 关键参数配置

/etc/sysctl.d/99-k8s.conf示例:

# 提升连接跟踪表大小
net.netfilter.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_timeout_established=86400

# 优化网络性能
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

31.2 内存管理优化

# 减少交换倾向
vm.swappiness=10

# 透明大页禁用(某些工作负载需要)
vm.nr_hugepages=0

32. 证书管理进阶

32.1 自定义CA部署

使用cfssl生成CA:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

配置kubeadm使用自定义CA:

kubeadm init --control-plane-endpoint=cluster.example.com \
  --upload-certs \
  --cert-dir=/etc/kubernetes/pki/custom \
  --apiserver-cert-extra-sans=DNS:cluster.example.com,IP:192.168.1.100

32.2 证书轮换自动化

使用cert-manager:

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.11.0 \
  --set installCRDs=true

33. 节点维护操作

33.1 安全排空流程

# 标记节点不可调度
kubectl cordon <node-name>

# 驱逐所有Pod(忽略DaemonSet)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data --force

# 维护完成后恢复
kubectl uncordon <node-name>

33.2 节点问题诊断

检查节点状况:

kubectl describe node <node-name>
kubectl get events --field-selector involvedObject.name=<node-name>

查看节点资源:

kubectl top node <node-name>

34. 自定义指标扩展

34.1 Prometheus适配器

部署自定义指标API:

helm install prometheus-adapter prometheus-community/prometheus-adapter \
  --namespace monitoring \
  --set prometheus.url=http://prometheus-server.monitoring.svc

34.2 自定义HPA

基于自定义指标的扩缩容:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: requests_per_second
      target:
        type: AverageValue
        averageValue: 500

35. 服务暴露策略

35.1 Ingress控制器

安装Nginx Ingress:

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.service.type=LoadBalancer

35.2 Gateway API

使用Gateway API替代Ingress:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: web-gateway
spec:
  gatewayClassName: nginx
  listeners:
  - protocol: HTTP
    port: 80
    name: web
    allowedRoutes:
      namespaces:
        from: Same

36. 数据持久化方案

36.1 CSI驱动集成

安装AWS EBS CSI驱动:

helm install aws-ebs-csi-driver \
  https://github.com/kubernetes-sigs/aws-ebs-csi-driver/releases/download/helm-chart-aws-ebs-csi-driver-2.18.0/aws-ebs-csi-driver-2.18.0.tgz \
  --namespace kube-system \
  --set controller.serviceAccount.create=false \
  --set controller.serviceAccount.name=ebs-csi-controller-sa

36.2 卷快照管理

创建VolumeSnapshotClass:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: ebs-snapclass
driver: ebs.csi.aws.com
deletionPolicy: Delete

37. 密钥管理方案

37.1 使用Secrets Store CSI

集成Azure Key Vault:

helm install csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver \
  --namespace kube-system \
  --set syncSecret.enabled=true

37.2 Vault集成

部署Vault注入器:

helm install vault hashicorp/vault \
  --namespace vault \
  --create-namespace \
  --set server.dev.enabled=true \
  --set injector.enabled=true

38. 策略即代码实践

38.1 OPA Gatekeeper

安装策略引擎:

helm install gatekeeper gatekeeper/gatekeeper \
  --namespace gatekeeper-system \
  --create-namespace

38.2 自定义约束模板

示例模板:

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels
      validation:
        openAPIV3Schema:
          properties:
            labels:
              type: array
              items: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels
        violation[{"msg": msg, "details": {"missing_labels": missing}}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("必须包含以下标签: %v", [missing])
        }

39. 机器学习支持

39.1 Kubeflow部署

完整套件安装:

kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/cluster-scoped-resources?ref=1.8.0"
kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/platform-agnostic-pns?ref=1.8.0"

39.2 自定义资源调度

GPU节点调度:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
  - name: cuda-container
    image: nvidia/cuda:11.0-base
    resources:
      limits:
        nvidia.com/gpu: 2
  nodeSelector:
    accelerator: nvidia-tesla-v100

40. Windows节点支持

40.1 Windows节点加入

准备步骤:

  1. 安装Windows容器功能
  2. 配置Containerd运行时
  3. 执行kubeadm join

40.2 混合调度策略

节点选择器示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: windows-app
spec:
  template:
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      tolerations:
      - key: "os"
        operator: "Equal"
        value: "windows"
        effect: "NoSchedule"

41. 大规模集群优化

41.1 分片etcd配置

启动参数示例:

ETCDCTL_API=3 etcd \
  --name etcd1 \
  --data-dir /var/lib/etcd \
  --initial-cluster-token my-etcd-cluster \
  --initial-cluster etcd1=http://10.0.1.10:2380,etcd2=http://10.0.1.11:2380,etcd3=http://10.0.1.12:2380 \
  --initial-advertise-peer-urls http://10.0.1.10:2380 \
  --listen-peer-urls http://10.0.1.10:2380 \
  --listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://10.0.1.10:2379 \
  --initial-cluster-state new \
  --heartbeat-interval 250 \
  --election-timeout 1250

41.2 API服务器调优

kube-apiserver参数:

--max-requests-inflight=1500
--max-mutating-requests-inflight=500
--watch-cache-sizes=secrets=1000,configmaps=1000

42. 零信任安全模型

42.1 SPIFFE身份认证

部署SPIRE服务器:

helm install spire spire/spire \
  --namespace spire-system \
  --create-namespace \
  --set spire-server.dataStore.sql.password=MyStrongPassword

42.2 服务间mTLS

使用Linkerd自动mTLS:

linkerd inject deployment/my-app | kubectl apply -f -

43. 无服务器架构支持

43.1

更多推荐