# Kubernetes (k8s) 安装与基本应用指南 - Rocky Linux

本指南将介绍在 Rocky Linux 上安装 Kubernetes 集群并部署基本应用的完整流程。

## 前提条件

- 至少两台 Rocky Linux 9 服务器（1 个控制平面节点，1 个工作节点）
- 每台服务器至少 2GB RAM 和 2 个 CPU 核心
- 所有节点之间的网络连接
- sudo 或 root 权限

## 第一部分：安装准备

### 1. 在所有节点上执行以下操作

#### 设置主机名和 hosts 文件

```bash
# 控制平面节点
sudo hostnamectl set-hostname k8s-master

# 工作节点
sudo hostnamectl set-hostname k8s-worker1

# 编辑 /etc/hosts 文件（在所有节点上）
sudo vi /etc/hosts
```

添加如下内容（根据实际 IP 修改）：
```
192.168.1.100 k8s-master
192.168.1.101 k8s-worker1
```

#### 禁用 SELinux 和防火墙

```bash
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sudo systemctl disable --now firewalld
```

#### 禁用交换空间

```bash
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
```

#### 加载内核模块

```bash
sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
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
```

## 第二部分：安装容器运行时和 Kubernetes

### 2. 安装容器运行时（containerd）

```bash
# 安装依赖
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 containerd
sudo dnf install -y containerd.io

# 配置 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 sed -i 's|registry.k8s.io|registry.aliyuncs.com/google_containers|g' /etc/containerd/config.toml

# 启动并启用 containerd
sudo systemctl enable --now containerd
```

### 3. 安装 Kubernetes 组件

```bash
# 备份原有仓库文件
sudo mv /etc/yum.repos.d/kubernetes.repo /etc/yum.repos.d/kubernetes.repo.bak

# 使用阿里云镜像源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装 kubelet, kubeadm 和 kubectl
sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 启动并启用 kubelet
sudo systemctl enable --now kubelet
```

## 第三部分：初始化 Kubernetes 集群

### 4. 在控制平面节点上初始化集群

```bash
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
sudo kubeadm init   --pod-network-cidr=10.244.0.0/16   --apiserver-advertise-address=172.17.58.210   --cri-socket=unix:///var/run/containerd/containerd.sock --image-repository=registry.aliyuncs.com/google_containers

# 初始化完成后会显示加入集群的命令，类似：
# kubeadm join 192.168.1.100:6443 --token <token> --discovery-token-ca-cert-hash <hash>
```

### 5. 配置 kubectl

```bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

### 6. 安装网络插件（Flannel）

```bash
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

### 7. 将工作节点加入集群

在工作节点上运行控制平面初始化时提供的 `kubeadm join` 命令。

## 第四部分：验证集群

### 8. 检查节点状态

```bash
kubectl get nodes
```

### 9. 检查所有 pod 状态

```bash
kubectl get pods --all-namespaces
```

## 第五部分：部署基本应用

### 10. 部署 Nginx 示例应用

```bash
# 创建 deployment
kubectl create deployment nginx --image=nginx

# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort

# 获取服务信息
kubectl get svc nginx
```

### 11. 访问应用

使用 `kubectl get svc nginx` 输出的 NodePort 端口访问 Nginx 服务。

## 常见问题解决

1. **节点 NotReady 状态**：
   - 检查网络插件是否安装正确
   - 查看 kubelet 日志：`journalctl -u kubelet -f`

2. **Pod 一直处于 Pending 状态**：
   - 检查资源是否足够：`kubectl describe pod <pod-name>`
   - 检查节点是否有污点：`kubectl describe node | grep Taint`

3. **kubeadm init 失败**：
   - 重置集群：`sudo kubeadm reset`
   - 检查容器运行时是否正常运行

## 后续步骤

1. 安装 Kubernetes 仪表板
2. 配置持久化存储
3. 设置 Ingress 控制器
4. 配置监控和日志系统

通过以上步骤，您已经在 Rocky Linux 上成功部署了一个基本的 Kubernetes 集群并运行了第一个应用。