简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

AlmaLinux服务器上Kubernetes部署实战指南构建高可用容器集群的最佳实践与技巧

3万

主题

424

科技点

3万

积分

大区版主

木柜子打湿

积分
31917

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-29 22:00:01 | 显示全部楼层 |阅读模式 [标记阅至此楼]

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

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

x
1. 引言

Kubernetes已经成为现代容器编排的事实标准,它提供了自动化部署、扩展和管理容器化应用程序的能力。AlmaLinux作为RHEL的下游分支,以其稳定性和长期支持而闻名,是部署生产级Kubernetes集群的理想选择。本文将详细介绍如何在AlmaLinux服务器上构建高可用的Kubernetes集群,并提供一系列最佳实践和技巧,帮助您构建稳定、高效的容器化平台。

2. 环境规划与准备

2.1 硬件要求

在开始部署之前,确保您的硬件满足以下最低要求:

• 控制平面节点:至少2个CPU核心,4GB RAM,20GB可用磁盘空间
• 工作节点:至少2个CPU核心,2GB RAM,20GB可用磁盘空间
• 负载均衡器:1个CPU核心,1GB RAM,10GB可用磁盘空间
• 网络:节点之间网络延迟低,带宽充足

对于生产环境,建议使用更高规格的硬件,并至少部署3个控制平面节点以确保高可用性。

2.2 软件要求

• 操作系统:AlmaLinux 8.5或更高版本
• 容器运行时:Docker、containerd或CRI-O
• Kubernetes版本:1.23.x或更高版本(本文使用1.25.0)
• 网络插件:Calico、Flannel或Cilium
• 负载均衡器:HAProxy或Nginx

2.3 网络拓扑设计

一个典型的高可用Kubernetes集群网络拓扑如下:
  1. [互联网] -> [负载均衡器] -> [控制平面节点1]
  2.                           -> [控制平面节点2]
  3.                           -> [控制平面节点3]
  4.                           -> [工作节点1]
  5.                           -> [工作节点2]
  6.                           -> ... [更多工作节点]
复制代码

3. 系统初始化配置

3.1 更新系统并安装基本工具

在所有节点上执行以下命令:
  1. # 更新系统
  2. sudo dnf update -y
  3. # 安装基本工具
  4. sudo dnf install -y curl wget vim git
  5. # 禁用firewalld(Kubernetes有自己的网络策略)
  6. sudo systemctl stop firewalld
  7. sudo systemctl disable firewalld
  8. # 禁用SELinux(或者设置为permissive模式)
  9. sudo setenforce 0
  10. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  11. # 禁用swap
  12. sudo swapoff -a
  13. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  14. # 设置内核参数
  15. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  16. br_netfilter
  17. EOF
  18. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  19. net.bridge.bridge-nf-call-ip6tables = 1
  20. net.bridge.bridge-nf-call-iptables = 1
  21. net.ipv4.ip_forward = 1
  22. EOF
  23. sudo sysctl --system
复制代码

3.2 配置主机名和hosts文件

在每个节点上设置主机名,并更新/etc/hosts文件:
  1. # 在控制平面节点1上
  2. sudo hostnamectl set-hostname k8s-master-1
  3. # 在控制平面节点2上
  4. sudo hostnamectl set-hostname k8s-master-2
  5. # 在控制平面节点3上
  6. sudo hostnamectl set-hostname k8s-master-3
  7. # 在工作节点1上
  8. sudo hostnamectl set-hostname k8s-worker-1
  9. # 在工作节点2上
  10. sudo hostnamectl set-hostname k8s-worker-2
复制代码

在所有节点上更新/etc/hosts文件:
  1. cat <<EOF | sudo tee -a /etc/hosts
  2. 192.168.1.10 k8s-master-1
  3. 192.168.1.11 k8s-master-2
  4. 192.168.1.12 k8s-master-3
  5. 192.168.1.20 k8s-worker-1
  6. 192.168.1.21 k8s-worker-2
  7. 192.168.1.30 k8s-lb
  8. EOF
复制代码

4. 容器运行时安装

4.1 安装containerd

containerd是Kubernetes推荐的容器运行时,以下是安装步骤:
  1. # 安装containerd
  2. sudo dnf install -y containerd
  3. # 创建containerd配置目录
  4. sudo mkdir -p /etc/containerd
  5. # 生成默认配置并修改
  6. sudo containerd config default | sudo tee /etc/containerd/config.toml
  7. # 修改cgroup驱动为systemd
  8. sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
  9. # 重启并启用containerd
  10. sudo systemctl restart containerd
  11. sudo systemctl enable containerd
复制代码

4.2 验证containerd安装
  1. sudo systemctl status containerd
  2. sudo ctr --version
复制代码

5. Kubernetes组件安装

5.1 添加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
复制代码

5.2 安装Kubernetes组件
  1. # 安装kubelet、kubeadm和kubectl
  2. sudo dnf install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0 --disableexcludes=kubernetes
  3. # 启用并启动kubelet
  4. sudo systemctl enable --now kubelet
复制代码

6. 负载均衡器配置

6.1 安装HAProxy

在负载均衡器节点(k8s-lb)上安装HAProxy:
  1. # 安装HAProxy
  2. sudo dnf install -y haproxy
  3. # 配置HAProxy
  4. cat <<EOF | sudo tee /etc/haproxy/haproxy.cfg
  5. frontend kubernetes-frontend
  6.     bind *:6443
  7.     mode tcp
  8.     option tcplog
  9.     default_backend kubernetes-backend
  10. backend kubernetes-backend
  11.     mode tcp
  12.     option tcp-check
  13.     balance roundrobin
  14.     server k8s-master-1 192.168.1.10:6443 check fall 3 rise 2
  15.     server k8s-master-2 192.168.1.11:6443 check fall 3 rise 2
  16.     server k8s-master-3 192.168.1.12:6443 check fall 3 rise 2
  17. EOF
  18. # 启动并启用HAProxy
  19. sudo systemctl restart haproxy
  20. sudo systemctl enable haproxy
复制代码

6.2 验证负载均衡器
  1. sudo systemctl status haproxy
  2. curl -k https://192.168.1.30:6443
复制代码

7. 初始化Kubernetes控制平面

7.1 创建kubeadm配置文件

在第一个控制平面节点(k8s-master-1)上创建kubeadm配置文件:
  1. cat <<EOF | sudo tee kubeadm-config.yaml
  2. apiVersion: kubeadm.k8s.io/v1beta3
  3. kind: InitConfiguration
  4. localAPIEndpoint:
  5.   advertiseAddress: 192.168.1.10
  6.   bindPort: 6443
  7. nodeRegistration:
  8.   criSocket: /run/containerd/containerd.sock
  9.   kubeletExtraArgs:
  10.     cgroup-driver: systemd
  11. ---
  12. apiVersion: kubeadm.k8s.io/v1beta3
  13. kind: ClusterConfiguration
  14. kubernetesVersion: v1.25.0
  15. controlPlaneEndpoint: "192.168.1.30:6443"
  16. imageRepository: registry.aliyuncs.com/google_containers
  17. clusterName: kubernetes
  18. networking:
  19.   dnsDomain: cluster.local
  20.   serviceSubnet: "10.96.0.0/12"
  21.   podSubnet: "10.244.0.0/16"
  22. etcd:
  23.   external:
  24.     endpoints:
  25.     - https://192.168.1.10:2379
  26.     - https://192.168.1.11:2379
  27.     - https://192.168.1.12:2379
  28.     caFile: /etc/kubernetes/pki/etcd/ca.crt
  29.     certFile: /etc/kubernetes/pki/etcd/server.crt
  30.     keyFile: /etc/kubernetes/pki/etcd/server.key
  31. ---
  32. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  33. kind: KubeProxyConfiguration
  34. mode: ipvs
  35. EOF
复制代码

7.2 初始化第一个控制平面节点
  1. # 预拉取镜像
  2. sudo kubeadm config images pull --config kubeadm-config.yaml
  3. # 初始化集群
  4. sudo kubeadm init --config kubeadm-config.yaml --upload-certs
  5. # 配置kubectl
  6. mkdir -p $HOME/.kube
  7. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  8. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

7.3 保存加入集群的命令

初始化完成后,会输出加入控制平面和工作节点的命令,请妥善保存:
  1. # 加入控制平面节点的命令示例
  2. kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
  3. # 加入工作节点的命令示例
  4. kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash>
复制代码

8. 部署网络插件

8.1 安装Calico网络插件
  1. # 安装Calico
  2. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  3. # 检查Pod状态
  4. kubectl get pods -n kube-system
复制代码

8.2 验证网络插件
  1. # 检查节点状态
  2. kubectl get nodes
  3. # 创建测试Pod
  4. kubectl run nginx --image=nginx --port=80
  5. kubectl expose pod nginx --port=80 --type=NodePort
  6. # 测试网络连通性
  7. kubectl get svc nginx
  8. curl <node-ip>:<node-port>
复制代码

9. 添加其他控制平面节点

9.1 复制证书到其他控制平面节点

在k8s-master-1上执行:
  1. # 在k8s-master-1上
  2. USER=root
  3. CONTROL_PLANE_IPS="192.168.1.11 192.168.1.12"
  4. for host in ${CONTROL_PLANE_IPS}; do
  5.     ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"
  6.     scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:/etc/kubernetes/pki/
  7.     scp /etc/kubernetes/pki/ca.key "${USER}"@$host:/etc/kubernetes/pki/
  8.     scp /etc/kubernetes/pki/sa.key "${USER}"@$host:/etc/kubernetes/pki/
  9.     scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:/etc/kubernetes/pki/
  10.     scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:/etc/kubernetes/pki/
  11.     scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:/etc/kubernetes/pki/
  12.     scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:/etc/kubernetes/pki/etcd/
  13.     scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:/etc/kubernetes/pki/etcd/
  14.     scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/
  15. done
复制代码

9.2 加入其他控制平面节点

在k8s-master-2和k8s-master-3上执行之前保存的加入控制平面节点的命令:
  1. # 在k8s-master-2和k8s-master-3上
  2. sudo kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
  3. # 配置kubectl
  4. mkdir -p $HOME/.kube
  5. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  6. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

9.3 验证控制平面节点状态
  1. # 在任意控制平面节点上
  2. kubectl get nodes
  3. kubectl get pods -n kube-system
复制代码

10. 添加工作节点

10.1 加入工作节点

在k8s-worker-1和k8s-worker-2上执行之前保存的加入工作节点的命令:
  1. # 在k8s-worker-1和k8s-worker-2上
  2. sudo kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash>
复制代码

10.2 验证工作节点状态
  1. # 在任意控制平面节点上
  2. kubectl get nodes
  3. kubectl label node k8s-worker-1 node-role.kubernetes.io/worker=worker
  4. kubectl label node k8s-worker-2 node-role.kubernetes.io/worker=worker
复制代码

11. 配置高可用etcd集群

11.1 安装etcd

在所有控制平面节点上安装etcd:
  1. # 安装etcd
  2. sudo dnf install -y etcd
  3. # 创建etcd数据目录
  4. sudo mkdir -p /var/lib/etcd
  5. sudo chown etcd:etcd /var/lib/etcd
复制代码

11.2 配置etcd

在每个控制平面节点上配置etcd:

在k8s-master-1上:
  1. cat <<EOF | sudo tee /etc/etcd/etcd.conf
  2. name: 'k8s-master-1'
  3. data-dir: /var/lib/etcd
  4. initial-advertise-peer-urls: http://192.168.1.10:2380
  5. listen-peer-urls: http://192.168.1.10:2380
  6. listen-client-urls: http://192.168.1.10:2379,http://127.0.0.1:2379
  7. advertise-client-urls: http://192.168.1.10:2379
  8. initial-cluster: k8s-master-1=http://192.168.1.10:2380,k8s-master-2=http://192.168.1.11:2380,k8s-master-3=http://192.168.1.12:2380
  9. initial-cluster-state: 'new'
  10. initial-cluster-token: 'k8s-etcd-cluster'
  11. EOF
复制代码

在k8s-master-2上:
  1. cat <<EOF | sudo tee /etc/etcd/etcd.conf
  2. name: 'k8s-master-2'
  3. data-dir: /var/lib/etcd
  4. initial-advertise-peer-urls: http://192.168.1.11:2380
  5. listen-peer-urls: http://192.168.1.11:2380
  6. listen-client-urls: http://192.168.1.11:2379,http://127.0.0.1:2379
  7. advertise-client-urls: http://192.168.1.11:2379
  8. initial-cluster: k8s-master-1=http://192.168.1.10:2380,k8s-master-2=http://192.168.1.11:2380,k8s-master-3=http://192.168.1.12:2380
  9. initial-cluster-state: 'new'
  10. initial-cluster-token: 'k8s-etcd-cluster'
  11. EOF
复制代码

在k8s-master-3上:
  1. cat <<EOF | sudo tee /etc/etcd/etcd.conf
  2. name: 'k8s-master-3'
  3. data-dir: /var/lib/etcd
  4. initial-advertise-peer-urls: http://192.168.1.12:2380
  5. listen-peer-urls: http://192.168.1.12:2380
  6. listen-client-urls: http://192.168.1.12:2379,http://127.0.0.1:2379
  7. advertise-client-urls: http://192.168.1.12:2379
  8. initial-cluster: k8s-master-1=http://192.168.1.10:2380,k8s-master-2=http://192.168.1.11:2380,k8s-master-3=http://192.168.1.12:2380
  9. initial-cluster-state: 'new'
  10. initial-cluster-token: 'k8s-etcd-cluster'
  11. EOF
复制代码

11.3 启动etcd服务

在所有控制平面节点上启动etcd服务:
  1. sudo systemctl enable --now etcd
  2. sudo systemctl status etcd
复制代码

11.4 验证etcd集群状态
  1. # 在任意控制平面节点上
  2. etcdctl --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 endpoint health
  3. etcdctl --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 endpoint status
复制代码

12. 部署存储解决方案

12.1 安装NFS Provisioner
  1. # 创建NFS Provisioner命名空间
  2. kubectl create namespace nfs-provisioner
  3. # 安装NFS Provisioner
  4. helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
  5. helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  6.     --namespace nfs-provisioner \
  7.     --set nfs.server=192.168.1.100 \
  8.     --set nfs.path=/exported/path
复制代码

12.2 创建StorageClass
  1. cat <<EOF | kubectl apply -f -
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: nfs-client
  6. provisioner: kubernetes.io/nfs
  7. parameters:
  8.   archiveOnDelete: "false"
  9. EOF
复制代码

12.3 测试存储类
  1. # 创建PVC
  2. cat <<EOF | kubectl apply -f -
  3. kind: PersistentVolumeClaim
  4. apiVersion: v1
  5. metadata:
  6.   name: test-claim
  7. spec:
  8.   storageClassName: nfs-client
  9.   accessModes:
  10.     - ReadWriteMany
  11.   resources:
  12.     requests:
  13.       storage: 1Mi
  14. EOF
  15. # 创建测试Pod
  16. cat <<EOF | kubectl apply -f -
  17. kind: Pod
  18. apiVersion: v1
  19. metadata:
  20.   name: test-pod
  21. spec:
  22.   containers:
  23.   - name: test-pod
  24.     image: busybox:1.28
  25.     command:
  26.       - "/bin/sh"
  27.     args:
  28.       - "-c"
  29.       - "touch /mnt/SUCCESS && exit 0 || exit 1"
  30.     volumeMounts:
  31.       - name: nfs-pvc
  32.         mountPath: "/mnt"
  33.   restartPolicy: "Never"
  34.   volumes:
  35.     - name: nfs-pvc
  36.       persistentVolumeClaim:
  37.         claimName: test-claim
  38. EOF
  39. # 验证
  40. kubectl get pvc
  41. kubectl get pod
  42. kubectl describe pod test-pod
复制代码

13. 部署Ingress控制器

13.1 安装Nginx Ingress控制器
  1. # 安装Nginx Ingress控制器
  2. kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml
  3. # 检查状态
  4. kubectl get pods -n ingress-nginx
  5. kubectl get svc -n ingress-nginx
复制代码

13.2 配置Ingress资源
  1. # 创建示例应用
  2. kubectl create deployment nginx --image=nginx
  3. kubectl expose deployment nginx --port=80 --type=NodePort
  4. # 创建Ingress资源
  5. cat <<EOF | kubectl apply -f -
  6. apiVersion: networking.k8s.io/v1
  7. kind: Ingress
  8. metadata:
  9.   name: nginx-ingress
  10.   annotations:
  11.     nginx.ingress.kubernetes.io/rewrite-target: /
  12. spec:
  13.   rules:
  14.   - host: nginx.example.com
  15.     http:
  16.       paths:
  17.       - path: /
  18.         pathType: Prefix
  19.         backend:
  20.           service:
  21.             name: nginx
  22.             port:
  23.               number: 80
  24. EOF
  25. # 测试Ingress
  26. # 在本地hosts文件中添加:192.168.1.30 nginx.example.com
  27. # 然后访问 http://nginx.example.com
复制代码

14. 部署监控和日志系统

14.1 安装Prometheus和Grafana
  1. # 创建监控命名空间
  2. kubectl create namespace monitoring
  3. # 安装Prometheus Operator
  4. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  5. helm repo update
  6. # 安装Kube-Prometheus-Stack
  7. helm install prometheus prometheus-community/kube-prometheus-stack \
  8.     --namespace monitoring \
  9.     --set grafana.adminPassword=admin \
  10.     --set prometheus.prometheusSpec.retention=7d
复制代码

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

14.3 安装EFK日志系统
  1. # 安装Elasticsearch
  2. helm repo add elastic https://helm.elastic.co
  3. helm install elasticsearch elastic/elasticsearch \
  4.     --namespace logging \
  5.     --set replicas=1 \
  6.     --set minimumMasterNodes=1
  7. # 安装Kibana
  8. helm install kibana elastic/kibana \
  9.     --namespace logging
  10. # 安装Fluentd
  11. helm install fluentd elastic/fluentd \
  12.     --namespace logging
复制代码

15. 集群备份与恢复

15.1 使用Velero进行集群备份
  1. # 下载Velero
  2. wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
  3. tar -xvf velero-v1.9.0-linux-amd64.tar.gz
  4. sudo mv velero-v1.9.0-linux-amd64/velero /usr/local/bin/
  5. # 安装Velero
  6. velero install \
  7.     --provider aws \
  8.     --plugins velero/velero-plugin-for-aws:v1.4.0 \
  9.     --bucket velero-backups \
  10.     --secret-file ./credentials-velero \
  11.     --use-volume-snapshots=false \
  12.     --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio-server:9000
复制代码

15.2 创建备份
  1. # 创建完整集群备份
  2. velero backup create cluster-backup --include-cluster-resources=true
  3. # 创建命名空间备份
  4. velero backup create ns-backup --include-namespaces=default,kube-system
  5. # 定时备份
  6. velero schedule create daily-backup --schedule="0 1 * * *" --include-cluster-resources=true
复制代码

15.3 恢复备份
  1. # 列出可用备份
  2. velero backup get
  3. # 恢复备份
  4. velero restore create --from-backup cluster-backup
复制代码

16. 集群维护与升级

16.1 节点维护
  1. # 驱逐节点上的Pod
  2. kubectl cordon <node-name>
  3. kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
  4. # 维护完成后恢复节点
  5. kubectl uncordon <node-name>
复制代码

16.2 升级Kubernetes集群
  1. # 升级控制平面
  2. sudo dnf update -y
  3. sudo dnf install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0 --disableexcludes=kubernetes
  4. # 升级控制平面节点
  5. sudo kubeadm upgrade plan
  6. sudo kubeadm upgrade apply v1.26.0
  7. # 升级kubelet
  8. sudo systemctl daemon-reload
  9. sudo systemctl restart kubelet
  10. # 升级工作节点
  11. sudo dnf update -y
  12. sudo dnf install -y kubelet-1.26.0 kubeadm-1.26.0 --disableexcludes=kubernetes
  13. sudo kubeadm upgrade node
  14. sudo systemctl daemon-reload
  15. sudo systemctl restart kubelet
复制代码

17. 安全最佳实践

17.1 使用RBAC
  1. # 创建ServiceAccount
  2. kubectl create serviceaccount dashboard-sa
  3. # 创建Role
  4. kubectl create role pod-reader --verb=get,list,watch --resource=pods
  5. # 创建RoleBinding
  6. kubectl create rolebinding pod-reader-binding --role=pod-reader --serviceaccount=default:dashboard-sa
复制代码

17.2 网络策略
  1. # 创建默认拒绝所有入站流量的网络策略
  2. cat <<EOF | kubectl apply -f -
  3. apiVersion: networking.k8s.io/v1
  4. kind: NetworkPolicy
  5. metadata:
  6.   name: default-deny-ingress
  7. spec:
  8.   podSelector: {}
  9.   policyTypes:
  10.   - Ingress
  11. EOF
  12. # 创建允许特定命名空间内Pod间通信的网络策略
  13. cat <<EOF | kubectl apply -f -
  14. apiVersion: networking.k8s.io/v1
  15. kind: NetworkPolicy
  16. metadata:
  17.   name: allow-namespace
  18. spec:
  19.   podSelector: {}
  20.   policyTypes:
  21.   - Ingress
  22.   ingress:
  23.   - from:
  24.     - namespaceSelector:
  25.         matchLabels:
  26.           name: default
  27. EOF
复制代码

17.3 Pod安全策略
  1. # 创建Pod安全策略
  2. cat <<EOF | kubectl apply -f -
  3. apiVersion: policy/v1beta1
  4. kind: PodSecurityPolicy
  5. metadata:
  6.   name: restricted
  7. spec:
  8.   privileged: false
  9.   allowPrivilegeEscalation: false
  10.   requiredDropCapabilities:
  11.     - ALL
  12.   volumes:
  13.     - 'configMap'
  14.     - 'emptyDir'
  15.     - 'projected'
  16.     - 'secret'
  17.     - 'downwardAPI'
  18.     - 'persistentVolumeClaim'
  19.   runAsUser:
  20.     rule: 'MustRunAsNonRoot'
  21.   seLinux:
  22.     rule: 'RunAsAny'
  23.   fsGroup:
  24.     rule: 'RunAsAny'
  25. EOF
  26. # 创建ClusterRole和ClusterRoleBinding
  27. cat <<EOF | kubectl apply -f -
  28. apiVersion: rbac.authorization.k8s.io/v1
  29. kind: ClusterRole
  30. metadata:
  31.   name: psp:restricted
  32. rules:
  33. - apiGroups:
  34.   - policy
  35.   resources:
  36.   - podsecuritypolicies
  37.   resourceNames:
  38.   - restricted
  39.   verbs:
  40.   - use
  41. ---
  42. apiVersion: rbac.authorization.k8s.io/v1
  43. kind: ClusterRoleBinding
  44. metadata:
  45.   name: psp:restricted
  46. roleRef:
  47.   apiGroup: rbac.authorization.k8s.io
  48.   kind: ClusterRole
  49.   name: psp:restricted
  50. subjects:
  51. - kind: Group
  52.   name: system:authenticated
  53. EOF
复制代码

18. 性能优化与调优

18.1 Kubelet资源管理
  1. # 配置Kubelet资源管理
  2. cat <<EOF | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  3. [Service]
  4. Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
  5. Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
  6. Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.1.10 --cgroup-driver=systemd --pod-max-pids=10000 --max-pods=110"
  7. ExecStart=
  8. ExecStart=/usr/bin/kubelet \$KUBELET_KUBECONFIG_ARGS \$KUBELET_CONFIG_ARGS \$KUBELET_EXTRA_ARGS
  9. EOF
  10. # 重启Kubelet
  11. sudo systemctl daemon-reload
  12. sudo systemctl restart kubelet
复制代码

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

18.3 调整etcd性能
  1. # 优化etcd配置
  2. cat <<EOF | sudo tee /etc/etcd/etcd.conf
  3. name: 'k8s-master-1'
  4. data-dir: /var/lib/etcd
  5. initial-advertise-peer-urls: http://192.168.1.10:2380
  6. listen-peer-urls: http://192.168.1.10:2380
  7. listen-client-urls: http://192.168.1.10:2379,http://127.0.0.1:2379
  8. advertise-client-urls: http://192.168.1.10:2379
  9. initial-cluster: k8s-master-1=http://192.168.1.10:2380,k8s-master-2=http://192.168.1.11:2380,k8s-master-3=http://192.168.1.12:2380
  10. initial-cluster-state: 'new'
  11. initial-cluster-token: 'k8s-etcd-cluster'
  12. # 性能优化参数
  13. heartbeat-interval: 100
  14. election-timeout: 1000
  15. max-snapshots: 5
  16. max-wals: 5
  17. snapshot-count: 10000
  18. quota-backend-bytes: 4294967296
  19. auto-compaction-retention: 1000
  20. EOF
  21. # 重启etcd
  22. sudo systemctl restart etcd
复制代码

19. 故障排除

19.1 常见问题及解决方案
  1. # 检查节点状态
  2. kubectl describe node <node-name>
  3. # 检查kubelet日志
  4. journalctl -u kubelet -f
  5. # 检查容器运行时状态
  6. sudo systemctl status containerd
  7. sudo crictl ps
  8. sudo crictl logs <container-id>
复制代码
  1. # 检查Pod事件
  2. kubectl describe pod <pod-name>
  3. # 检查资源使用情况
  4. kubectl top nodes
  5. # 检查PVC状态(如果Pod使用持久化存储)
  6. kubectl get pvc
  7. kubectl describe pvc <pvc-name>
复制代码
  1. # 检查网络插件Pod状态
  2. kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium'
  3. # 检查网络插件日志
  4. kubectl logs -n kube-system <network-plugin-pod-name>
  5. # 测试Pod间网络连通性
  6. kubectl run -it --rm busybox --image=busybox -- sh
  7. # 在Pod内执行
  8. ping <other-pod-ip>
  9. wget -qO- <service-url>
复制代码

19.2 集群恢复
  1. # 停止kube-apiserver
  2. sudo systemctl stop kube-apiserver
  3. # 恢复etcd数据
  4. sudo etcdctl snapshot restore snapshot.db \
  5.     --data-dir /var/lib/etcd \
  6.     --name k8s-master-1 \
  7.     --initial-cluster k8s-master-1=http://192.168.1.10:2380,k8s-master-2=http://192.168.1.11:2380,k8s-master-3=http://192.168.1.12:2380 \
  8.     --initial-cluster-token k8s-etcd-cluster \
  9.     --initial-advertise-peer-urls http://192.168.1.10:2380
  10. # 重启etcd和kube-apiserver
  11. sudo systemctl restart etcd
  12. sudo systemctl start kube-apiserver
复制代码
  1. # 使用Velero恢复
  2. velero restore create --from-backup <backup-name>
  3. # 检查恢复状态
  4. velero restore get
  5. velero restore describe <restore-name>
复制代码

20. 总结与最佳实践

在AlmaLinux上部署高可用的Kubernetes集群需要仔细规划和执行。以下是一些关键的最佳实践:

1. 环境规划:确保硬件资源充足,特别是对于生产环境规划好网络拓扑和IP地址分配使用高可用的负载均衡器
2. 确保硬件资源充足,特别是对于生产环境
3. 规划好网络拓扑和IP地址分配
4. 使用高可用的负载均衡器
5. 系统配置:正确配置内核参数和系统设置禁用swap和SELinux(或设置为permissive模式)使用稳定的容器运行时,如containerd
6. 正确配置内核参数和系统设置
7. 禁用swap和SELinux(或设置为permissive模式)
8. 使用稳定的容器运行时,如containerd
9. 高可用性:部署至少3个控制平面节点使用外部etcd集群配置负载均衡器以实现API服务器的高可用性
10. 部署至少3个控制平面节点
11. 使用外部etcd集群
12. 配置负载均衡器以实现API服务器的高可用性
13. 安全性:启用RBAC控制访问权限使用网络策略限制Pod间通信配置Pod安全策略限制容器权限
14. 启用RBAC控制访问权限
15. 使用网络策略限制Pod间通信
16. 配置Pod安全策略限制容器权限
17. 监控与日志:部署完整的监控解决方案,如Prometheus和Grafana配置集中式日志系统,如EFK堆栈设置警报以便及时发现问题
18. 部署完整的监控解决方案,如Prometheus和Grafana
19. 配置集中式日志系统,如EFK堆栈
20. 设置警报以便及时发现问题
21. 备份与恢复:定期备份etcd数据使用Velero等工具进行集群备份定期测试恢复流程
22. 定期备份etcd数据
23. 使用Velero等工具进行集群备份
24. 定期测试恢复流程
25. 维护与升级:遵循Kubernetes版本兼容性矩阵逐步升级控制平面和工作节点在升级前进行充分测试
26. 遵循Kubernetes版本兼容性矩阵
27. 逐步升级控制平面和工作节点
28. 在升级前进行充分测试

环境规划:

• 确保硬件资源充足,特别是对于生产环境
• 规划好网络拓扑和IP地址分配
• 使用高可用的负载均衡器

系统配置:

• 正确配置内核参数和系统设置
• 禁用swap和SELinux(或设置为permissive模式)
• 使用稳定的容器运行时,如containerd

高可用性:

• 部署至少3个控制平面节点
• 使用外部etcd集群
• 配置负载均衡器以实现API服务器的高可用性

安全性:

• 启用RBAC控制访问权限
• 使用网络策略限制Pod间通信
• 配置Pod安全策略限制容器权限

监控与日志:

• 部署完整的监控解决方案,如Prometheus和Grafana
• 配置集中式日志系统,如EFK堆栈
• 设置警报以便及时发现问题

备份与恢复:

• 定期备份etcd数据
• 使用Velero等工具进行集群备份
• 定期测试恢复流程

维护与升级:

• 遵循Kubernetes版本兼容性矩阵
• 逐步升级控制平面和工作节点
• 在升级前进行充分测试

通过遵循这些最佳实践,您可以构建一个稳定、安全且高性能的Kubernetes集群,为您的容器化应用提供强大的支持。
回复

使用道具 举报

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

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.