1. 环境准备与K8s集群搭建
在开始部署Nginx之前,我们需要先准备好Kubernetes环境。我推荐使用1.33.3版本,这是经过充分验证的稳定版本,特别适合生产环境使用。以下是详细的准备工作:
1.1 系统要求与依赖安装
首先确保你的服务器满足以下基本要求:
- 至少2GB RAM(推荐4GB以上)
- 双核CPU(推荐四核)
- 20GB可用磁盘空间
- CentOS 7+/Ubuntu 18.04+操作系统
安装必要的依赖包:
bash复制# CentOS/RHEL
sudo yum install -y conntrack socat ebtables ipset
# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y conntrack socat ebtables ipset
1.2 容器运行时安装
Kubernetes 1.33.3支持多种容器运行时,我推荐使用containerd:
bash复制# 安装containerd
wget https://github.com/containerd/containerd/releases/download/v1.6.8/containerd-1.6.8-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local containerd-1.6.8-linux-amd64.tar.gz
# 配置systemd服务
sudo mkdir -p /usr/local/lib/systemd/system/
sudo wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -O /usr/local/lib/systemd/system/containerd.service
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
1.3 Kubernetes组件安装
安装kubeadm、kubelet和kubectl:
bash复制# 添加Kubernetes仓库
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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
EOF
# 安装指定版本
sudo yum install -y kubelet-1.33.3 kubeadm-1.33.3 kubectl-1.33.3
sudo systemctl enable --now kubelet
1.4 集群初始化
使用kubeadm初始化集群:
bash复制sudo kubeadm init --kubernetes-version=1.33.3 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=<你的服务器IP>
注意:将<你的服务器IP>替换为你的服务器实际IP地址。初始化完成后,记下输出的kubeadm join命令,后续添加节点时会用到。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Nginx部署方案设计
在Kubernetes中部署Nginx有多种方式,我们需要根据实际需求选择合适的部署策略。
2.1 部署模式选择
常见的Nginx部署模式包括:
- 单Pod部署:最简单的部署方式,适合测试环境
- Deployment+Service:生产环境推荐方式,支持滚动更新和负载均衡
- DaemonSet:每个节点运行一个Nginx实例,适合边缘计算场景
- StatefulSet:需要持久化存储的场景
对于大多数生产环境,我推荐使用Deployment+Service的组合方式,它提供了良好的扩展性和高可用性。
2.2 资源配置规划
根据Nginx的预期负载,我们需要合理配置资源请求和限制:
- 小型网站:100m CPU,128Mi内存
- 中型应用:500m CPU,512Mi内存
- 高流量服务:1-2 CPU,1-2Gi内存
2.3 网络配置考虑
Kubernetes中的Nginx通常需要以下网络配置:
- ClusterIP:集群内部访问
- NodePort:通过节点端口暴露服务
- LoadBalancer:云环境推荐方式
- Ingress:需要配合Ingress Controller使用
3. 详细部署步骤
现在我们来具体实施Nginx在Kubernetes 1.33.3上的部署。
3.1 创建Nginx Deployment
首先创建Nginx的Deployment配置文件:
yaml复制# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.3
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
应用这个配置:
bash复制kubectl apply -f nginx-deployment.yaml
3.2 创建Service暴露Nginx
为了让Nginx服务可以被访问,我们需要创建一个Service:
yaml复制# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
应用Service配置:
bash复制kubectl apply -f nginx-service.yaml
3.3 验证部署
检查部署状态:
bash复制kubectl get deployments
kubectl get pods
kubectl get services
如果一切正常,你应该能看到类似下面的输出:
code复制NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 2m
NAME READY STATUS RESTARTS AGE
nginx-deployment-5c689d88bb-4q8v7 1/1 Running 0 2m
nginx-deployment-5c689d88bb-l2j6d 1/1 Running 0 2m
nginx-deployment-5c689d88bb-r9x8m 1/1 Running 0 2m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.96.123.123 <none> 80:30678/TCP 1m
4. 高级配置与优化
基础部署完成后,我们可以进行一些高级配置来优化Nginx在Kubernetes中的表现。
4.1 配置热更新
为了避免每次修改配置都需要重建Pod,我们可以使用ConfigMap来管理Nginx配置:
bash复制# 创建自定义nginx配置
kubectl create configmap nginx-config --from-file=nginx.conf=/path/to/your/nginx.conf
# 更新Deployment挂载ConfigMap
# 在nginx-deployment.yaml的spec.template.spec部分添加:
volumes:
- name: nginx-config
configMap:
name: nginx-config
containers:
- name: nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
4.2 启用自动扩缩容
Kubernetes支持根据CPU使用率自动扩缩容:
bash复制kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=3 --max=10
4.3 使用Ingress暴露服务
对于生产环境,建议使用Ingress来管理外部访问:
yaml复制# nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
5. 常见问题排查
在实际部署过程中,可能会遇到各种问题。以下是几个常见问题及其解决方案。
5.1 Pod处于Pending状态
可能原因:
- 资源不足
- 节点选择器不匹配
- 持久卷声明未绑定
解决方案:
bash复制# 查看详细事件
kubectl describe pod <pod-name>
# 检查节点资源
kubectl describe nodes
5.2 服务无法访问
可能原因:
- 网络策略限制
- 端口映射错误
- 防火墙规则
解决方案:
bash复制# 检查服务端点
kubectl get endpoints nginx-service
# 测试集群内访问
kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
wget -qO- http://nginx-service
5.3 配置更新不生效
可能原因:
- ConfigMap未正确挂载
- Nginx未重新加载配置
解决方案:
bash复制# 检查挂载的配置
kubectl exec <pod-name> -- cat /etc/nginx/nginx.conf
# 强制重新加载Nginx
kubectl exec <pod-name> -- nginx -s reload
6. 性能监控与日志收集
为了确保Nginx在Kubernetes中的稳定运行,我们需要设置监控和日志收集。
6.1 Prometheus监控
配置Prometheus监控Nginx:
yaml复制# nginx-service-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-monitor
labels:
release: prometheus
spec:
selector:
matchLabels:
app: nginx
endpoints:
- port: http
interval: 30s
path: /metrics
6.2 日志收集方案
使用Fluentd收集Nginx日志:
yaml复制# nginx-logging-sidecar.yaml
spec:
template:
spec:
containers:
- name: nginx
# ...原有配置...
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
- name: fluentd
image: fluent/fluentd
volumeMounts:
- name: nginx-logs
mountPath: /var/log/nginx
- name: fluentd-config
mountPath: /fluentd/etc
volumes:
- name: nginx-logs
emptyDir: {}
- name: fluentd-config
configMap:
name: fluentd-config
7. 安全加固措施
在生产环境中运行Nginx,安全是至关重要的考虑因素。
7.1 网络策略限制
限制Nginx Pod的网络访问:
yaml复制# nginx-network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: nginx-policy
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 53
- protocol: UDP
port: 53
7.2 安全上下文配置
为Nginx容器配置安全上下文:
yaml复制securityContext:
runAsNonRoot: true
runAsUser: 101 # Nginx默认用户ID
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
7.3 定期更新策略
建议定期更新Nginx和Kubernetes版本:
bash复制# 更新Nginx镜像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.23.4
# 升级Kubernetes集群
kubectl drain <node-name> --ignore-daemonsets
sudo yum update kubelet-1.33.4 kubeadm-1.33.4 kubectl-1.33.4
sudo systemctl restart kubelet
kubectl uncordon <node-name>
在实际生产环境中部署Nginx时,我发现有几个关键点特别值得注意:首先,一定要配置合理的资源限制,避免单个Pod占用过多资源影响其他服务;其次,使用Readiness和Liveness探针可以显著提高服务的可靠性;最后,定期检查Pod的调度分布,避免所有副本都集中在少数节点上。
