Press "Enter" to skip to content

K8s安装

k8s安装

背景:和docker-compose一样,k8s也是容器编排工具,但k8s是一个更复杂的容器编排系统,用于管理大规模的容器化应用。

核心定位

维度 Docker Compose Kubernetes
目标场景 单机开发,测试环境(单节点) 生产多节点集群,大规模分布式应用
功能定位 定义和运行多容器应用(开发友好) 容器编排,集群管理,自动化运维
学习曲线 简单(YAML语法直观) 陡峭(需掌握Pod, Service, Ingress等核心概念)

核心功能对比

功能 Docker Compose Kubernetes
容器编排 单机多容器编排(通过docker-compose.yml) 跨节点容器编排(支持回滚更新,回滚,副本管理)
扩展性 仅单机扩展(依赖宿主机资源) 动态扩缩容(HPA), 多接点集群自动调度
高可用性 不支持(单点故障风险) 支持(Pod自动重启,节点故障转移)
网络管理 简单容器间网络(自定义网络) 复杂网络策略(NetworkPolicy, Service发现)
存储管理 本地卷或命名卷 动态卷供应(PV/PVC),支持云存储和分布式存储
负载均衡 无内置负载均衡 Service和Ingress支持负载均衡
监控与日志 依赖外部工具(如Prometheus+Grafana) 集成监控(Metrics Server),日志聚合方案丰富

适用场景

Docker Compose适用场景

  • 本地开发环境:快速启动多个关联服务(如前端+后端+数据库)
  • 单机测试:验证多容器应用的交互逻辑
  • 简单项目部署:小型项目或原型验证

Kubernetes适用场景

  • 生产环境部署:需要高可用性,自动恢复,滚动更新
  • 大规模集群管理:跨多个节点动态调度容器
  • 微服务架构:服务发现,流量管理,金丝雀发布
  • 混合云/多云部署:统一管理跨云平台的容器

配置文件示例:

Docker Compose(docker-compose.yml)

version: "3.8"
service:
  web:
    image: nginx:latest
	ports:
	  - "8080:80"
  db:
	image: postgres: 13
	volumns:
	  - db_data: /var/lib/postgresql/data
volumns:
db_data:

Kubernetes(deployment.yaml + service.yaml)

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80

关键差异总结

维度 Docker Compose Kubernetes
部署范围 单机 多接点集群
自动扩展 不支持 支持(HPA, Cluster Autoscaler)
服务发现 手动配置容器别名 通过Service和DNS自动发现
故障恢复 需手动重启容器 自动重启Pod, 节点故障转移
更新策略 需手动停止并重启容器 滚动更新,蓝绿部署,金丝雀发布
存储管理 本地卷或简单命名卷 动态卷供应,支持云存储
网络模型 简单容器间通信 多租户网络隔离,网络策略

如何选择

  • 选择Docker Compose:

    • 本地开发,快速验证多容器交互
    • 单机部署简单应用
    • 无需复杂运维能力
  • 选择Kubernetes:

    • 生产环境需要高可用和弹性扩展
    • 管理大规模微服务架构
    • 需要自动化运维(自愈,滚动更新)

互补场景

  • 开发与生产分离:

    在开发阶段使用Docker Compose快速搭建环境,生产环境使用Kubernetes部署

  • 工具链整合:

    使用Kompose工具将docker-compose.yml转换为Kubernetes资源配置(适合过度阶段)

总结: 轻量化开发选Docker Compose, 生产级部署选Kubernetes

安装k8s:

所有节点通用配置:

# 关闭 Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab  # 永久禁用

# 设置主机名主节点
sudo hostnamectl set-hostname k8s-master
# 工作节点
sudo hostnamectl set-hostname k8s-node1

# 将主机名写入 /etc/hosts所有节点
sudo vi /etc/hosts
# 添加以下内容替换为实际 IP
192.168.1.100 k8s-master
192.168.1.101 k8s-node1

# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter

# 配置网络参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system

2.安装容器运行时(以containerd为例)

sudo yum install -y containerd
# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd

3.安装Kubernetes组件

  • 添加Kubernetes源

    # CentOS
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
    EOF
    sudo yum clean all
    sudo yum makecache
    
  • 安装kubeadm, kubelet, kubectl

    # CentOS
    sudo yum install -y kubelet kubeadm kubectl
    sudo systemctl enable --now kubelet
    

3.初始化控制平面(Master节点)

# 初始化集群替换 <master-ip> 为实际 IP
sudo kubeadm init \
  --apiserver-advertise-address=<master-ip> \
  --control-plane-endpoint=k8s-master \
  --pod-network-cidr=10.244.0.0/16 \
  --image-repository=registry.aliyuncs.com/google_containers  # 国内镜像源

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

# 查看节点状态
kubectl get nodes  # 应显示 NotReady等待网络插件安装

4.安装网络插件(Calico)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 等待 Pod 就绪
kubectl get pods -n kube-system -w

5.加入工作节点

在工作节点执行以下命令(命令来自Master初始化时的输出)

sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>

6.验证集群状态

kubectl get nodes  # 所有节点应显示 Ready
kubectl get pods -A  # 检查系统 Pod 是否全部 Running

7.快速测试集群

# 部署测试应用
kubectl create deployment nginx --image=nginx:latest
kubectl expose deployment nginx --port=80 --type=NodePort
# 获取访问端口
kubectl get svc nginx
# 浏览器访问 http://<节点IP>:<NodePort>

1742798613230

常见问题解决

1.镜像拉取失败

  • 使用国内镜像源:

    kubeadm init 时指定 --image-repository=registry.aliyuncs.com/google_containers

  • 手动拉取镜像:

    kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
    

2.节点NotReady

  • 检查网络插件:

    确保Calico/Flannel Pod正常运行:

    kubectl get pods -n kube-system | grep calico
    

3.重置集群

sudo kubeadm reset
sudo rm -rf /etc/cni/net.d /etc/kubernetes/ $HOME/.kube

4.查看k8s系统镜像

ctr -n k8s.io images ls | grep calico/cni

5.手动下载并导入镜像

#  Docker Hub 拉取镜像默认源
docker pull calico/kube-controllers:v3.26.1

# 或使用阿里云镜像加速推荐中国大陆用户
docker pull registry.aliyuncs.com/calico/kube-controllers:v3.26.1

# 查看已拉取的镜像
docker images | grep calico/kube-controllers
# 导出 Docker 镜像为 tar 文件
docker save calico/cni:v3.26.1 -o calico-cni.tar

# 导入到 containerd
ctr -n k8s.io images import calico-cni.tar