k8s有3种安装方式,如下所示:
我因为是自己学习使用,所以采用裸机安装。全程自己操作,我是通过在本机安装虚拟机,安装了3台虚拟机,我的环境是mac笔记本。如果想要参考mac笔记本安装虚拟机,可以看这篇文章:https://www.cnblogs.com/ITPower/p/15906012.html
操作系统:macOS 笔记本
虚拟机: Parallels
网络环境搭建:参考文章- https://www.cnblogs.com/ITPower/p/15906012.html
sudo hostnamectl set-hostname mastersudo hostnamectl set-hostname node1sudo hostnamectl set-hostname node2这条命令会删除/etc/hostname文件中的主机名,然后替换为新的主机名。系统会更新/etc/hosts文件.
然后输入名称查询是否已经变更了主机名
hostname获取服务器的ip,并在宿主机访问. 我的三台虚拟机的ip是
10.211.55.20010.211.55.20110.211.55.202将ip和主机名的映射关系添加到3台服务器中,执行命令
sudo vim /etc/hosts然后将下列代码拷贝进去
10.211.55.200 master10.211.55.201 node110.211.55.202 node2全部都配置好了以后,在三台服务ping一下,看看是否能访问通
ping masterping node1ping node2能ping通就说明配置没问题。
关闭所有节点的SELINUX, Redhat使用了SELinux来增强安全
setenforce 0 sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux上面两个命令的含义:第一个是临时关闭防火墙,不需要重启服务;第二个是永久关闭防火墙,需要重启。
验证防火墙是否关闭成功
getenforce 或者 sestatusSELINUX相关命令科普
sestatus # 查询SELINUX的状态
关闭selinux的方法有两种:临时关闭和永久关闭。
临时关闭防火墙
临时关闭在重启后会失效。
临时关闭命令:
setenforce 0查看是否关闭成功:
getenforce临时关闭报错 setenforce: setenforce() failed ,问题是权限不够,我们需要管理员权限才可以。要先获取root权限
su - root setenforce 0永久关闭防火墙
编辑配置文件 /etc/selinux/config 。需要重启才可以生效
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config我们常用的方法是,先配置临时生效,再更改配置文件。这样就算服务器重启了,selinux也还是关闭的。
systemctl stop firewalldsystemctl disable firewalld验证防火墙的状态
systemctl status firewalld关闭swapoff
swapoff -ased -i 's/.*swap.*/#&/' /etc/fstab添加k8s安装源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF添加docker安装源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y kubelet kubeadm kubectl docker-ce三台服务器都安装。
systemctl enable kubeletsystemctl start kubelet systemctl enable dockersystemctl start docker Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:
1.监视分配给该Node节点的pods
2.挂载pod所需要的volumes
3.下载pod的secret
4.通过docker/rkt来运行pod中的容器
5.周期的执行pod中为容器定义的liveness探针
6.上报pod的状态给系统的其他组件
7.上报Node的状态
一定要检查kubelet的状态是否正常
systemctl daemon-reloadsystemctl status kubelet
这是启动成功的状态。
我在启动kubelet这里遇到的麻烦,总是提示启动失败。各种排查都没有找到原因。最后卸载重新安装了,记录一下卸载流程
第一步:我使用的yum install安装的,所以卸载使用 yum remove
yum -y remove kubelet //-y表示又询问都是yes第二步:查看kubelet包在linux中是否存在
yum list kubelet我们看到包还在,原因是软件卸载了,并没有删除软件包
第三步:检查删除的状态
systemctl status kubelet状态提示:
Warning: kubelet.service changed on disk. Run 'systemctl daemon-reload' to reload units.第四步:验证删除成功
执行systemctl daemon-reload
systemctl daemon-reload执行完以后在查询状态
systemctl status kubeletUnit kubelet.service could not be found.
第五步:重新安装
yum -y install kubelet第六步:启动kubelet,并开机启动
systemctl enable kubeletsystemctl start kubelet
kuberneters官方推荐docker等使用systemd作为cgroupdriver,否则kubelet启动不了
为什么要修改docker的cgroup driver? https://www.cnblogs.com/architectforest/p/12988488.html
cat <<EOF > /etc/docker/daemon.json{ "registry-mirrors": ["https://registry.docker-cn.com"], "exec-opts": ["native.cgroupdriver=systemd"]}EOF重启docker
// 守护进程重启systemctl daemon-reloadsystemctl restart docker验证docker的Cgroup是否是systemd
docker info |grep Cgroup应该返回如下内容
[root@node1~]# docker info |grep CgroupCgroup Driver: systemd#docker驱动程序为 systemd注意:这个命令仅在master节点执行
1)初始化集群控制台, 失败了可以用kubeadm reset重置
注意:只在主节点运行kubeadm init --kubernetes-version=1.23.4 \--apiserver-advertise-address=10.211.55.200 \--image-repository registry.aliyuncs.com/google_containers \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16 执行了这个命令以后,会帮我们创建集群的控制台
--image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过--image-repository指定阿里云镜像仓库地址
--kubernetes-version:版本信息 kubectl version 查询
定义POD的网段为: 10.244.0.0/16
apiserver地址就是master本机IP地址
--service-cidr=10.96.0.0/12 : 这个参数后的IP地址直接就套用10.96.0.0/12 ,以后安装时也套用即可,不要更改
--pod-network-cidr=10.244.0.0/16 : k8s内部的pod节点之间网络可以使用的IP段,不能和service-cidr写一样,如果不知道怎么配,就先用这个10.244.0.0/16
初始化失败的可以重置,使用命令
kubeadm reset重置以后会有这样一段提示
The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.
意思是kubeadm reset 执行后不会删除$HOME/.kube文件,需要手动执行rm -rf $HOME/.kube
然后重新初始化。
初始化的过程中异常记录
异常1:

It seems like the kubelet isn't running or healthy.
首先可以用命令检查kubelet的状态
systemctl status kubelet状态返回异常

然后看日志,看看日志包的什么错?
journalctl -xefu kubelet
日志说的很清楚,没有找到/var/lib/kubelet/config.yaml文件
这个问题最后我卸载了kubelet,然后重新装了一遍就好了。
最后,看到下面的内容,就表示安装成功了

复制出来最后两行, 并进行保存
kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft \ --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213如果当时忘了复制,也没有关系, 使用命令重新获取
重新获取token的命令:
kubeadm token create --print-join-command注意:这个授权文件要去在root权限下执行
复制授权文件,以便kubectl有权限访问集群su - rootmkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config将初始化主节点时生产的代码在node节点执行一下即可。
注意:要删掉第一个行后面的“\”
kubeadm join 10.211.55.200:6443 --token c8ysgy.uvo10ecrlqktmvft --discovery-token-ca-cert-hash sha256:1ef77481c6c0efc18455e611d84567c3bb236da39cf98c2d0393c5454c4ba213在两个node节点都执行一遍
异常问题记录
异常1:
/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1这时我们手动设置这个为1
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables当多次调整都不成功的时候,可以重新获取一下token
kubeadm token create --print-join-command看到如下结果就成功了:

接下来可以使用kubectl来查看子节点
kubectl get node
我们看到有一个master节点,两个node节点。他们的状态都是NotReady ;master节点是一个控制平台,并且是主节点。
为什么上面节点都是NotReady呢?因为我们还需要安装一个网络插件,他们才能工作。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 安装成功的图如下:

然后再查看节点状态
kubectl get node
现在就都是ready状态了。
