插件窝 干货文章 K8S在Linux上的最佳安装实践

K8S在Linux上的最佳安装实践

sudo Kubernetes kubectl Containerd 721    来源:    2025-05-09

Kubernetes (K8S) 在 Linux 上的最佳安装实践

1. 准备工作

系统要求

  • 操作系统: Ubuntu 20.04/22.04 LTS, CentOS 7/8, RHEL 7/8 或兼容发行版
  • 硬件:
    • 至少 2GB RAM (生产环境建议 4GB+)
    • 2核CPU (生产环境建议4核+)
    • 20GB 可用磁盘空间

系统配置

# 禁用交换空间 (Kubernetes 1.8+要求)
sudo swapoff -a
# 永久禁用,编辑 /etc/fstab 注释掉swap行

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

# 将主机名添加到 /etc/hosts
echo "127.0.0.1 $(hostname)" | sudo tee -a /etc/hosts

# 允许iptables检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

2. 安装容器运行时

选项1: Containerd (推荐)

# 安装依赖
sudo apt-get update && sudo apt-get install -y containerd  # Ubuntu
sudo yum install -y containerd  # CentOS/RHEL

# 配置containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 修改配置启用systemd cgroup驱动
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 重启并启用服务
sudo systemctl restart containerd
sudo systemctl enable containerd

选项2: Docker

# 安装Docker
curl -fsSL https://get.docker.com | sh

# 配置Docker使用systemd作为cgroup驱动
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 重启并启用服务
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

3. 安装Kubernetes组件

添加Kubernetes仓库

# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# CentOS/RHEL
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

安装kubeadm, kubelet和kubectl

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl  # 防止自动更新

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

4. 初始化Kubernetes集群

在主节点上执行

# 使用containerd时
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/containerd/containerd.sock

# 使用Docker时
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 成功初始化后会显示加入集群的命令,类似:
# kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

配置kubectl

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

5. 安装网络插件 (CNI)

Flannel (推荐)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Calico

kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

6. 加入工作节点

在每个工作节点上执行初始化时输出的kubeadm join命令:

sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

7. 验证安装

# 查看节点状态
kubectl get nodes

# 查看所有pod状态
kubectl get pods --all-namespaces

# 检查集群健康状况
kubectl get componentstatuses

8. 可选配置

安装Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# 创建管理员用户
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# 创建集群角色绑定
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

# 获取访问令牌
kubectl -n kubernetes-dashboard create token admin-user

# 访问Dashboard (需要配置kubectl proxy)
kubectl proxy
# 然后访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

安装Metrics Server (用于HPA)

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

9. 生产环境建议

  1. 高可用控制平面: 设置多个主节点

    # 在第一个主节点初始化后,在其他控制平面节点上执行
    sudo kubeadm join <load-balancer-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash> --control-plane --certificate-key <cert-key>
    
  2. 使用外部etcd集群提高可靠性

  3. 配置持久化存储: 考虑使用Ceph, NFS或云提供商存储解决方案

  4. 启用RBAC: 确保适当的访问控制

  5. 配置网络策略: 增强安全性

  6. 设置监控和日志: Prometheus + Grafana + ELK Stack

  7. 定期备份: 使用Velero等工具备份集群状态

故障排除

  • 如果节点状态为NotReady,检查网络插件是否正常运行
  • 查看组件日志: journalctl -u kubelet -f
  • 重置集群: sudo kubeadm reset
  • 检查容器运行时状态: sudo systemctl status containerdsudo systemctl status docker

遵循这些最佳实践将帮助您建立一个稳定、高效的Kubernetes集群。根据您的具体需求和环境,可能需要进行额外的配置和调整。