一、kubeadm

原理:kubeadm 只是部署工具,不提供二进制,把控制平面各组件以容器镜像方式运行,自动生成 SSL 证书、初始化 etcd,master 节点执行kubeadm init初始化控制平面,worker 节点执行kubeadm join加入集群,不会安装 CNI 网络插件,需要手动部署,支持单 Master 和多 Master 高可用。

适用:企业自建私有 K8s、CKA 实验环境;缺点:离线部署镜像处理麻烦,深度定制能力有限。

# 控制平面初始化
kubeadm init --apiserver-advertise-address=192.168.10.10 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16

# 配置kubectl认证
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# work节点加入集群(输出的join命令)
kubeadm join 192.168.10.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxx

# 部署网络插件calico
kubectl apply -f calico.yaml

二、二进制部署

原理:手动下载 etcd、kube‑apiserver、kube‑controller‑manager、kube‑scheduler、kubelet、kube‑proxy 二进制程序,手动签发全套 SSL 证书,手写 systemd 服务单元文件,组件直接以宿主机进程运行,不封装容器,etcd 集群手动搭建,所有参数完全可控。

适用:学习 K8s 底层原理、安全合规严格私有化环境;缺点:步骤繁琐,证书维护、版本升级成本高,极易出错。

[Unit]
Description=kube-apiserver
After=network.target

[Service]
ExecStart=/opt/k8s/bin/kube-apiserver \
--etcd-servers=https://192.168.10.10:2379 \
--etcd-ca-cert=/opt/k8s/ca.pem \
--client-ca-file=/opt/k8s/ca.pem
Restart=on-failure

[Install]
WantedBy=multi-user.target

三、kubespray(Ansible 自动化部署)

原理:基于 Ansible 剧本做批量自动化,底层依然调用 kubeadm 实现集群安装。Ansible 批量预处理服务器:关闭 swap、时间同步、加载内核模块、安装 containerd,自动处理证书、高可用、CNI、节点扩容缩容。

适用:大规模多节点集群批量交付;缺点:依赖 Ansible,配置项多,需要熟悉 inventory 清单

[all]
k8s-master01 ansible_host=192.168.10.10
k8s-node01 ansible_host=192.168.10.11
k8s-node02 ansible_host=192.168.10.12

[kube_control_plane]
k8s-master01

[kube_node]
k8s-node01
k8s-node02

四、托管 K8s

原理:云厂商完全托管控制平面(Master 节点用户不可见),etcd、apiserver、controller‑manager、scheduler 全部由云侧维护,自动高可用、备份、版本升级;用户仅管理 Worker 业务节点,只需要拿到 kubeconfig 即可访问集群,没有集群初始化部署命令。

适用:公有云业务快速上线,不想维护 master 组件;缺点:底层无法深度定制,会产生服务费用。

四种部署方式通用业务yaml

# 四种部署方式通用业务yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-demo
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80

更多推荐