活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

在CentOS Stream上搭建高可用Kubernetes集群的详细配置实例与最佳实践包括负载均衡故障恢复和性能优化

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-12 17:20:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 引言

Kubernetes已经成为容器编排的事实标准,它提供了自动化部署、扩展和管理容器化应用程序的能力。在生产环境中,确保Kubernetes集群的高可用性至关重要,因为任何单点故障都可能导致服务中断,影响业务连续性。

CentOS Stream是CentOS项目的一个滚动发布版本,它位于RHEL的上游,提供了一个稳定且前瞻性的平台,非常适合部署Kubernetes集群。本文将详细介绍如何在CentOS Stream上搭建高可用Kubernetes集群,包括负载均衡配置、故障恢复机制和性能优化的最佳实践。

2. 环境准备

2.1 硬件要求

在开始部署之前,我们需要规划合适的硬件资源。对于一个高可用的Kubernetes集群,至少需要以下配置:

• 控制平面节点:至少3个,每个节点至少2核CPU、4GB内存
• 工作节点:至少2个,每个节点至少2核CPU、4GB内存
• 负载均衡节点:至少2个(可以是虚拟机或物理机)
• 所有节点之间的网络连接稳定,延迟低

2.2 网络规划

我们需要为集群规划以下网络:

• 节点IP:静态IP地址,确保节点间通信
• Pod网络:通常使用CIDR如10.244.0.0/16
• Service网络:通常使用CIDR如10.96.0.0/12
• 虚拟IP:用于API服务器负载均衡的浮动IP

2.3 系统初始化

在所有节点上执行以下初始化步骤:

首先,更新系统:
  1. sudo dnf update -y
复制代码

安装必要的软件包:
  1. sudo dnf install -y curl vim wget git net-tools bind-utils
复制代码

禁用SELinux(或者适当配置SELinux策略):
  1. sudo setenforce 0
  2. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
复制代码

禁用swap:
  1. sudo swapoff -a
  2. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
复制代码

配置内核参数:
  1. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  2. br_netfilter
  3. EOF
  4. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  5. net.bridge.bridge-nf-call-ip6tables = 1
  6. net.bridge.bridge-nf-call-iptables = 1
  7. net.ipv4.ip_forward = 1
  8. EOF
  9. sudo sysctl --system
复制代码

3. 基础组件安装

3.1 安装容器运行时

Kubernetes支持多种容器运行时,如Docker、containerd等。这里我们选择containerd,因为它是Kubernetes推荐的容器运行时。

安装containerd:
  1. sudo dnf install -y containerd
复制代码

配置containerd:
  1. sudo mkdir -p /etc/containerd
  2. sudo containerd config default | sudo tee /etc/containerd/config.toml
  3. sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
  4. sudo systemctl restart containerd
  5. sudo systemctl enable containerd
复制代码

3.2 安装Kubernetes组件

添加Kubernetes仓库:
  1. cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
  9. exclude=kubelet kubeadm kubectl
  10. EOF
复制代码

安装kubelet、kubeadm和kubectl:
  1. sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  2. sudo systemctl enable --now kubelet
复制代码

4. 高可用控制平面部署

4.1 负载均衡器配置

在部署控制平面之前,我们需要先设置一个负载均衡器来分发API服务器的请求。这里我们使用HAProxy和Keepalived来实现。

在两个负载均衡节点上安装HAProxy和Keepalived:
  1. sudo dnf install -y haproxy keepalived
复制代码

配置HAProxy(/etc/haproxy/haproxy.cfg):
  1. frontend kubernetes-frontend
  2.     bind *:6443
  3.     mode tcp
  4.     option tcplog
  5.     default_backend kubernetes-backend
  6. backend kubernetes-backend
  7.     mode tcp
  8.     option tcp-check
  9.     balance roundrobin
  10.     server master1 192.168.1.11:6443 check
  11.     server master2 192.168.1.12:6443 check
  12.     server master3 192.168.1.13:6443 check
复制代码

配置Keepalived(/etc/keepalived/keepalived.conf):
  1. vrrp_script check_haproxy {
  2.     script "killall -0 haproxy"
  3.     interval 2
  4.     weight 2
  5. }
  6. vrrp_instance VI_1 {
  7.     state MASTER
  8.     interface eth0
  9.     virtual_router_id 51
  10.     priority 101
  11.     advert_int 1
  12.     authentication {
  13.         auth_type PASS
  14.         auth_pass your_secret_password
  15.     }
  16.     virtual_ipaddress {
  17.         192.168.1.10
  18.     }
  19.     track_script {
  20.         check_haproxy
  21.     }
  22. }
复制代码

在第二个负载均衡节点上,将Keepalived配置中的state改为BACKUP,priority改为100。

启动并启用HAProxy和Keepalived:
  1. sudo systemctl enable --now haproxy keepalived
复制代码

4.2 初始化第一个控制平面节点

在第一个主节点上,使用kubeadm初始化集群:
  1. sudo kubeadm init --control-plane-endpoint "192.168.1.10:6443" --upload-certs --pod-network-cidr=10.244.0.0/16
复制代码

初始化完成后,按照输出配置kubectl:
  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

保存加入控制平面和工作节点的命令,这些命令在初始化输出中提供。

4.3 加入其他控制平面节点

在其他控制平面节点上,使用第一个节点初始化时提供的加入命令:
  1. sudo kubeadm join 192.168.1.10:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
复制代码

5. 网络插件部署

Kubernetes需要网络插件来实现Pod之间的通信。这里我们选择Calico作为网络插件。

部署Calico:
  1. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
复制代码

等待Calico Pod部署完成:
  1. kubectl get pods -n kube-system -w
复制代码

6. 工作节点加入

在工作节点上,使用第一个节点初始化时提供的加入命令:
  1. sudo kubeadm join 192.168.1.10:6443 --token <token> --discovery-token-ca-cert-hash <hash>
复制代码

在控制平面节点上验证节点是否加入成功:
  1. kubectl get nodes
复制代码

7. 故障恢复机制

7.1 etcd备份与恢复

etcd是Kubernetes的关键组件,存储了集群的所有状态信息。定期备份etcd数据是必要的。

创建etcd备份脚本(/usr/local/bin/etcd-backup.sh):
  1. #!/bin/bash
  2. ETCDCTL_API=3
  3. ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
  4. ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
  5. ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
  6. BACKUP_DIR=/var/backups/etcd
  7. DATE=$(date +%Y%m%d_%H%M%S)
  8. mkdir -p ${BACKUP_DIR}
  9. etcdctl --endpoints=https://127.0.0.1:2379 \
  10.   --cacert=${ETCDCTL_CACERT} \
  11.   --cert=${ETCDCTL_CERT} \
  12.   --key=${ETCDCTL_KEY} \
  13.   snapshot save ${BACKUP_DIR}/snapshot-${DATE}.db
  14. # 保留最近7天的备份
  15. find ${BACKUP_DIR} -name "*.db" -mtime +7 -delete
复制代码

设置脚本可执行权限:
  1. chmod +x /usr/local/bin/etcd-backup.sh
复制代码

添加到cron定时任务:
  1. echo "0 0 * * * /usr/local/bin/etcd-backup.sh" | sudo crontab -
复制代码

恢复etcd备份:
  1. # 停止静态Pod
  2. sudo mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/manifests/etcd.yaml.bak
  3. # 恢复数据
  4. ETCDCTL_API=3
  5. ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
  6. ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
  7. ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key
  8. BACKUP_FILE=/var/backups/etcd/snapshot-YYYYMMDD_HHMMSS.db
  9. etcdctl --endpoints=https://127.0.0.1:2379 \
  10.   --cacert=${ETCDCTL_CACERT} \
  11.   --cert=${ETCDCTL_CERT} \
  12.   --key=${ETCDCTL_KEY} \
  13.   --data-dir /var/lib/etcd \
  14.   snapshot restore ${BACKUP_FILE}
  15. # 恢复静态Pod
  16. sudo mv /etc/kubernetes/manifests/etcd.yaml.bak /etc/kubernetes/manifests/etcd.yaml
复制代码

7.2 节点故障处理

当节点出现故障时,我们需要及时处理以维持集群的高可用性。

检查节点状态:
  1. kubectl get nodes
复制代码

如果节点处于NotReady状态,可以尝试以下步骤:

1. 检查节点上的kubelet服务状态:
  1. ssh <node-ip> sudo systemctl status kubelet
复制代码

1. 如果kubelet服务未运行,尝试启动它:
  1. ssh <node-ip> sudo systemctl start kubelet
复制代码

1. 检查节点上的容器运行时状态:
  1. ssh <node-ip> sudo systemctl status containerd
复制代码

1. 如果容器运行时未运行,尝试启动它:
  1. ssh <node-ip> sudo systemctl start containerd
复制代码

如果节点无法恢复,可以考虑将其从集群中移除:

1. 驱逐节点上的Pod:
  1. kubectl drain <node-name> --ignore-daemonsets --delete-local-data
复制代码

1. 从集群中删除节点:
  1. kubectl delete node <node-name>
复制代码

1. 在节点上重置kubeadm:
  1. ssh <node-ip> sudo kubeadm reset
复制代码

8. 性能优化

8.1 系统级优化

调整内核参数:
  1. cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-performance.conf
  2. # 增加文件描述符限制
  3. fs.file-max = 100000
  4. fs.inotify.max_user_instances = 8192
  5. fs.inotify.max_user_watches = 1048576
  6. # 网络优化
  7. net.core.somaxconn = 65535
  8. net.ipv4.tcp_max_syn_backlog = 65536
  9. net.core.netdev_max_backlog = 65536
  10. net.ipv4.tcp_fin_timeout = 10
  11. net.ipv4.tcp_keepalive_time = 1200
  12. net.ipv4.tcp_max_tw_buckets = 5000
  13. net.ipv4.tcp_tw_reuse = 1
  14. net.ipv4.tcp_tw_recycle = 0
  15. net.ipv4.ip_local_port_range = 1024 65000
  16. net.ipv4.tcp_rmem = 4096 87380 16777216
  17. net.ipv4.tcp_wmem = 4096 65536 16777216
  18. net.core.rmem_max = 16777216
  19. net.core.wmem_max = 16777216
  20. net.ipv4.tcp_slow_start_after_idle = 0
  21. # 虚拟内存优化
  22. vm.swappiness = 10
  23. vm.dirty_ratio = 60
  24. vm.dirty_background_ratio = 2
  25. EOF
  26. sudo sysctl --system
复制代码

调整文件描述符限制:
  1. cat <<EOF | sudo tee /etc/security/limits.d/kubernetes.conf
  2. * soft nofile 100000
  3. * hard nofile 100000
  4. * soft nproc 32768
  5. * hard nproc 32768
  6. EOF
复制代码

8.2 Kubernetes级优化

配置Kubelet资源管理:
  1. cat <<EOF | sudo tee /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf
  2. [Service]
  3. Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
  4. Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
  5. Environment="KUBELET_EXTRA_ARGS=--node-labels=node.kubernetes.io/exclude-from-external-load-balancers --cgroup-driver=systemd --max-pods=110 --eviction-hard=memory.available<500Mi,nodefs.available<10%,nodefs.inodesFree<5% --eviction-soft=memory.available<1Gi,nodefs.available<15%,nodefs.inodesFree<10% --eviction-soft-grace-period=1m30s --eviction-max-pod-grace-period=60"
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart kubelet
复制代码

优化API服务器性能:
  1. # 编辑API服务器配置
  2. sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml
  3. # 添加或修改以下参数
  4. - --max-mutating-requests-inflight=3000
  5. - --max-requests-inflight=3000
  6. - --default-watch-cache-size=500
  7. - --watch-cache-sizes=resource#pods#1000,resource#events#2000
复制代码

8.3 应用级优化

使用资源请求和限制:
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: resource-pod
  5. spec:
  6.   containers:
  7.   - name: resource-container
  8.     image: nginx
  9.     resources:
  10.       requests:
  11.         memory: "64Mi"
  12.         cpu: "250m"
  13.       limits:
  14.         memory: "128Mi"
  15.         cpu: "500m"
复制代码

使用Pod亲和性和反亲和性优化调度:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-deployment
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: nginx
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: nginx
  14.     spec:
  15.       affinity:
  16.         podAntiAffinity:
  17.           requiredDuringSchedulingIgnoredDuringExecution:
  18.           - labelSelector:
  19.               matchExpressions:
  20.               - key: app
  21.                 operator: In
  22.                 values:
  23.                 - nginx
  24.             topologyKey: "kubernetes.io/hostname"
  25.       containers:
  26.       - name: nginx
  27.         image: nginx:1.14.2
  28.         ports:
  29.         - containerPort: 80
复制代码

使用Horizontal Pod Autoscaler自动扩展:
  1. apiVersion: autoscaling/v2beta2
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4.   name: nginx-hpa
  5. spec:
  6.   scaleTargetRef:
  7.     apiVersion: apps/v1
  8.     kind: Deployment
  9.     name: nginx-deployment
  10.   minReplicas: 3
  11.   maxReplicas: 10
  12.   metrics:
  13.   - type: Resource
  14.     resource:
  15.       name: cpu
  16.       target:
  17.         type: Utilization
  18.         averageUtilization: 50
  19.   - type: Resource
  20.     resource:
  21.       name: memory
  22.       target:
  23.         type: Utilization
  24.         averageUtilization: 70
复制代码

9. 监控与日志

9.1 部署Prometheus和Grafana

使用Helm部署Prometheus Operator:
  1. # 添加Helm仓库
  2. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  3. helm repo update
  4. # 创建命名空间
  5. kubectl create namespace monitoring
  6. # 安装Prometheus Operator
  7. helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring
复制代码

访问Grafana:
  1. # 获取Grafana密码
  2. kubectl get secret --namespace monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
  3. # 端口转发
  4. kubectl port-forward --namespace monitoring svc/prometheus-grafana 3000:80
复制代码

9.2 部署ELK日志系统

部署Elasticsearch:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: elasticsearch
  5.   namespace: logging
  6.   labels:
  7.     app: elasticsearch
  8. spec:
  9.   ports:
  10.   - port: 9200
  11.     name: http
  12.   clusterIP: None
  13.   selector:
  14.     app: elasticsearch
  15. ---
  16. apiVersion: apps/v1
  17. kind: StatefulSet
  18. metadata:
  19.   name: elasticsearch
  20.   namespace: logging
  21. spec:
  22.   serviceName: "elasticsearch"
  23.   replicas: 3
  24.   selector:
  25.     matchLabels:
  26.       app: elasticsearch
  27.   template:
  28.     metadata:
  29.       labels:
  30.         app: elasticsearch
  31.     spec:
  32.       containers:
  33.       - name: elasticsearch
  34.         image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
  35.         ports:
  36.         - containerPort: 9200
  37.           name: http
  38.         env:
  39.         - name: discovery.type
  40.           value: "single-node"
  41.         resources:
  42.           limits:
  43.             cpu: 1000m
  44.             memory: 2Gi
  45.           requests:
  46.             cpu: 100m
  47.             memory: 1Gi
复制代码

部署Kibana:
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: kibana
  5.   namespace: logging
  6.   labels:
  7.     app: kibana
  8. spec:
  9.   ports:
  10.   - port: 5601
  11.   selector:
  12.     app: kibana
  13. ---
  14. apiVersion: apps/v1
  15. kind: Deployment
  16. metadata:
  17.   name: kibana
  18.   namespace: logging
  19. spec:
  20.   replicas: 1
  21.   selector:
  22.     matchLabels:
  23.       app: kibana
  24.   template:
  25.     metadata:
  26.       labels:
  27.         app: kibana
  28.     spec:
  29.       containers:
  30.       - name: kibana
  31.         image: docker.elastic.co/kibana/kibana:7.10.1
  32.         ports:
  33.         - containerPort: 5601
  34.         env:
  35.         - name: ELASTICSEARCH_HOSTS
  36.           value: "http://elasticsearch:9200"
  37.         resources:
  38.           limits:
  39.             cpu: 1000m
  40.             memory: 1Gi
  41.           requests:
  42.             cpu: 100m
  43.             memory: 512Mi
复制代码

部署Filebeat:
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: filebeat-config
  5.   namespace: logging
  6.   labels:
  7.     app: filebeat
  8. data:
  9.   filebeat.yml: |-
  10.     filebeat.inputs:
  11.     - type: container
  12.       paths:
  13.       - /var/log/containers/*.log
  14.       processors:
  15.       - add_kubernetes_metadata:
  16.           host: ${NODE_NAME}
  17.           matchers:
  18.           - logs_path:
  19.               logs_path: "/var/log/containers/"
  20.     output.elasticsearch:
  21.       hosts: ['${ELASTICSEARCH_HOST:elasticsearch}:9200']
  22. ---
  23. apiVersion: apps/v1
  24. kind: DaemonSet
  25. metadata:
  26.   name: filebeat
  27.   namespace: logging
  28.   labels:
  29.     app: filebeat
  30. spec:
  31.   selector:
  32.     matchLabels:
  33.       app: filebeat
  34.   template:
  35.     metadata:
  36.       labels:
  37.         app: filebeat
  38.     spec:
  39.       serviceAccountName: filebeat
  40.       terminationGracePeriodSeconds: 30
  41.       containers:
  42.       - name: filebeat
  43.         image: docker.elastic.co/beats/filebeat:7.10.1
  44.         args: [
  45.           "-c", "/etc/filebeat.yml",
  46.           "-e",
  47.         ]
  48.         env:
  49.         - name: ELASTICSEARCH_HOST
  50.           value: elasticsearch
  51.         - name: NODE_NAME
  52.           valueFrom:
  53.             fieldRef:
  54.               fieldPath: spec.nodeName
  55.         securityContext:
  56.           runAsUser: 0
  57.           privileged: true
  58.         resources:
  59.           limits:
  60.             memory: 200Mi
  61.           requests:
  62.             cpu: 100m
  63.             memory: 100Mi
  64.         volumeMounts:
  65.         - name: config
  66.           mountPath: /etc/filebeat.yml
  67.           readOnly: true
  68.           subPath: filebeat.yml
  69.         - name: data
  70.           mountPath: /usr/share/filebeat/data
  71.         - name: varlog
  72.           mountPath: /var/log
  73.           readOnly: true
  74.         - name: varlibdockercontainers
  75.           mountPath: /var/lib/docker/containers
  76.           readOnly: true
  77.       volumes:
  78.       - name: config
  79.         configMap:
  80.           defaultMode: 0600
  81.           name: filebeat-config
  82.       - name: varlog
  83.         hostPath:
  84.           path: /var/log
  85.       - name: varlibdockercontainers
  86.         hostPath:
  87.           path: /var/lib/docker/containers
  88.       - name: data
  89.         hostPath:
  90.           path: /var/lib/filebeat-data
  91.           type: DirectoryOrCreate
复制代码

10. 安全最佳实践

10.1 RBAC配置

创建ServiceAccount:
  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4.   name: my-serviceaccount
  5.   namespace: default
复制代码

创建Role:
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4.   namespace: default
  5.   name: my-role
  6. rules:
  7. - apiGroups: [""]
  8.   resources: ["pods"]
  9.   verbs: ["get", "watch", "list"]
复制代码

创建RoleBinding:
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: RoleBinding
  3. metadata:
  4.   name: my-rolebinding
  5.   namespace: default
  6. subjects:
  7. - kind: ServiceAccount
  8.   name: my-serviceaccount
  9.   namespace: default
  10. roleRef:
  11.   kind: Role
  12.   name: my-role
  13.   apiGroup: rbac.authorization.k8s.io
复制代码

10.2 网络策略

默认拒绝所有入站流量:
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: default-deny
  5. spec:
  6.   podSelector: {}
  7.   policyTypes:
  8.   - Ingress
复制代码

允许特定命名空间中的Pod访问:
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: allow-specific-namespace
  5. spec:
  6.   podSelector:
  7.     matchLabels:
  8.       app: myapp
  9.   policyTypes:
  10.   - Ingress
  11.   ingress:
  12.   - from:
  13.     - namespaceSelector:
  14.         matchLabels:
  15.           name: allowed-namespace
复制代码

10.3 Pod安全策略

创建Pod安全策略:
  1. apiVersion: policy/v1beta1
  2. kind: PodSecurityPolicy
  3. metadata:
  4.   name: restricted
  5. spec:
  6.   privileged: false
  7.   allowPrivilegeEscalation: false
  8.   requiredDropCapabilities:
  9.     - ALL
  10.   volumes:
  11.     - 'configMap'
  12.     - 'emptyDir'
  13.     - 'projected'
  14.     - 'secret'
  15.     - 'downwardAPI'
  16.     - 'persistentVolumeClaim'
  17.   runAsUser:
  18.     rule: 'MustRunAsNonRoot'
  19.   seLinux:
  20.     rule: 'RunAsAny'
  21.   fsGroup:
  22.     rule: 'RunAsAny'
复制代码

创建RoleBinding以使用Pod安全策略:
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRole
  3. metadata:
  4.   name: psp:restricted
  5. rules:
  6. - apiGroups: ['policy']
  7.   resources: ['podsecuritypolicies']
  8.   verbs: ['use']
  9.   resourceNames: ['restricted']
  10. ---
  11. apiVersion: rbac.authorization.k8s.io/v1
  12. kind: ClusterRoleBinding
  13. metadata:
  14.   name: psp:restricted
  15. roleRef:
  16.   apiGroup: rbac.authorization.k8s.io
  17.   kind: ClusterRole
  18.   name: psp:restricted
  19. subjects:
  20. - kind: Group
  21.   name: system:authenticated
复制代码

11. 总结与展望

在CentOS Stream上搭建高可用Kubernetes集群需要仔细规划和配置。本文详细介绍了从环境准备到集群部署、负载均衡配置、故障恢复机制和性能优化的全过程。通过遵循这些最佳实践,可以构建一个稳定、可靠且高性能的Kubernetes集群。

随着Kubernetes生态系统的不断发展,新的工具和技术不断涌现。未来,我们可以期待更多自动化工具和最佳实践的出现,使Kubernetes集群的部署和管理变得更加简单和高效。同时,随着边缘计算和混合云的兴起,Kubernetes在这些领域的应用也将越来越广泛。

无论技术如何发展,高可用性、故障恢复和性能优化始终是Kubernetes集群管理的核心关注点。通过不断学习和实践,我们可以更好地利用Kubernetes的强大功能,为业务提供稳定可靠的支持。

以上就是在CentOS Stream上搭建高可用Kubernetes集群的详细配置实例与最佳实践,包括负载均衡、故障恢复和性能优化的全面指南。希望这篇文章能够帮助您成功部署和管理高可用的Kubernetes集群。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则