目录
环境
- OS: CentOS7
- 内核版本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更新
- 通过如下命令或修改/etc/hostname 文件依次修改k8s机器的各主机名
hostname set-hostname centos-k8s-master-60
- 修改hosts文件,添加主机名解析记录(修改/etc/hosts文件,添加本次需要操作的三条主机名和对应ip解析),效果如下:
重启后生效,可继续操作一块儿重启
关闭swap分区
使用如下命令检查是否开启了swap分区
free -m
显示如下则可跳过本步骤
当上图中的swap分区total不为0时则需要进行如下操作进行关闭(安全起见,也可以按需进行如下检查)
- 禁用swap交换区
swapoff -a
- 永久关闭,修改文件 /etc/fstab,删除swap分区记录
如下图标记黄色的部分
修改后的文件如下:
重启后生效,可继续操作一块儿重启
关闭selinux
- 执行如下命令修改为permissive模式
#当提示SELinux is disabled即已经关闭
setenforce 0
- 修改/etc/selinux/config文件,关闭selinux
即修改SELINUX=disabled 修改结果如下:
重启后生效,可继续操作一块儿重启
关闭firewalld
执行如下命令,依次关闭及取消开机自启
systemctl stop firewalld
systemctl disable firewalld
调整时区及自动对时
略
开启iptables
- 安装
yum install -y iptables iptables-services
- 启用并设置iptabls
systemctl start iptables
systemctl enable iptables
#清除所有规则
iptables -F
#保存规则
service iptables save
启用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,实则最后启动服务时会报错!该模块也无法加载
modprobe -- nf_conntrack
- 生效模块加载内容
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
#lsmod 查看加载模块情况
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写入镜像地址及cgroup默认配置,如下内容
{
"registry-mirrors": ["https://jo9w2k2o.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启docker
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.24之后不再对docker支持,配置方法另有不同,这里指定版本1.23.5
#如果已经安装了高版本可通过`yum remove kubelet`进行移除
yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5
初始化主节点
#导出初始化配置到文件
kubeadm config print init-defaults>kubeadm-config.yaml
- 修改安装文件
- 修改本地api地址 localAPIEndpoint.advertiseAddress 当前主机点的ip
- 修改镜像仓库地址 imageRepository
- 修改要安装的版本 kubernetesVersion
- 设置pod网段: networking.podSubnet 注意提前规划好网络,避免冲突
- 设置ipvs,在最后新增如下内容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
#有些教程里要求添加如下两行内容,实际在1.20以后的版本会因为这个问题无法启动,参见备注1
#featureGates:
# SupportIPVSProxyMode: true
mode: ipvs
文件修改点标记如下:
2. 下载所需镜像
这一步也可以不执行,但是初始化的过程中会灰常的慢
PS:默认镜像拉取策略是(IfNotPresent)本地有就不再远程下载,这一步也可以作为配置修改结果的检查
#根据配置文件列举出镜像清单(上一步创建的kubeadm-config.yaml )
kubeadm config --config=kubeadm-config.yaml images list
根据列出的清单,使用docker pull进行镜像下载
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: 代表日志级别,数越大打印的约详细
这个过程中可能出现各种错误,注意调整–v参数以尽可能的详细列举出错误原因,根据原因逐个解决,一般准备工作做的充分的话这一步也基本就很快二就过了。
4. 初始化
根据如上日志文件内容的提示完成响应的操作
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状态
原因是网络插件未就绪,需要配合flannel或者calico使用,这里并不建议直接进行下一步,反而建议检查下现在的pod状态
6. 验证pod状态
kubectl get pod -A
查看当前pod的状态,如有非Running状态应注意区分(coredns的状态可以先不关注),特别是kube-proxy(一般网络配置错误状态为CrashLoopBackOff)
#根据kubectl get pod -A 的查询结果进行如下操作
#查看pod状态(这里可能有错误原因)
kubectl describe pod {pod名称} -n {命令空间}
#查看pod的log
kubectl logs {pod名称} -n {命令空间}
根据原因修改对应内容,然后重新删除pod等待重建即可
#删除pod
kubectl delete pod {pod名称} -n {命令空间}
安装flannel
- 下载flannel的yaml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 创建
kubectl apply -f kube-flannel.yml
也可以先将其中的镜像文件下载然后再进行创建
3. 查看 flannel
当flannel完成创建后coredns的状态也将转Running,此时master的状态也应该由NotReady转入Ready
加入Node节点
- 使用初始化主节点时最后的日志中的命令将node节点加入
kubeadm join 192.168.1.60:6443 --v=6 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8df9dcae2618fcf9430d833f1f96f
出现如下内容即为加入成功
2. 查看node状态
kubectl get node
安装kubernetes-dashboard
- 下载yaml文件
详细版本匹配情况参见: https://github.com/kubernetes/dashboard/releases
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
- 创建
kubectl apply -f recommended.yaml
- 修改svc 暴露端口(亦可以通过修改上一步的yaml通过重建的方式实现)
增加修改如下内容:
#通过命令行修改
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
#执行将service的type从ClusterIP修改为NodePort
4. 通过svc信息查看dashboar端口
kubectl get svc -A -o wide
如上知道dashboard 地址为: https://192.168.1.60:31840/
- 查看token
#查找(当不确定kubernetes-dashboard在哪个命名空间下时可通过上一步的yaml文件内容查看或者使用-A参数在全部namespace下查找)
kubectl -n kubernetes-dashboard get secret |grep kubernetes-dashboard-token
#查看secret
kubectl describe secret kubernetes-dashboard-token-lwmnx -n kubernetes-dashboard
6. 通过token登录
附录
- kube-proxy ipvs failed complete: unrecognized feature gate: SupportIPVSProxyMode
初始化时去掉featureGates.SupportIPVSProxyMode: true 参数
#执行如下命令,并根据提示进行进一步的重置(如果需要)
kubeadm reset
5. 新增node加入集群
- 按照如上步骤初始化及安装kubeadm、kubelet等内容
- 从其他node节点导入镜像
- kubeadm token create --print-join-command 生成加入命令
- 新节点执行加入命令