192.168.197.200 | docker200 |
192.168.197.201 | docker201 |
192.168.197.202 | docker202 |
[root@docker200 ~]# systemctl stop firewall
[root@docker200 ~]# systemctl disable firewall
selinux是inux下的一个安全机制,主要是对文件系统访问做一个权限控制,这个权限控制会影响到kubernetes中的一个组件kuberlete的安装,因为这个组件的安装会访问本地的文件操作系统
临时关闭
[root@docker200 ~]# setenforce 0
永久关闭
修改 /etc/selinux/config 文件,更改为 SELINUX=disabled
swap分区的作用是当物理内存不足时,利用swap分区做数据交换,但是在kubernetes中完全不支持swap分区,所以必须禁止掉,或者创建系统的时候就不创建他
临时关闭
[root@docker200 ~]# swapoff -a
查看swap是否关闭了
[root@docker200 ~]# free
永久关闭
修改 /etc/fstab 配置文件,注释掉下图画圈部分
修改主机名
使用下方指令来修改主机名,修改好后重新登录就会显示设置好的主机名,这里我是已经修改过的了
[root@docker200 ~]# hostnamectl set-hostname docker200
修改host文件
执行下方指令,会往host文件添加相关配置
[root@docker200 ~]# cat >> /etc/hosts << EOF
> 192.168.197.200 docker200
> 192.168.197.201 docker201
> 192.168.197.202 docker202
> EOF
保证各个接点mac地址和uuid唯一
[root@docker200 ~]# cat /sys/class/net/ens33/address
[root@docker200 ~]# cat /sys/class/dmi/id/product_uuid
保证这个接点时间是相同的,这里使用的是chronyd,相关配置可以搜索其他文章,这里不多做介绍
有一些ipv4的流量不能走iptables链,lnux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,导致流量丢失
配置k8s.conf文件(k8s.conf文件原来不存在,需要自己创建的)
[root@docker200 ~]# cat > /etc/sysctl.d/k8s.conf << EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
使k8s.conf文件立即生效
[root@docker200 ~]# sysctl --system
我们是通过yum进行安装,添加阿里云的k8s的软件源后,下载的速度会快
配置 kubernetes.repo (kubernetes.repo原来不存在,需要我们创建的)
[root@docker200 ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
> [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
[] 中括号中的是repository id,唯一,用来标识不同仓库
name 仓库名称,自定义
baseurl 仓库地址
enable 是否启用该仓库,默认为1表示启用
gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
更新缓存
[root@docker200 ~]# yum clean all
[root@docker200 ~]# yum -y makecache
由于之前的文章已经介绍过如果安装,这里就不多做介绍
安装之前,要去查询下之前安装好的docker版本对应的k8s版本,我这里的docker版本是19.03,所以我使用k8s的版本是1.17.2
[root@docker200 ~]# yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm 用于初始化集群,启动集群的命令工具
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
安装的时候,有可能会出现xxx.rpm 由于公钥的原因无法安装,如下图,可以使用--nogpgcheck 命令格式跳过公钥检查
[root@docker200 ~]# yum install kubeadm-1.17.2-0.x86_64 --nogpgcheck
启动kubelet并设置开机启动
[root@docker200 ~]# systemctl enable kubelet && systemctl start kubelet
kubelet命令补全
[root@docker200 ~]# echo "source <(kubectl completion bash)" >> ~/.bash_profile
[root@docker200 ~]# source .bash_profile
11.1 初始化 mastere节点
kubeadm init \
--apiserver-advertise-address=192.168.197.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
apiserver-advertise-address指定master的interface,
image-repository 镜像地址 使用阿里云的镜像地址
kubernetes-version v1.17.2 k8s版本号
service-cidr 指定服务网络范围
pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案。
执行完上述命令后安装成功会出现以下下信息,为node节点加入到集群中使用的token
kubeadm join 192.168.197.200:6443 --token mel8ax.6usyyf9nngbzxcgj \
--discovery-token-ca-cert-hash sha256:b0d9149250cee0eade6e629af8985a2b9bbf96bdc160bed34941da3367597b4b
11.2 配置kubectl
配置完下方执行后,可以执行kubectl get node 得到节点信息
[root@docker200 ~]# mkdir -p $HOME/.kube
[root@docker200 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@docker200 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
11.3安装Pod网络插件(CNI)
我们这里使用flannel当作网络插件,由于在线安装不一定成功,网址有可能被墙,导致无法访问,我们可以先把flannel的镜像拉去下来,在执行相关配置
在线安装
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
手动安装
docker pull easzlab/flannel:v0.11.0-amd64 #拉取镜像
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #下载配置文件
kubectl apply -f kube-flannel.yml #执行安装
手动安装成功后,可以使用kubectl get pods -n kube-system进行检查是否安装成功
12.1 部署node环境
在docker201和docker202机器上,分别执行上述1~10.
12.2 node加入集群
在执行初始化master节点时,会有下方指令显示出现,在node节点上执行上述执行即可加入集群
kubeadm join 192.168.197.200:6443 --token mel8ax.6usyyf9nngbzxcgj \
--discovery-token-ca-cert-hash sha256:b0d9149250cee0eade6e629af8985a2b9bbf96bdc160bed34941da3367597b4b
看见下图,则是node集群加入成功
12.3 node加入集群异常
1.执行上述执行,没有看到Run "kubectl get nodes"的描述
a.先排查node机器与master机器时间是否一致,不一致则执行时间同步
b.在master机器上执行kubeadm token list 查看token是否过期
c.若是token过期或者忘记token了,可以执行下方执行,生成一个新的token,获取ca证书sha256编码hash值
kubeadm token create #生成新的token
#获取ca证书
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
2.节点加入集群后,在master上执行kubectl get node ,节点的状态是NotReady
a.在node节点机器上执行 journalctl -f -u kubelet 查看日志,如下图,是网络出了问题
b.在master节点上执行 kubectl get pods -n kube-system 发现是flannel镜像拉取卡主了
c.在master上删除节点后,在node机器上手动拉取flannel镜像
#master删除节点
kubectl delete node docker201
kubectl delete node 节点名称
#node重置
kubeadm reset
#node拉取镜像
docker pull easzlab/flannel:v0.11.0-amd64
#node加入集群
kubeadm join 192.168.197.200:6443 --token vyjfer.gmx0wouba7e0l1gu --discovery-token-ca-cert-hash sha256:b0d9149250cee0eade6e629af8985a2b9bbf96bdc160bed34941da3367597b4b