|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
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]
- -> [控制平面节点2]
- -> [控制平面节点3]
- -> [工作节点1]
- -> [工作节点2]
- -> ... [更多工作节点]
复制代码
3. 系统初始化配置
3.1 更新系统并安装基本工具
在所有节点上执行以下命令:
- # 更新系统
- sudo dnf update -y
- # 安装基本工具
- sudo dnf install -y curl wget vim git
- # 禁用firewalld(Kubernetes有自己的网络策略)
- sudo systemctl stop firewalld
- sudo systemctl disable firewalld
- # 禁用SELinux(或者设置为permissive模式)
- sudo setenforce 0
- sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- # 禁用swap
- sudo swapoff -a
- sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- # 设置内核参数
- cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
- br_netfilter
- EOF
- 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.2 配置主机名和hosts文件
在每个节点上设置主机名,并更新/etc/hosts文件:
- # 在控制平面节点1上
- sudo hostnamectl set-hostname k8s-master-1
- # 在控制平面节点2上
- sudo hostnamectl set-hostname k8s-master-2
- # 在控制平面节点3上
- sudo hostnamectl set-hostname k8s-master-3
- # 在工作节点1上
- sudo hostnamectl set-hostname k8s-worker-1
- # 在工作节点2上
- sudo hostnamectl set-hostname k8s-worker-2
复制代码
在所有节点上更新/etc/hosts文件:
- cat <<EOF | sudo tee -a /etc/hosts
- 192.168.1.10 k8s-master-1
- 192.168.1.11 k8s-master-2
- 192.168.1.12 k8s-master-3
- 192.168.1.20 k8s-worker-1
- 192.168.1.21 k8s-worker-2
- 192.168.1.30 k8s-lb
- EOF
复制代码
4. 容器运行时安装
4.1 安装containerd
containerd是Kubernetes推荐的容器运行时,以下是安装步骤:
- # 安装containerd
- sudo dnf install -y containerd
- # 创建containerd配置目录
- sudo mkdir -p /etc/containerd
- # 生成默认配置并修改
- sudo containerd config default | sudo tee /etc/containerd/config.toml
- # 修改cgroup驱动为systemd
- sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
- # 重启并启用containerd
- sudo systemctl restart containerd
- sudo systemctl enable containerd
复制代码
4.2 验证containerd安装
- sudo systemctl status containerd
- sudo ctr --version
复制代码
5. Kubernetes组件安装
5.1 添加Kubernetes仓库
- cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
- [kubernetes]
- name=Kubernetes
- baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
- enabled=1
- gpgcheck=1
- repo_gpgcheck=1
- gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
- exclude=kubelet kubeadm kubectl
- EOF
复制代码
5.2 安装Kubernetes组件
- # 安装kubelet、kubeadm和kubectl
- sudo dnf install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0 --disableexcludes=kubernetes
- # 启用并启动kubelet
- sudo systemctl enable --now kubelet
复制代码
6. 负载均衡器配置
6.1 安装HAProxy
在负载均衡器节点(k8s-lb)上安装HAProxy:
- # 安装HAProxy
- sudo dnf install -y haproxy
- # 配置HAProxy
- cat <<EOF | sudo tee /etc/haproxy/haproxy.cfg
- frontend kubernetes-frontend
- bind *:6443
- mode tcp
- option tcplog
- default_backend kubernetes-backend
- backend kubernetes-backend
- mode tcp
- option tcp-check
- balance roundrobin
- server k8s-master-1 192.168.1.10:6443 check fall 3 rise 2
- server k8s-master-2 192.168.1.11:6443 check fall 3 rise 2
- server k8s-master-3 192.168.1.12:6443 check fall 3 rise 2
- EOF
- # 启动并启用HAProxy
- sudo systemctl restart haproxy
- sudo systemctl enable haproxy
复制代码
6.2 验证负载均衡器
- sudo systemctl status haproxy
- curl -k https://192.168.1.30:6443
复制代码
7. 初始化Kubernetes控制平面
7.1 创建kubeadm配置文件
在第一个控制平面节点(k8s-master-1)上创建kubeadm配置文件:
- cat <<EOF | sudo tee kubeadm-config.yaml
- apiVersion: kubeadm.k8s.io/v1beta3
- kind: InitConfiguration
- localAPIEndpoint:
- advertiseAddress: 192.168.1.10
- bindPort: 6443
- nodeRegistration:
- criSocket: /run/containerd/containerd.sock
- kubeletExtraArgs:
- cgroup-driver: systemd
- ---
- apiVersion: kubeadm.k8s.io/v1beta3
- kind: ClusterConfiguration
- kubernetesVersion: v1.25.0
- controlPlaneEndpoint: "192.168.1.30:6443"
- imageRepository: registry.aliyuncs.com/google_containers
- clusterName: kubernetes
- networking:
- dnsDomain: cluster.local
- serviceSubnet: "10.96.0.0/12"
- podSubnet: "10.244.0.0/16"
- etcd:
- external:
- endpoints:
- - https://192.168.1.10:2379
- - https://192.168.1.11:2379
- - https://192.168.1.12:2379
- caFile: /etc/kubernetes/pki/etcd/ca.crt
- certFile: /etc/kubernetes/pki/etcd/server.crt
- keyFile: /etc/kubernetes/pki/etcd/server.key
- ---
- apiVersion: kubeproxy.config.k8s.io/v1alpha1
- kind: KubeProxyConfiguration
- mode: ipvs
- EOF
复制代码
7.2 初始化第一个控制平面节点
- # 预拉取镜像
- sudo kubeadm config images pull --config kubeadm-config.yaml
- # 初始化集群
- sudo kubeadm init --config kubeadm-config.yaml --upload-certs
- # 配置kubectl
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码
7.3 保存加入集群的命令
初始化完成后,会输出加入控制平面和工作节点的命令,请妥善保存:
- # 加入控制平面节点的命令示例
- kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
- # 加入工作节点的命令示例
- kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash>
复制代码
8. 部署网络插件
8.1 安装Calico网络插件
- # 安装Calico
- kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
- # 检查Pod状态
- kubectl get pods -n kube-system
复制代码
8.2 验证网络插件
- # 检查节点状态
- kubectl get nodes
- # 创建测试Pod
- kubectl run nginx --image=nginx --port=80
- kubectl expose pod nginx --port=80 --type=NodePort
- # 测试网络连通性
- kubectl get svc nginx
- curl <node-ip>:<node-port>
复制代码
9. 添加其他控制平面节点
9.1 复制证书到其他控制平面节点
在k8s-master-1上执行:
- # 在k8s-master-1上
- USER=root
- CONTROL_PLANE_IPS="192.168.1.11 192.168.1.12"
- for host in ${CONTROL_PLANE_IPS}; do
- ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"
- scp /etc/kubernetes/pki/ca.crt "${USER}"@$host:/etc/kubernetes/pki/
- scp /etc/kubernetes/pki/ca.key "${USER}"@$host:/etc/kubernetes/pki/
- scp /etc/kubernetes/pki/sa.key "${USER}"@$host:/etc/kubernetes/pki/
- scp /etc/kubernetes/pki/sa.pub "${USER}"@$host:/etc/kubernetes/pki/
- scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host:/etc/kubernetes/pki/
- scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host:/etc/kubernetes/pki/
- scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:/etc/kubernetes/pki/etcd/
- scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:/etc/kubernetes/pki/etcd/
- scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/
- done
复制代码
9.2 加入其他控制平面节点
在k8s-master-2和k8s-master-3上执行之前保存的加入控制平面节点的命令:
- # 在k8s-master-2和k8s-master-3上
- sudo kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash> --control-plane --certificate-key <key>
- # 配置kubectl
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码
9.3 验证控制平面节点状态
- # 在任意控制平面节点上
- kubectl get nodes
- kubectl get pods -n kube-system
复制代码
10. 添加工作节点
10.1 加入工作节点
在k8s-worker-1和k8s-worker-2上执行之前保存的加入工作节点的命令:
- # 在k8s-worker-1和k8s-worker-2上
- sudo kubeadm join 192.168.1.30:6443 --token <token> --discovery-token-ca-cert-hash <hash>
复制代码
10.2 验证工作节点状态
- # 在任意控制平面节点上
- kubectl get nodes
- kubectl label node k8s-worker-1 node-role.kubernetes.io/worker=worker
- kubectl label node k8s-worker-2 node-role.kubernetes.io/worker=worker
复制代码
11. 配置高可用etcd集群
11.1 安装etcd
在所有控制平面节点上安装etcd:
- # 安装etcd
- sudo dnf install -y etcd
- # 创建etcd数据目录
- sudo mkdir -p /var/lib/etcd
- sudo chown etcd:etcd /var/lib/etcd
复制代码
11.2 配置etcd
在每个控制平面节点上配置etcd:
在k8s-master-1上:
- cat <<EOF | sudo tee /etc/etcd/etcd.conf
- name: 'k8s-master-1'
- data-dir: /var/lib/etcd
- initial-advertise-peer-urls: http://192.168.1.10:2380
- listen-peer-urls: http://192.168.1.10:2380
- listen-client-urls: http://192.168.1.10:2379,http://127.0.0.1:2379
- advertise-client-urls: http://192.168.1.10:2379
- 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
- initial-cluster-state: 'new'
- initial-cluster-token: 'k8s-etcd-cluster'
- EOF
复制代码
在k8s-master-2上:
- cat <<EOF | sudo tee /etc/etcd/etcd.conf
- name: 'k8s-master-2'
- data-dir: /var/lib/etcd
- initial-advertise-peer-urls: http://192.168.1.11:2380
- listen-peer-urls: http://192.168.1.11:2380
- listen-client-urls: http://192.168.1.11:2379,http://127.0.0.1:2379
- advertise-client-urls: http://192.168.1.11:2379
- 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
- initial-cluster-state: 'new'
- initial-cluster-token: 'k8s-etcd-cluster'
- EOF
复制代码
在k8s-master-3上:
- cat <<EOF | sudo tee /etc/etcd/etcd.conf
- name: 'k8s-master-3'
- data-dir: /var/lib/etcd
- initial-advertise-peer-urls: http://192.168.1.12:2380
- listen-peer-urls: http://192.168.1.12:2380
- listen-client-urls: http://192.168.1.12:2379,http://127.0.0.1:2379
- advertise-client-urls: http://192.168.1.12:2379
- 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
- initial-cluster-state: 'new'
- initial-cluster-token: 'k8s-etcd-cluster'
- EOF
复制代码
11.3 启动etcd服务
在所有控制平面节点上启动etcd服务:
- sudo systemctl enable --now etcd
- sudo systemctl status etcd
复制代码
11.4 验证etcd集群状态
- # 在任意控制平面节点上
- etcdctl --endpoints=http://192.168.1.10:2379,http://192.168.1.11:2379,http://192.168.1.12:2379 endpoint health
- 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
- # 创建NFS Provisioner命名空间
- kubectl create namespace nfs-provisioner
- # 安装NFS Provisioner
- helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
- helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
- --namespace nfs-provisioner \
- --set nfs.server=192.168.1.100 \
- --set nfs.path=/exported/path
复制代码
12.2 创建StorageClass
- cat <<EOF | kubectl apply -f -
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: nfs-client
- provisioner: kubernetes.io/nfs
- parameters:
- archiveOnDelete: "false"
- EOF
复制代码
12.3 测试存储类
- # 创建PVC
- cat <<EOF | kubectl apply -f -
- kind: PersistentVolumeClaim
- apiVersion: v1
- metadata:
- name: test-claim
- spec:
- storageClassName: nfs-client
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 1Mi
- EOF
- # 创建测试Pod
- cat <<EOF | kubectl apply -f -
- kind: Pod
- apiVersion: v1
- metadata:
- name: test-pod
- spec:
- containers:
- - name: test-pod
- image: busybox:1.28
- command:
- - "/bin/sh"
- args:
- - "-c"
- - "touch /mnt/SUCCESS && exit 0 || exit 1"
- volumeMounts:
- - name: nfs-pvc
- mountPath: "/mnt"
- restartPolicy: "Never"
- volumes:
- - name: nfs-pvc
- persistentVolumeClaim:
- claimName: test-claim
- EOF
- # 验证
- kubectl get pvc
- kubectl get pod
- kubectl describe pod test-pod
复制代码
13. 部署Ingress控制器
13.1 安装Nginx Ingress控制器
- # 安装Nginx Ingress控制器
- kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml
- # 检查状态
- kubectl get pods -n ingress-nginx
- kubectl get svc -n ingress-nginx
复制代码
13.2 配置Ingress资源
- # 创建示例应用
- kubectl create deployment nginx --image=nginx
- kubectl expose deployment nginx --port=80 --type=NodePort
- # 创建Ingress资源
- cat <<EOF | kubectl apply -f -
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: nginx-ingress
- annotations:
- nginx.ingress.kubernetes.io/rewrite-target: /
- spec:
- rules:
- - host: nginx.example.com
- http:
- paths:
- - path: /
- pathType: Prefix
- backend:
- service:
- name: nginx
- port:
- number: 80
- EOF
- # 测试Ingress
- # 在本地hosts文件中添加:192.168.1.30 nginx.example.com
- # 然后访问 http://nginx.example.com
复制代码
14. 部署监控和日志系统
14.1 安装Prometheus和Grafana
- # 创建监控命名空间
- kubectl create namespace monitoring
- # 安装Prometheus Operator
- helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
- helm repo update
- # 安装Kube-Prometheus-Stack
- helm install prometheus prometheus-community/kube-prometheus-stack \
- --namespace monitoring \
- --set grafana.adminPassword=admin \
- --set prometheus.prometheusSpec.retention=7d
复制代码
14.2 配置Grafana
- # 获取Grafana密码
- kubectl get secret --namespace monitoring prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
- # 端口转发访问Grafana
- kubectl port-forward --namespace monitoring svc/prometheus-grafana 3000:80
- # 访问 http://localhost:3000
复制代码
14.3 安装EFK日志系统
- # 安装Elasticsearch
- helm repo add elastic https://helm.elastic.co
- helm install elasticsearch elastic/elasticsearch \
- --namespace logging \
- --set replicas=1 \
- --set minimumMasterNodes=1
- # 安装Kibana
- helm install kibana elastic/kibana \
- --namespace logging
- # 安装Fluentd
- helm install fluentd elastic/fluentd \
- --namespace logging
复制代码
15. 集群备份与恢复
15.1 使用Velero进行集群备份
- # 下载Velero
- wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
- tar -xvf velero-v1.9.0-linux-amd64.tar.gz
- sudo mv velero-v1.9.0-linux-amd64/velero /usr/local/bin/
- # 安装Velero
- velero install \
- --provider aws \
- --plugins velero/velero-plugin-for-aws:v1.4.0 \
- --bucket velero-backups \
- --secret-file ./credentials-velero \
- --use-volume-snapshots=false \
- --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio-server:9000
复制代码
15.2 创建备份
- # 创建完整集群备份
- velero backup create cluster-backup --include-cluster-resources=true
- # 创建命名空间备份
- velero backup create ns-backup --include-namespaces=default,kube-system
- # 定时备份
- velero schedule create daily-backup --schedule="0 1 * * *" --include-cluster-resources=true
复制代码
15.3 恢复备份
- # 列出可用备份
- velero backup get
- # 恢复备份
- velero restore create --from-backup cluster-backup
复制代码
16. 集群维护与升级
16.1 节点维护
- # 驱逐节点上的Pod
- kubectl cordon <node-name>
- kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
- # 维护完成后恢复节点
- kubectl uncordon <node-name>
复制代码
16.2 升级Kubernetes集群
- # 升级控制平面
- sudo dnf update -y
- sudo dnf install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0 --disableexcludes=kubernetes
- # 升级控制平面节点
- sudo kubeadm upgrade plan
- sudo kubeadm upgrade apply v1.26.0
- # 升级kubelet
- sudo systemctl daemon-reload
- sudo systemctl restart kubelet
- # 升级工作节点
- sudo dnf update -y
- sudo dnf install -y kubelet-1.26.0 kubeadm-1.26.0 --disableexcludes=kubernetes
- sudo kubeadm upgrade node
- sudo systemctl daemon-reload
- sudo systemctl restart kubelet
复制代码
17. 安全最佳实践
17.1 使用RBAC
- # 创建ServiceAccount
- kubectl create serviceaccount dashboard-sa
- # 创建Role
- kubectl create role pod-reader --verb=get,list,watch --resource=pods
- # 创建RoleBinding
- kubectl create rolebinding pod-reader-binding --role=pod-reader --serviceaccount=default:dashboard-sa
复制代码
17.2 网络策略
- # 创建默认拒绝所有入站流量的网络策略
- cat <<EOF | kubectl apply -f -
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: default-deny-ingress
- spec:
- podSelector: {}
- policyTypes:
- - Ingress
- EOF
- # 创建允许特定命名空间内Pod间通信的网络策略
- cat <<EOF | kubectl apply -f -
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: allow-namespace
- spec:
- podSelector: {}
- policyTypes:
- - Ingress
- ingress:
- - from:
- - namespaceSelector:
- matchLabels:
- name: default
- EOF
复制代码
17.3 Pod安全策略
- # 创建Pod安全策略
- cat <<EOF | kubectl apply -f -
- apiVersion: policy/v1beta1
- kind: PodSecurityPolicy
- metadata:
- name: restricted
- spec:
- privileged: false
- allowPrivilegeEscalation: false
- requiredDropCapabilities:
- - ALL
- volumes:
- - 'configMap'
- - 'emptyDir'
- - 'projected'
- - 'secret'
- - 'downwardAPI'
- - 'persistentVolumeClaim'
- runAsUser:
- rule: 'MustRunAsNonRoot'
- seLinux:
- rule: 'RunAsAny'
- fsGroup:
- rule: 'RunAsAny'
- EOF
- # 创建ClusterRole和ClusterRoleBinding
- cat <<EOF | kubectl apply -f -
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRole
- metadata:
- name: psp:restricted
- rules:
- - apiGroups:
- - policy
- resources:
- - podsecuritypolicies
- resourceNames:
- - restricted
- verbs:
- - use
- ---
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRoleBinding
- metadata:
- name: psp:restricted
- roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: psp:restricted
- subjects:
- - kind: Group
- name: system:authenticated
- EOF
复制代码
18. 性能优化与调优
18.1 Kubelet资源管理
- # 配置Kubelet资源管理
- cat <<EOF | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
- [Service]
- Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
- Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
- Environment="KUBELET_EXTRA_ARGS=--node-ip=192.168.1.10 --cgroup-driver=systemd --pod-max-pids=10000 --max-pods=110"
- ExecStart=
- ExecStart=/usr/bin/kubelet \$KUBELET_KUBECONFIG_ARGS \$KUBELET_CONFIG_ARGS \$KUBELET_EXTRA_ARGS
- EOF
- # 重启Kubelet
- sudo systemctl daemon-reload
- sudo systemctl restart kubelet
复制代码
18.2 内核参数优化
- # 优化内核参数
- cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes.conf
- # 增加文件描述符限制
- fs.file-max = 100000
- fs.inotify.max_user_instances = 8192
- fs.inotify.max_user_watches = 1048576
- # 网络优化
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 87380 16777216
- net.ipv4.tcp_wmem = 4096 65536 16777216
- net.core.netdev_max_backlog = 10000
- net.ipv4.ip_local_port_range = 1024 65000
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 10
- net.ipv4.tcp_keepalive_time = 600
- net.ipv4.tcp_max_syn_backlog = 10000
- # 虚拟内存优化
- vm.swappiness = 10
- vm.dirty_ratio = 60
- vm.dirty_background_ratio = 2
- EOF
- # 应用内核参数
- sudo sysctl -p /etc/sysctl.d/99-kubernetes.conf
复制代码
18.3 调整etcd性能
- # 优化etcd配置
- cat <<EOF | sudo tee /etc/etcd/etcd.conf
- name: 'k8s-master-1'
- data-dir: /var/lib/etcd
- initial-advertise-peer-urls: http://192.168.1.10:2380
- listen-peer-urls: http://192.168.1.10:2380
- listen-client-urls: http://192.168.1.10:2379,http://127.0.0.1:2379
- advertise-client-urls: http://192.168.1.10:2379
- 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
- initial-cluster-state: 'new'
- initial-cluster-token: 'k8s-etcd-cluster'
- # 性能优化参数
- heartbeat-interval: 100
- election-timeout: 1000
- max-snapshots: 5
- max-wals: 5
- snapshot-count: 10000
- quota-backend-bytes: 4294967296
- auto-compaction-retention: 1000
- EOF
- # 重启etcd
- sudo systemctl restart etcd
复制代码
19. 故障排除
19.1 常见问题及解决方案
- # 检查节点状态
- kubectl describe node <node-name>
- # 检查kubelet日志
- journalctl -u kubelet -f
- # 检查容器运行时状态
- sudo systemctl status containerd
- sudo crictl ps
- sudo crictl logs <container-id>
复制代码- # 检查Pod事件
- kubectl describe pod <pod-name>
- # 检查资源使用情况
- kubectl top nodes
- # 检查PVC状态(如果Pod使用持久化存储)
- kubectl get pvc
- kubectl describe pvc <pvc-name>
复制代码- # 检查网络插件Pod状态
- kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium'
- # 检查网络插件日志
- kubectl logs -n kube-system <network-plugin-pod-name>
- # 测试Pod间网络连通性
- kubectl run -it --rm busybox --image=busybox -- sh
- # 在Pod内执行
- ping <other-pod-ip>
- wget -qO- <service-url>
复制代码
19.2 集群恢复
- # 停止kube-apiserver
- sudo systemctl stop kube-apiserver
- # 恢复etcd数据
- sudo etcdctl snapshot restore snapshot.db \
- --data-dir /var/lib/etcd \
- --name k8s-master-1 \
- --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 \
- --initial-cluster-token k8s-etcd-cluster \
- --initial-advertise-peer-urls http://192.168.1.10:2380
- # 重启etcd和kube-apiserver
- sudo systemctl restart etcd
- sudo systemctl start kube-apiserver
复制代码- # 使用Velero恢复
- velero restore create --from-backup <backup-name>
- # 检查恢复状态
- velero restore get
- 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集群,为您的容器化应用提供强大的支持。 |
|