Kubernetes核心概念与架构解析
Kubernetes容器编排已成为现代DevOps实践的基础设施标准。从Docker自动化部署到Kubernetes集群管理,容器化技术彻底改变了应用的构建、部署和运维方式。理解Kubernetes的架构设计是掌握容器编排的前提。
Kubernetes集群由控制平面(Control Plane)和工作节点(Worker Node)组成。控制平面负责集群调度和状态管理,包含四个核心组件:kube-apiserver提供API入口,etcd存储集群状态数据,kube-scheduler负责Pod调度,kube-controller-manager执行控制器逻辑。工作节点上运行kubelet(与控制平面通信)、kube-proxy(管理网络规则)和容器运行时(containerd或CRI-O)。
Pod是Kubernetes最小的调度单元,一个Pod可以包含一个或多个容器。Deployment管理Pod的副本数和更新策略。Service提供稳定的网络访问入口。Ingress管理外部HTTP/HTTPS路由。这些概念构成了日常运维中使用最频繁的资源对象。
使用kubeadm搭建生产级集群
kubeadm是官方推荐的集群初始化工具,适用于快速搭建标准Kubernetes集群。以下演示一个一主两从集群的完整搭建过程。
所有节点执行的基础环境准备:
#!/bin/bash
# 所有节点执行
# 关闭swap(Kubernetes要求)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 内核参数调整
cat >> /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p
# 加载内核模块
modprobe br_netfilter
modprobe overlay
# 配置containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改SystemdCgroup为true
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
systemctl enable containerd
# 安装kubeadm, kubelet, kubectl
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
EOF
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
控制平面节点初始化:
# 在Master节点执行
kubeadm init \
--apiserver-advertise-address=192.168.1.10 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version=v1.30.0
# 初始化完成后,按照提示配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 安装Calico网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 查看节点状态
kubectl get nodes
工作节点加入集群:
# 在Worker节点执行(使用kubeadm init输出的join命令)
kubeadm join 192.168.1.10:6443 --token xxxxxx.xxxxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
节点加入后在Master节点确认:
# 所有节点应显示Ready状态
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# k8s-master Ready control-plane 10m v1.30.0
# k8s-worker1 Ready 5m v1.30.0
# k8s-worker2 Ready 5m v1.30.0
应用容器化与Deployment部署
应用部署的第一步是编写Dockerfile完成容器化。以下是一个Go语言Web服务的容器化示例:
# Dockerfile
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o server cmd/server/main.go
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/server .
COPY --from=builder /app/configs ./configs
EXPOSE 8080
CMD ["./server"]
构建并推送镜像后,编写Kubernetes Deployment和Service的YAML清单:
# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: production
labels:
app: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: registry.example.com/web-app:v1.2.0
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db_host
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: db_password
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: web-app-svc
namespace: production
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 8080
protocol: TCP
type: ClusterIP
部署应用并验证:
# 创建命名空间
kubectl create namespace production
# 创建ConfigMap和Secret
kubectl create configmap app-config \
--from-literal=db_host=mysql.prod.svc.cluster.local \
-n production
kubectl create secret generic app-secret \
--from-literal=db_password=YourSecurePassword \
-n production
# 部署应用
kubectl apply -f app-deployment.yaml
# 查看部署状态
kubectl get pods -n production -l app=web-app
kubectl rollout status deployment/web-app -n production
# 滚动更新(修改镜像版本后)
kubectl set image deployment/web-app \
web-app=registry.example.com/web-app:v1.3.0 \
-n production
# 如需回滚
kubectl rollout undo deployment/web-app -n production
kubectl rollout history deployment/web-app -n production
Ingress流量管理与服务暴露
Service的ClusterIP类型只能在集群内部访问。生产环境中通常使用Ingress控制器统一管理外部流量路由,实现基于域名的虚拟主机、TLS终止和路径转发。
# 安装NGINX Ingress Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
# 配置Ingress路由规则
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app-ingress
namespace: production
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rate-limit: "100"
spec:
tls:
- hosts:
- api.example.com
secretName: tls-secret
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-svc
port:
number: 80
- path: /static
pathType: Prefix
backend:
service:
name: static-svc
port:
number: 80
EOF
CI/CD流水线与Kubernetes的结合实现了从代码提交到生产部署的全自动化。典型的GitOps流程使用ArgoCD或Flux监听Git仓库变更,自动同步配置到集群。这种方式将基础设施声明式配置纳入版本控制,配合故障应急响应预案,能显著降低运维操作风险。
日志分析方面,推荐使用EFK(Elasticsearch + Fluentd + Kibana)或Loki stack收集集群日志。通过DaemonSet在每个节点部署Fluentd/Fluent Bit,自动采集所有容器的stdout/stderr日志。结合Prometheus + Grafana构建监控告警体系,覆盖Pod CPU/内存使用率、节点资源水位、API Server延迟等核心指标。这些工具链构成了Kubernetes生产环境的可观测性基础。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-rong-qi-bian-pai-ru-men-cong-kubeadm-ji-qun-da/