1. Kubernetes主机部署前的关键考量
部署Kubernetes集群的第一步就是准备符合要求的主机环境。不同于普通应用服务器,Kubernetes对主机有特殊的配置要求。根据我的实践经验,生产环境中的Kubernetes主机需要满足以下几个核心条件:
- 操作系统:推荐使用Ubuntu 20.04/22.04 LTS或CentOS 7/8(CentOS 7将在2024年停止维护,建议新部署选择其他发行版)
- 硬件配置:每个节点至少2核CPU、4GB内存(Master节点建议4核8GB以上)
- 网络要求:节点间网络延迟低于1ms,禁用Swap分区
- 容器运行时:Docker 20.10+或containerd 1.4+
特别注意:Kubernetes 1.20+版本已弃用Docker作为容器运行时,但通过cri-dockerd仍可继续使用Docker
1.1 系统基础配置
在安装任何软件前,需要对主机进行基础配置。以下是我在多个生产集群中验证过的标准化配置步骤:
bash复制# 关闭防火墙(测试环境)
systemctl stop firewalld && systemctl disable firewalld
# 永久关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 关闭Swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置时间同步
yum install -y chrony || apt install -y chrony
systemctl enable chronyd && systemctl start chronyd
1.2 内核参数调优
Kubernetes对Linux内核参数有特定要求,需要调整以下参数:
bash复制cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 容器运行时安装与配置
2.1 Docker安装(可选)
虽然Kubernetes已转向containerd,但许多场景下仍需要Docker作为开发工具。以下是经过验证的Docker安装方法:
bash复制# Ubuntu/Debian
apt-get update && apt-get install -y \
apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io
# CentOS/RHEL
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
2.2 containerd配置
containerd是Kubernetes推荐的容器运行时,配置方法如下:
bash复制mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
3. Kubernetes组件安装
3.1 配置Kubernetes仓库
bash复制# 添加Kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 对于Debian系
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
3.2 安装kubelet/kubeadm/kubectl
bash复制# CentOS/RHEL
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# Ubuntu/Debian
apt-get update && apt-get install -y kubelet kubeadm kubectl
# 设置开机启动
systemctl enable --now kubelet
4. 集群初始化与节点加入
4.1 Master节点初始化
bash复制kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
初始化成功后,按照提示执行以下命令配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.2 安装网络插件
Flannel是最常用的CNI插件之一:
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
4.3 Worker节点加入集群
在Master节点上获取加入命令:
bash复制kubeadm token create --print-join-command
然后在Worker节点上执行输出的命令即可加入集群。
5. 生产环境关键配置
5.1 高可用配置
生产环境需要配置高可用Master节点:
bash复制# 安装负载均衡器(如HAProxy)
yum install -y haproxy
# 配置/etc/haproxy/haproxy.cfg
frontend kubernetes
bind *:6443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
server k8s-master-1 192.168.1.100:6443 check fall 3 rise 2
server k8s-master-2 192.168.1.101:6443 check fall 3 rise 2
server k8s-master-3 192.168.1.102:6443 check fall 3 rise 2
5.2 持久化存储配置
配置NFS作为持久化存储:
bash复制# 在存储节点
yum install -y nfs-utils
mkdir -p /data/nfs
echo "/data/nfs *(rw,no_root_squash)" >> /etc/exports
systemctl enable --now nfs-server
# 在所有Kubernetes节点
yum install -y nfs-utils
5.3 监控与日志
部署Prometheus监控:
bash复制kubectl create namespace monitoring
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring
6. 常见问题排查
6.1 kubelet无法启动
检查错误日志:
bash复制journalctl -xeu kubelet
常见解决方法:
- 确认containerd/docker已正常运行
- 检查CNI插件是否正确安装
- 验证网络配置是否正确
6.2 Pod处于Pending状态
排查步骤:
bash复制kubectl describe pod <pod-name>
kubectl get events --sort-by=.metadata.creationTimestamp
常见原因:
- 资源不足
- 节点选择器不匹配
- 持久卷声明未绑定
6.3 网络连接问题
测试Pod间通信:
bash复制kubectl run -it --rm --restart=Never test-pod --image=busybox -- sh
ping <other-pod-ip>
如果网络不通,检查:
- CNI插件日志
- iptables/nftables规则
- 节点间网络连通性
7. 性能优化建议
7.1 内核参数调优
bash复制# 增加连接跟踪表大小
echo 262144 > /proc/sys/net/nf_conntrack_max
# 调整文件描述符限制
echo "* soft nofile 1048576" >> /etc/security/limits.conf
echo "* hard nofile 1048576" >> /etc/security/limits.conf
7.2 kubelet配置优化
修改/var/lib/kubelet/config.yaml:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
maxPods: 250
kubeAPIQPS: 50
kubeAPIBurst: 100
serializeImagePulls: false
7.3 容器运行时优化
对于containerd,建议配置:
toml复制[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
disable_snapshot_annotations = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
8. 安全加固措施
8.1 RBAC配置
创建最小权限ServiceAccount:
yaml复制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
8.2 Pod安全策略
yaml复制apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
fsGroup:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
readOnlyRootFilesystem: false
8.3 网络策略
限制命名空间间通信:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
9. 版本升级策略
9.1 小版本升级
bash复制# 查看可升级版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 升级kubeadm
yum install -y kubeadm-1.28.1-0 --disableexcludes=kubernetes
# 升级控制平面
kubeadm upgrade apply v1.28.1
# 升级节点
kubeadm upgrade node
9.2 大版本升级注意事项
- 先升级kubeadm
- 升级Master节点
- 升级Worker节点
- 验证所有工作负载正常运行
- 升级CNI插件等附加组件
建议在生产环境前先在测试环境验证升级过程。
10. 备份与恢复
10.1 etcd备份
bash复制# 创建快照
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 /tmp/etcd-snapshot.db
# 恢复快照
kubeadm reset
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-snapshot.db \
--data-dir /var/lib/etcd
10.2 资源备份
使用Velero进行集群资源备份:
bash复制velero install \
--provider aws \
--bucket my-backup-bucket \
--secret-file ./credentials \
--use-volume-snapshots=false \
--plugins velero/velero-plugin-for-aws:v1.0.0 \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio:9000
11. 混合架构支持
11.1 ARM节点加入
在ARM节点上安装特定架构的Kubernetes组件:
bash复制# 对于ARM64架构
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
11.2 多架构镜像支持
使用Docker Buildx构建多架构镜像:
bash复制docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t my-image:latest --push .
12. Windows节点支持
12.1 Windows节点加入
在Windows Server 2019/2022上:
powershell复制# 安装容器运行时
Install-Module -Name DockerMsftProvider -Force
Install-Package -Name Docker -ProviderName DockerMsftProvider -Force
Restart-Computer -Force
# 安装Kubernetes组件
curl.exe -LO https://dl.k8s.io/release/v1.28.0/bin/windows/amd64/kubectl.exe
curl.exe -LO https://dl.k8s.io/release/v1.28.0/bin/windows/amd64/kubelet.exe
curl.exe -LO https://dl.k8s.io/release/v1.28.0/bin/windows/amd64/kubeadm.exe
12.2 Windows网络配置
使用flannel host-gw模式:
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后在Windows节点上安装flannel:
powershell复制Invoke-WebRequest -Uri https://github.com/flannel-io/flannel/releases/latest/download/flanneld.exe -OutFile C:\flanneld.exe
13. GPU支持配置
13.1 NVIDIA GPU支持
bash复制# 安装NVIDIA驱动
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | tee /etc/yum.repos.d/nvidia-docker.repo
yum install -y nvidia-container-toolkit
# 配置containerd
nvidia-ctk runtime configure --runtime=containerd
systemctl restart containerd
# 部署NVIDIA设备插件
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.13.0/nvidia-device-plugin.yml
13.2 使用GPU资源
在Pod定义中请求GPU:
yaml复制apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: cuda-container
image: nvidia/cuda:11.0-base
resources:
limits:
nvidia.com/gpu: 1
14. 边缘计算场景优化
14.1 K3s轻量级部署
bash复制curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.0+k3s1 sh -s - \
--disable servicelb \
--disable traefik \
--docker
14.2 MicroK8s配置
bash复制snap install microk8s --classic
microk8s enable dns dashboard storage
15. 自定义集群组件
15.1 替换CoreDNS
bash复制helm install my-coredns stable/coredns \
--set service.clusterIP=10.96.0.10 \
--namespace kube-system
15.2 自定义调度器
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: custom-scheduler
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: custom-scheduler
template:
metadata:
labels:
app: custom-scheduler
spec:
serviceAccountName: custom-scheduler
containers:
- command:
- /usr/local/bin/kube-scheduler
- --config=/etc/kubernetes/custom-scheduler-config.yaml
image: registry.k8s.io/kube-scheduler:v1.28.0
name: custom-scheduler
16. 多集群管理
16.1 kubectl多集群配置
bash复制# 合并多个集群配置
KUBECONFIG=~/.kube/config:~/.kube/config-cluster2 kubectl config view --flatten > ~/.kube/config-combined
# 切换上下文
kubectl config use-context cluster1
16.2 使用Rancher管理
bash复制docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
--privileged \
rancher/rancher:latest
17. 服务网格集成
17.1 Istio安装
bash复制curl -L https://istio.io/downloadIstio | sh -
cd istio-1.16.1
./bin/istioctl install --set profile=demo -y
17.2 Linkerd安装
bash复制curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin
linkerd install | kubectl apply -f -
18. 持续交付流水线
18.1 Argo CD部署
bash复制kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
18.2 Tekton配置
bash复制kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
19. 机器学习支持
19.1 Kubeflow部署
bash复制export PIPELINE_VERSION=1.8.0
kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/cluster-scoped-resources?ref=$PIPELINE_VERSION"
kubectl wait --for condition=established --timeout=60s crd/applications.app.k8s.io
kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/platform-agnostic-pns?ref=$PIPELINE_VERSION"
19.2 PyTorch Operator
bash复制kubectl apply -f https://raw.githubusercontent.com/kubeflow/training-operator/master/manifests/pytorch-operator.yaml
20. 性能测试与基准
20.1 集群压力测试
bash复制kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/cluster-loader/v2.0.0/pkg/config/master-config.yaml
20.2 网络性能测试
bash复制kubectl create deploy netperf --image=networkstatic/netperf
kubectl expose deploy netperf --port=12865 --target-port=12865
21. 自定义资源扩展
21.1 Operator SDK使用
bash复制operator-sdk init --domain=example.com --repo=github.com/example/memcached-operator
operator-sdk create api --group=cache --version=v1alpha1 --kind=Memcached --resource --controller
21.2 自定义控制器
go复制func (r *MemcachedReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx)
memcached := &cachev1alpha1.Memcached{}
err := r.Get(ctx, req.NamespacedName, memcached)
if err != nil {
if errors.IsNotFound(err) {
log.Info("Memcached resource not found. Ignoring since object must be deleted")
return ctrl.Result{}, nil
}
log.Error(err, "Failed to get Memcached")
return ctrl.Result{}, err
}
// Your reconciliation logic here
return ctrl.Result{}, nil
}
22. 安全扫描与合规
22.1 Trivy扫描
bash复制trivy k8s --report summary cluster
22.2 kube-bench检查
bash复制docker run --rm --pid=host -v /etc:/etc:ro -v /var:/var:ro -t aquasec/kube-bench:latest run --targets master,node
23. 成本优化策略
23.1 集群自动扩缩
bash复制kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/cluster-autoscaler-1.28.0/cluster-autoscaler-autodiscover.yaml
23.2 资源请求优化
使用Vertical Pod Autoscaler:
bash复制kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-0.13.0/vertical-pod-autoscaler-crd.yaml
24. 灾难恢复演练
24.1 模拟节点故障
bash复制kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
24.2 模拟etcd故障
bash复制# 随机选择一个etcd pod
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')
# 删除etcd pod
kubectl delete pod -n kube-system $ETCD_POD
25. 社区生态集成
25.1 Helm Chart仓库
bash复制helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-release bitnami/nginx
25.2 Operator Hub
bash复制kubectl create -f https://operatorhub.io/install/etcd.yaml
26. 未来演进方向
Kubernetes生态持续快速发展,建议关注以下技术趋势:
- eBPF在网络和安全领域的深度应用
- WebAssembly运行时支持
- 服务网格与Sidecarless架构演进
- 混合云与边缘计算集成方案
- 人工智能负载的原生调度支持
在实际生产部署中,我发现合理规划集群规模、提前设计高可用架构、建立完善的监控体系是确保Kubernetes集群稳定运行的关键。对于刚接触Kubernetes的团队,建议从单节点开发环境开始,逐步过渡到多节点测试集群,最后再部署生产环境。
