温馨提示×

如何在CentOS上使用Kubernetes进行微服务部署

小樊
40
2025-12-07 21:32:41
栏目: 智能运维

在 CentOS 上使用 Kubernetes 部署微服务的实操指南

一 环境准备与集群初始化

  • 规划与要求
    • 操作系统:CentOS 7.x/8.x
    • 节点:至少 2 台1 个 Master + 1 个 Worker
    • 资源:每节点至少 2 GB 内存、2 核 CPU、30 GB 磁盘
    • 主机名与解析(所有节点)
      • 设置主机名:hostnamectl set-hostname k8s-master / k8s-node1
      • 写入 /etc/hosts
        192.168.10.10 k8s-master
        192.168.10.11 k8s-node1
        
  • 系统与安全配置(所有节点)
    • 关闭防火墙与 SELinux:
      systemctl stop firewalld && systemctl disable firewalld
      setenforce 0
      sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
      
    • 关闭 Swap:
      swapoff -a
      sed -i '/swap/d' /etc/fstab
      
    • 开启桥接转发:
      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
      EOF
      modprobe br_netfilter
      sysctl --system
      
  • 安装容器运行时(Docker 或 Containerd,二选一)
    • Docker(推荐)
      yum install -y yum-utils device-mapper-persistent-data lvm2
      yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      yum install -y docker-ce docker-ce-cli containerd.io
      systemctl enable --now docker
      mkdir -p /etc/docker
      cat > /etc/docker/daemon.json <<EOF
      { "exec-opts": ["native.cgroupdriver=systemd"] }
      EOF
      systemctl restart docker
      
    • Containerd(K8s 1.24+ 常用)
      yum install -y containerd
      containerd config default > /etc/containerd/config.toml
      systemctl enable --now containerd
      
  • 安装 kubeadm/kubelet/kubectl(所有节点)
    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=0
    EOF
    yum install -y kubelet kubeadm kubectl
    systemctl enable --now kubelet
    
  • 初始化 Master(示例)
    kubeadm init \
      --apiserver-advertise-address=192.168.10.10 \
      --image-repository registry.aliyuncs.com/google_containers \
      --kubernetes-version v1.27.0 \
      --pod-network-cidr=10.244.0.0/16
    mkdir -p $HOME/.kube
    cp /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    
  • 安装 CNI 网络插件(任选其一)
    • Flannel:
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      
    • Calico:
      kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
      
  • 加入 Worker 节点
    • 在 Master 初始化完成后,使用输出的 kubeadm join ... 命令在各 Worker 上执行,加入成功后:
      kubectl get nodes
      

以上步骤覆盖了在 CentOS 上搭建可用 Kubernetes 集群的关键环节,包括系统调优、容器运行时配置、组件安装、集群初始化与网络插件部署。

二 构建镜像与推送

  • 构建镜像(示例为 Node.js)
    docker build -t myorg/myapp:1.0 .
    
  • 推送镜像(建议使用私有仓库或镜像托管)
    docker login
    docker push myorg/myapp:1.0
    
  • 说明
    • 微服务多组件需分别构建镜像并打上语义化标签(如 v1.0、v1.1),便于滚动升级与回滚。
    • 内网环境可部署 Harbor 或使用企业镜像仓库,保证镜像可达与访问控制。 上述镜像构建与推送流程是将应用交付到 Kubernetes 的前置步骤,适用于常见语言与框架。

三 部署微服务到 Kubernetes

  • 示例目录结构与资源
    k8s/
    ├── gateway.yaml
    ├── auth.yaml
    ├── system.yaml
    ├── mysql-stateful.yaml
    ├── redis-stateful.yaml
    ├── nacos-stateful.yaml
    └── namespace.yaml
    
  • 命名空间
    # namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: microservice
    
  • 无状态服务(Deployment + Service,示例:gateway)
    # gateway.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: gateway
      namespace: microservice
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: gateway
      template:
        metadata:
          labels:
            app: gateway
        spec:
          containers:
          - name: gateway
            image: myorg/gateway:1.0
            ports:
            - containerPort: 8080
            readinessProbe:
              httpGet:
                path: /health
                port: 8080
              initialDelaySeconds: 10
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              initialDelaySeconds: 20
              periodSeconds: 10
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: gateway
      namespace: microservice
    spec:
      type: NodePort
      selector:
        app: gateway
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
        nodePort: 30080
    
  • 有状态服务(StatefulSet,示例:MySQL)
    # mysql-stateful.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
      namespace: microservice
    spec:
      serviceName: mysql-headless
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8.0
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "StrongPassw0rd!"
            ports:
            - containerPort: 3306
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: mysql-pvc
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-headless
      namespace: microservice
    spec:
      clusterIP: None
      selector:
        app: mysql
      ports:
      - port: 3306
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pvc
      namespace: microservice
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
    
  • 部署与验证
    kubectl apply -f k8s/namespace.yaml
    kubectl apply -f k8s/gateway.yaml
    kubectl apply -f k8s/mysql-stateful.yaml
    kubectl -n microservice get pods,svc
    curl http://<任一节点IP>:30080/health
    

要点:将 MySQL、Redis、Nacos 等有状态服务用 StatefulSet 管理;将 Gateway、Auth、System 等无状态服务用 Deployment 管理;通过 Service 暴露访问入口,必要时使用 NodePort/Ingress 对外提供访问。

四 服务发现与配置管理

  • 服务发现
    • Kubernetes Service DNS:同一命名空间内可直接用服务名访问,例如 http://mysql:3306;跨命名空间使用 http://mysql.microservice.svc.cluster.local:3306
  • 配置与密钥
    • 使用 ConfigMap 管理非敏感配置,使用 Secret 管理敏感信息(如数据库密码),并在 Pod 中挂载为环境变量或卷。
  • 示例(Secret)
    kubectl -n microservice create secret generic db-secret \
      --from-literal=root-password='StrongPassw0rd!'
    

在微服务架构中,服务发现、配置与密钥管理是解耦与运维自动化的核心能力,配合 ServiceDNS 可实现稳定可靠的通信。

五 运维与扩展

  • 滚动升级与回滚
    kubectl -n microservice set image deployment/gateway gateway=myorg/gateway:1.1
    kubectl -n microservice rollout status deployment/gateway
    kubectl -n microservice rollout undo deployment/gateway
    
  • 弹性伸缩
    kubectl -n microservice scale deployment gateway --replicas=4
    
  • 日志与监控
    • 日志:kubectl -n microservice logs -f deployment/gateway
    • 监控:可部署 Prometheus + Grafana 采集指标与可视化大盘,便于容量规划与故障定位。
  • 常见问题排查
    • Pod 无法启动:查看事件与日志 kubectl -n microservice describe pod <pod>,检查镜像、资源、探针与挂载。
    • 节点 NotReady:检查 kubelet 状态、容器运行时、网络插件与节点污点/容忍度。 滚动升级、弹性伸缩与日志监控是生产级微服务的基本运维能力,配合健康检查与就绪探针可显著提升稳定性。

0