Kubernetes容器编排入门:从kubeadm集群搭建到应用部署全流程

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/

(0)
小编小编
上一篇 9小时前
下一篇 9小时前

相关推荐