Ubuntu 系统上部署 Kubernetes 的完整指南


在这里插入图片描述



以下是 在全新安装的 Ubuntu 系统上部署 Kubernetes 的完整指南,涵盖环境准备、集群部署、运维管理及生产级最佳实践,适用于开发和生产场景。


一、环境准备(Ubuntu 22.04/24.04)

1. 系统初始化

# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg apt-transport-https ca-certificates software-properties-common

# 禁用交换分区(Kubernetes 要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab  # 永久禁用

# 设置主机名(可选)
sudo hostnamectl set-hostname k8s-master  # 主节点
sudo hostnamectl set-hostname k8s-worker1 # 工作节点

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

# 安装 containerd
sudo apt install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd

# 验证运行时状态
sudo ctr version

3. 安装 Kubernetes 组件(kubeadm, kubelet, kubectl)

# 添加 Kubernetes 官方 GPG 密钥
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

# 添加仓库源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 安装指定版本(例如 1.28.x)
sudo apt update && sudo apt install -y kubeadm=1.28.* kubelet=1.28.* kubectl=1.28.*

# 设置 kubelet 自动启动(暂不启动)
sudo systemctl enable kubelet

二、部署 Kubernetes 集群

1. 初始化主节点

# 主节点执行
sudo kubeadm init \
  --pod-network-cidr=192.168.0.0/16 \  # 匹配 Calico 默认配置
  --apiserver-advertise-address=<主节点IP> \
  --control-plane-endpoint=<主节点IP或负载均衡地址>

# 成功后按提示操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件(Calico)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml

2. 添加工作节点

# 在工作节点执行(使用主节点初始化后生成的命令)
sudo kubeadm join <主节点IP>:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

3. 验证集群状态

kubectl get nodes  # 所有节点状态应为 Ready
kubectl cluster-info

三、部署应用示例

1. 创建 Deployment

# 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:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"

2. 创建 Service

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080

3. 部署应用

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# 验证
kubectl get pods -o wide
curl http://<节点IP>:30080  # 应返回 Nginx 欢迎页

四、运维管理

1. 资源监控

# 安装 Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 查看资源使用
kubectl top nodes
kubectl top pods

2. 日志管理

# 查看 Pod 日志
kubectl logs <pod-name> -f  # 实时日志

# 安装 EFK 日志系统(生产环境)
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/main/config/recipes/elasticsearch/elasticsearch.yaml

3. 自动扩缩容

# 设置 Horizontal Pod Autoscaler
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=2 --max=5

五、生产级最佳实践

1. 高可用控制平面

  • 使用 kubeadm 部署多主节点:

    # 第一个主节点初始化后,其他主节点执行:
    sudo kubeadm join <负载均衡IP>:6443 --token <token> \
      --discovery-token-ca-cert-hash sha256:<hash> \
      --control-plane
    

2. 持久化存储

	# 创建 PersistentVolume(示例使用本地存储)
	apiVersion: v1
	kind: PersistentVolume
	metadata:
	  name: local-pv
	spec:
	  capacity:
	    storage: 10Gi
	  accessModes:
	  - ReadWriteOnce
	  persistentVolumeReclaimPolicy: Retain
	  storageClassName: local-storage
	  local:
	    path: /mnt/data
	  nodeAffinity:
	    required:
	      nodeSelectorTerms:
	      - matchExpressions:
	        - key: kubernetes.io/hostname
	          operator: In
	          values:
	          - <特定节点主机名>

3. 安全加固

  • 启用 RBAC:

        # 创建 Role 和 RoleBinding
        apiVersion: rbac.authorization.k8s.io/v1
        kind: Role
        metadata:
          name: pod-reader
        rules:
        - apiGroups: [""]
          resources: ["pods"]
          verbs: ["get", "list"]
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          name: read-pods
        subjects:
        - kind: User
          name: dev-user
        roleRef:
          kind: Role
          name: pod-reader
          apiGroup: rbac.authorization.k8s.io
    
  • 网络策略:

        # 限制 Pod 入站流量
        apiVersion: networking.k8s.io/v1
        kind: NetworkPolicy
        metadata:
          name: deny-all-ingress
        spec:
          podSelector: {}
          policyTypes:
          - Ingress
    

六、备份与灾难恢复

1. 备份 etcd 数据

	# 在主节点执行
	sudo ETCDCTL_API=3 etcdctl \
	  --endpoints=https://127.0.0.1:2379 \
	  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
	  --cert=/etc/kubernetes/pki/etcd/server.crt \
	  --key=/etc/kubernetes/pki/etcd/server.key \
	  snapshot save /backup/etcd-snapshot.db

2. 恢复 etcd 数据

	# 停止 kube-apiserver 和 etcd
	sudo systemctl stop kube-apiserver etcd
	
	# 恢复快照
	sudo ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
	  --data-dir=/var/lib/etcd-restored
	
	# 重启服务
	sudo systemctl start etcd kube-apiserver

七、常见问题排查

1. Pod 处于 Pending 状态

  • 可能原因:

    • 资源不足(CPU/内存)。

    • 没有可用节点匹配调度规则。

  • 解决:

    kubectl describe pod <pod-name> | grep Events  # 查看事件
    kubectl get nodes -o wide                     # 检查节点资源
    

2. 服务无法访问

  • 可能原因:

    • Service 的 selector 与 Pod 标签不匹配。

    • 网络策略阻止流量。

  • 解决:

    kubectl describe service <service-name>  # 检查 Endpoints
    kubectl get networkpolicy                # 查看网络策略
    

通过以上步骤,您可以在 Ubuntu 系统上完成 Kubernetes 集群的部署、应用管理及生产级运维。建议结合监控、日志和备份策略,确保集群的稳定性和可靠性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独隅

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值