Kubernetes 非集群安装教程:新手入门笔记
环境
先交代下实验环境:CentOS 7,内核版本 kernel: 5.4.219-1.el7.elrepo.x86_64,K8s 版本 1.23.5(特别注意:1.24 版本开始不再支持 Docker,本流程不适用),Docker 版本 20.10.18(engine)。机器配置 8C/12G/500G,一共三台节点:
| IP | 主机名 | 备注 |
|---|---|---|
| 192.168.1.60 | centos-k8s-master-60 | master 节点 |
| 192.168.1.61 | centos-k8s-node-61 | node 节点 |
| 192.168.1.62 | centos-k8s-node-62 | node 节点 |
建议提前装好 wget、curl、net-tools、vim、git、jq 这些常用工具。
下面按步骤详细说明:准备工作(升级内核、设置主机名及 hosts、关闭 swap、关闭 selinux、关闭 firewalld、调整时区、开启 iptables、启用 ipvs 模式)→ 安装(调整内核参数、安装 Docker CE、安装 kubelet / kubeadm / kubectl、初始化主节点、安装 flannel、加入 Node 节点、安装 kubernetes-dashboard)→ 附录。
准备工作
以下操作在所有机器上执行。
升级内核版本
参见《CentOS 7 升级内核版本》。
设置主机名及 hosts 更新
通过如下命令或修改 /etc/hostname 文件,依次设置各节点主机名:
hostname set-hostname centos-k8s-master-60
然后修改 /etc/hosts 文件,添加三台机器的 IP 与主机名映射,效果如下:
重启后生效(可以等所有步骤完成后再统一重启)。
关闭 swap 分区
先检查是否已开启 swap:
free -m
若 swap 总量不为 0,则执行:
swapoff -a
同时编辑 /etc/fstab,删除或注释掉 swap 分区那一行。修改前:
修改后:
重启生效。
关闭 selinux
临时设置 permissive 模式:
setenforce 0
编辑 /etc/selinux/config,将 SELINUX 改为 disabled:
重启生效。
关闭 firewalld
systemctl stop firewalld
systemctl disable firewalld
调整时区及自动对时
略。
开启 iptables
yum install -y iptables iptables-services
systemctl start iptables
systemctl enable iptables
iptables -F
service iptables sa ve
启用 ipvs 模式
yum install -y ipvsadm ipset
创建 /etc/sysconfig/modules/ipvs.modules,写入:
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
# 部分教程用 nf_conntrack_ipv4,但后面会报错,这里使用 nf_conntrack
modprobe -- nf_conntrack
使其生效:
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep nf_conntrack
安装
调整内核参数
新建 /etc/sysctl.d/k8s.conf,写入:
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6 = 1
加载(若报错可先忽略):
sysctl -p /etc/sysctl.d/k8s.conf
安装 docker-ce
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update -y
yum install -y docker-ce
配置 /etc/docker/daemon.json:
{
"registry-mirrors": ["https://jo9w2k2o.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
启动并设置开机自启:
systemctl restart docker
systemctl restart docker-ce # 如无此服务可跳过
systemctl enable docker
安装 kubelet、kubeadm、kubectl
配置 yum 源,新建 /etc/yum.repos.d/kubernetes.repo:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
yum update
安装指定版本(1.23.5,高于此版本不再支持 Docker):
yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5
如果之前装了其他版本,可先 yum remove kubelet 移除。
初始化主节点
导出默认配置:
kubeadm config print init-defaults > kubeadm-config.yaml
修改 kubeadm-config.yaml:
- 将
localAPIEndpoint.advertiseAddress改为 master 节点 IP(192.168.1.60) - 修改
imageRepository为registry.cn-hangzhou.aliyuncs.com/google_containers - 修改
kubernetesVersion为v1.23.5 - 设置
networking.podSubnet(如10.244.0.0/16) - 在文件末尾新增 ipvs 配置:
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# 1.20 版本以后不需要 featureGates 中的 SupportIPVSProxyMode,否则会启动失败(见备注)
mode: ipvs
然后预拉取镜像(可选,但能加速初始化):
kubeadm config --config=kubeadm-config.yaml images list
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
初始化主节点:
kubeadm init --config=kubeadm-config.yaml --upload-certs --v=6 | tee kubeadm-init.log
--v 参数控制日志详细程度,遇到错误时设为 6 可看到更详细的信息。初始化成功后,会输出类似下图的内容:
按提示配置 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 node
此时节点应为 NotReady:
原因是网络插件未就绪。这里先检查一下所有 pod 的状态:
kubectl get pod -A
若发现 kube-proxy 不是 Running(比如 CrashLoopBackOff),需要排查网络配置。可以用如下命令查看详情:
kubectl describe pod {pod名称} -n {命名空间}
kubectl logs {pod名称} -n {命名空间}
根据原因修改后,删除重建 pod 即可:
kubectl delete pod {pod名称} -n {命名空间}
coredns 的 pending 可以先不管,等网络插件安装后会自动变成 Running。
安装 flannel
下载 flannel 的 yaml 文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
创建:
kubectl apply -f kube-flannel.yml
也可以先下载镜像再创建。等 flannel pod 起来后,master 节点状态会转为 Ready:
加入 Node 节点
在 node 节点上执行 master 初始化日志中给出的 join 命令,例如:
kubeadm join 192.168.1.60:6443 --v=6 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:8df9dcae2618fcf9430d833f1f96f
出现以下内容即加入成功:
在 master 上确认节点已加入:
kubectl get node
安装 kubernetes-dashboard
下载 yaml 文件(版本匹配参见 GitHub releases):
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml
修改 service 暴露端口(将 type 从 ClusterIP 改为 NodePort):
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
将 type 改为 NodePort:
查看暴露的端口:
kubectl get svc -A -o wide
可知 dashboard 地址为 https://192.168.1.60:31840/:
获取登录 token:
kubectl -n kubernetes-dashboard get secret | grep kubernetes-dashboard-token
kubectl describe secret kubernetes-dashboard-token-lwmnx -n kubernetes-dashboard
使用 token 登录:
附录
- kube-proxy ipvs failed complete: unrecognized feature gate: SupportIPVSProxyMode —— 1.20 之后不再需要该 feature gate,直接配置
mode: ipvs即可。 - flannel 的 yaml 文件样例、dashboard 的 yaml 文件样例可参考官方仓库。
- 卸载 K8s:
kubeadm reset
- 新增 node 加入集群:在新 node 上完成相同的基础配置(Docker、kubelet、kubeadm 等),然后从其他 node 导入镜像,在 master 上生成新的 join 命令:
kubeadm token create --print-join-command
新节点执行该命令即可加入。



















