文本继承上一篇虚拟机的内容,环境准备
如有需要本位完全可以作为k8s的独立搭建过程,不涉及istio的任何问题。
由于k8s 的全称为kubernetes,因此,我可能会将k8s成为kube、kuber等。
vim
由于配置过程中需要编辑大量文件,而我本人相比于vi
我更喜欢vim
,因此,本问后续文章都将以vim作为编辑器,推荐大家安装一下。
$ yum install vim -y
$为指令标志,无需复制
htop
(非必须)由于后面可能观察性能方面的数据,使用top来展示数据不是很明显,因此考虑使用htpo,执行下列指令
$ yum install epel-release -y
#启用htop的安装源
$ yum install htop -y
#安装htop
# 为注释行,忽略,$符号为指令标志,无需复制
ntpdate
由于各个节点之间的时间必须一致,因此需要同步时间,但是由于手动配置存在误差因此,使用ntpdate进行同步
进行安装
$ yum install ntpdate -y
执行后开始同步时间
$ tzselect
然后按照图片进行选择即可
最后 更新时区文件,然后利用ntp同步时间(我选择的ntp服务器是上海的)
$ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
$ ntpdate ntp.api.bz
ifconfig
由于后面需要确定集群ip/mac等信息,指令:ip addr
显示的信息不是很全面,因此考虑使用ifconfig
直接安装ifconfig会失败
$ yum search all ifconfig
# 查找ifconfig的包
$ yum install -y net-tools.x86_64
# 安装
ifconfig
$ ifconfig
# 如果显示command not find 则使用 /sbin/ifconfig
# 编辑profile文件
$ vim /etc/profile
# 如果没有vim,使用vi也可以
在文件最下面添加如上两行
PATH=$PATH:/sbin/ifconfig
export PATH
退出保存即可
以上操作在三个节点都要执行
有的博客说,如果启用linux的swap后,会造成服务的不稳定,对于虚拟机而言,关了其实也无所谓,所以决定关闭一些可能会造成影响的东西(不能用于生产环境)
$ systemctl stop firewalld & systemctl disable firewalld
编辑/etc/fstab
文件,注释到带有swap的那一行(需要注释的行的行最前面加上#号即可)
$ yum install docker
# 安装docker
$ systemctl start docker
# 启动服务(非永久)
由于Docker的源不在国内,很容易出现超时,所以切换源到DaoCloud的加速器即可
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 出现 success字样即成功,然后重启服务
$ systemctl restart docker
# 这里概率会出现错误,我的错误原因是执行脚本修改后的/etc/docker/daemon.json
# 最后面多了个逗号,删掉就行
# 然后重新运行即可
由于文件在过外,因此使用阿里云镜像仓
输入/复制下面指令即可
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
然后关闭:SeLinux
$ setenforce 0
# 执行以下就行
然后开始安装
$ yum install -y kubelet kubeadm kubectl
启动Kubelet服务
$ systemctl enable kubelet && systemctl start kubelet
如果操作正常是不会出现问题的(仅限我的版本-2019-11-13),后续版本不会保证,有博客说会出现证数的认证问题,跳过即可。
kubelet\kubelet\kubeadm 需要在三台主机都安装!
命令:
hostnamectl set-hostname node1/2/3
三个主机名不能相同
然后配置路由表
编辑/etc/hosts
添加三个节点和路径
格式如下
首先确定kubectl的版本,最好要搭建的集群版本相同
kubectl的版本获取:
$ kubectl version
表明我的版本应该为1.16.2,那么下一步初始化集群的时候,就应该使用改版本号
#以下命令请一条一条执行,本条执行彻底完成后,再支持下一条!
#启动docker.service服务(与之前不同,请务必执行)
$ systemctl enable docker.service
# 开始初始化
$ kubeadm init --pod-network-cidr=172.16.0.0/16 --kubernetes-version=v1.16.2 --apiserver-advertise-address=192.168.126.128 --image-repository registry.aliyuncs.com/google_containers
# 参数说明
# =======================================================
# --pod-network-cidr=172.160.0.0/16
# 该参数标识pod网段,同时指定网络模式为calico,后面还会有具体操作
# 该参数不能和虚拟机地址重复,否则网卡冲突,将会导致xshell无法连接
# 确定方式:我只有三台主机分别是192.168.126.128/129/130,都在
# 192.168.126 内,因此我选用192.168.126.0/24,子网掩码
# 就是24:255.255.255.0,如果你确定不了,选取三个主机都
# 重复的ip范围:我的就是192.168.126.0,然后除了0的数字有
# 几个就写几个*8,那这里就是 3*2=24,如果是 192.168.0.0
# 那就是2*8=16,因此数据为:192.168.0.0/16,涉及到网络
# 知识,24为子网掩码的一种标识方法,具体请学习网络相关的知识
#========================================================
#--kubernetes-version=v1.16.2
#该参数指定kube版本号,与之前的kubectl一样就行
#========================================================
#--apiserver-advertise-address=192.168.126.128
#本机地址即可,应该要修改成你自己的
#========================================================
#--image-repository registry.aliyuncs.com/google_containers
# 由于数据不在国内,因此使用阿里镜像即可下载
# 如果初始化失败 使用 kubeadm reset 恢复
# 修复后再次执行 kubeadm init .....
[ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
与第三条类似,路由转发问题
执行:
$ echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
[ERROR Swap]: running with swap on is not supported. Please disable swap
没有关闭交换区
执行:
$ swapoff -a
[ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
Linux ip4路由转发问题
详细说明 跳转连接
执行:
$ echo "1" > /proc/sys/net/ipv4/ip_forward
[WARNING Hostname]: hostname “node1” could not be reached
配置一下host,具体如何配置请百度
[WARNING Hostname]: hostname “node1”: lookup node1 on 192.168.126.2:53: no such host
网段问题,跳过即可
然后执行一下
$ kubectl version
发现server version已经正常了,那么就算安装成功了
然后,主节点还需要配置一下网络,由于之前的参数,所以我选择Calico网络模式
$ kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
最后,执行
$ kubectl get pod -n kube-system
过了大约3分钟左右,如果所有pod全部为running,则运行成功,否则在等等,如果还有pending的,恢复镜像,重新操作,其他稍微翻译一下应该能看懂。
至此主节点配置完成
主节点中执行:
$ kubeadm token create
获取的token
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 这个我是百度的,怎么来的我还在找,找到后我会更新
# 更新,该值来自官网,官网给出的指令。在之前存在一种方式能够直接一键创建token
# 和该值,后来因为某些原因取消了。
获取ca sha256的值
字节中执行
$ kubeadm join 主机ip:6443 --token 之前获取的token ----discovery-token-ca-cert-hash sha256:之前获取的sha256的值
# 同主节点初始化问题,如果出现问题依照上面的部分解决办法即可修改,然后如果出现错误请执行:kubeadm reset
回到主节点中执行
kubectl get node
如果出现新的节点则正确,由于我之前忘记改名字,因此NAME为localhost.localdomain,状态为NotReady,过一会再次检测,就是ready了
至此,kube集群配置完成
我踩了一天的坑,重置镜像好多次,看了好多的文档,有官方的、非官方的,所以如果有需要,转载复制请声明出处,无需请求,蟹蟹。