此前写的一些关于k8s基础知识和集群搭建的一些 方案 ,有需要的同学可以看一下。
机器均为8C8G的虚拟机,硬盘为100G。
同一个k8s集群内的所有节点需要确保 mac 地址和 product_uuid 均唯一,开始集群初始化之前需要检查相关信息
如果k8s集群的节点有多个网卡,确保每个节点能通过正确的网卡互联访问
这里可以根据自己的习惯选择ntp或者是chrony同步均可,同步的时间源服务器可以选择阿里云的 ntp1.aliyun.com 或者是国家时间中心的 ntp.ntsc.ac.cn 。
k8s集群之间通信和服务暴露需要使用较多端口,为了方便,直接禁用防火墙
这里主要是需要配置内核加载 br_netfilter 和 iptables 放行 ipv6 和 ipv4 的流量,确保集群内的容器能够正常通信。
虽然新版本的k8s已经支持双栈网络,但是本次的集群部署过程并不涉及IPv6网络的通信,因此关闭IPv6网络支持
IPVS是专门设计用来应对负载均衡场景的组件, kube-proxy 中的 IPVS 实现 通过减少对 iptables 的使用来增加可扩展性。在 iptables 输入链中不使用 PREROUTING,而是创建一个假的接口,叫做 kube-ipvs0,雀樱当k8s集群中的负载均衡配置变多的时候,IPVS能实现比iptables更高效的转发性能。
详细的官方文档可以参考 这里 ,由于在刚发布的1.24版本中移除了 docker-shim ,因此安装的 版本≥1.24 的时候需要注意 容器运行时 的选择。这里我们安装的版本低于1.24,因此我们继续使用docker。
docker的具体安装可以参考我之前写的 这篇文章 ,这里不做赘述。
CentOS7使用的是 systemd 来初始化系统并管理进程,初始化进程会生成并使用一个 root 控制组 ( cgroup ), 并充当 cgroup 管理器。 Systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup 。 我们也可以配置 容缓岁信器运行时 和 kubelet 使用 cgroupfs 。 连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器 。而当一个系统中同时存在cgroupfs和systemd两者时,容易变得不稳定,因此最好更改设置,令容器运行时和 kubelet 使用 systemd 作为 cgroup 驱动,以此使系统更为稳定。 对于 Docker, 需要设置 native.cgroupdriver=systemd 参数。
k8s官方有 详细的文档 介绍了如何设置kubelet的 cgroup driver ,需要特别注意的是,在1.22版本开始,如果没有手动设置kubelet的cgroup driver,那么默认会设置为systemd
一个比较简单的指定kubelet的 cgroup driver 的方法就是在 kubeadm-config.yaml 加入 cgroupDriver 字段
我们可以直接查看configmaps来查看初始化之后集群的kubeadm-config配置。
当然因为我们需要安装的版本高于1.22.0并且使用的就是systemd,因此可以不用再重复配置。
kube三件套就是 kubeadm 、 kubelet 和 kubectl ,三者的具体功能和作用如下:
需要注意的是:
CentOS7的安装比较简单,我们直接使用官方提供的 yum 源即可。需要注意的是这里需要设置 selinux 的状态,但是前面我们已经关闭了selinux,因此这里略过这步。
在集群中所有节点都执行完上面的三点 *** 作之后,我们就可以开始创建k8s集群了。因为我们这次不涉及高可用部署,因此初始化的时候直接在我们的目标master节点上面 *** 作即可。
此时我们再查看对应的配置文件中的镜像版本,就会发现已经变成了对应阿里云镜像源的版本
当我们看到下面这个输出结果的时候,我们的集群就算是初始化成功了。
刚初始化成功之后,我们还没办法马上查看k8s集群信息,需要配置kubeconfig相关参数才能正常使用kubectl连接apiserver读取集群信息。
配置完成后,我们再执行相关命令就可以查看集群的信息了。
这时候我们还需要继续添加剩下的两个节点作为worker节点运行负载,直接在剩下的节点上面运行集群初始化成功时输出的命令就可以成功加入集群:
如果不小心没保存初始化成功的输出信息也没有关系,我们可以使用kubectl工具查看或者生成token
添加完成之后我们再查看集群的节点可以发现这时候已经多了两个node,但是此时节点的状态还是 NotReady ,接下来就需要部署CNI了。
flannel 应该是众多开源的CNI插件中入门门槛最低的CNI之一了,部署简单,原理易懂,且相关的文档在网络上也非常丰富。
针对 kube-flannel.yml 文件,我们需要修改一些 参数 以适配我们的集群:
修改完成之后我们直接部署即可
集群部署完成之后我们在k8s集群中部署一个nginx测试一下是否能够正常工作。首先我们创建一个名为 nginx-quic 的命名空间( namespace ),然后在这个命名空间内创建一个名为 nginx-quic-deployment 的 deployment 用来部署pod,最后再创建一个 service 用来暴露服务,这里我们先使用 nodeport 的方式暴露端口方便测试。
部署完成后我们直接查看状态
最后我们进行测试,这个nginx-quic的镜像默认情况下会返回在nginx容器中获得的用户请求的IP和端口
kubernetes 1.16+ 这里一定注意版本。只可更高,不可小于该版本。安装好flannel网络插件。multus CNI安装的闹灶必须要求,除了SRIOV CNI之外,仍需装上其他的CNI。
开启iommu,bios开启vx-d之类
其余查看网卡的 *** 作参考链接1
这里需要创建好VF!!!
注意CNI需要放在所有可以运行SRIOV的work节点上。如果master节点也跑pod的话也需要执行下面的 *** 作
这里可能遇到境内环境无法make的情况。找台墙外主机编译好将sriov拷贝进来即可。注意安装go环境
ls /opt/cni/bin 可以看到sriov权限可执行
build镜像 与pull镜像 二选一。(每个节点上都要这么做)
If you want to build the docker image locally then follow the following steps:
On a successful build, a docker image with tag nfvpe/sriov-device-plugin:latest will be created. You will need to build this image on each node. Alternatively, you could use a local docker registry to host this image.
可以看到有image
可以看到有image
resourceName和resourcePrefix 遵循命名规范即可,同时记住这两个参数,后面要用到。
selectors里面的信息来自下图:
https://github.com/intel/multus-cni/blob/master/doc/quickstart.md
至此所有配置完成,我们可以简单检查下环境是否OK。
目的是为了检查work节点是否可以提供sriov能力
正常情况下,圈中数字应与该节点VF数量一致。若为0说明不可用。
不可用原因:上述的configMap.yaml配置有问题,或者该节点sriov有问题,没有创建VF。具体原因可通过下一章节的内容,进入该节点sriov device plugin 的pod 查看日志。
目的是为了查看sriov device plugin 是否工作正常。
查看work节点的sriov device plugin容器日志,检查下是否有下述类似正确闹弯漏以及健康的内容出现.
修改第6行,信息来自sriov-crd.yaml
修改16行,信息来自configMap.yaml
修改18行,信息来自configMap.yaml
可以看到pod内部网卡分配的IP为sriov-crd.yaml设置的网段。可以多建几个pod。可以互ping。
同时如果此时进入到work节点,通过ip a命令会发现work节点上少了vf,因为此时部分vf已经被转入对应容器的namespace之下,所以液烂在宿主节点上无法看到。
架构说明
Kubernetes集群组件:
k8s集群高可用,一般是etcd,kube-apiserver,kube-controller-manager,kube-scheduler服务组件的高可用。
规划:
3个master节点,2个worker节点,使用keepalived+haproxy做高可用
一、前期环境准备
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。
方法一 通过kubelet的启动参数–fail-swap-on=false更改这个限制。
方法二 关闭系统的Swap, swapoff -a
修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。
二、docker安装
安装则氏docker-ce,所有节点都要安装
yum-utils 提供yum-config-manager工具,devicemapper存储需要device-mapper-persistent-data和lvm2
添加yum源仓库
官方仓库
安装docker
配置docker中国镜像加速,修改cgroup driver为systemd,k8s建议使用systemd,配置后重启docker
三、安装haproxy,keepalived
安装haproxy和keepalived,实现kube-apiserver高可用
psmisc提供killall命令
配置haproxy
配置keepalived
注意:在另外两个节点,设置state为BACKUP,priority设扰盯败置为110,100
启动所有节点的haproxy和keepalived
查看VIP
注意,使用ifconfig命令是看不到的,必须使用ip addr命令
这时候vip在130.252.10.235上,我们关闭235上的haproxy,验证vip是否会漂移到其他节点
四、kubeadm/kubelet/kubectl安装
master节点安装:kubeadm、kubelet、kubectl
node节点安装:kubeadm、kubelet
安装
五、使用kubeadm初始化cluster
step1 准备初始化配置文件
根据自己的环境修改配置.
step2 处理kubernetes依赖的镜像
master需要的镜像为
node节点需要的镜像为
查看需要的镜像版本
拉取镜像
六、初始化第一个master节点
注意:如果你禁用了swap分区,则不需要加--ignore-preflight-errors=Swap
配置kubectl
启用kubectl的自动补全命令
七、安装Pod网络flannel
八、将其他master节点添加到cluster
将node1证书文件复制到其他master节点node2,node3
分别在master1和master2 执行下面的命令
九、将node节点添加到cluster
十、检查集群运行 健康
在master节点查看节点状态
所有的节点都是NotReady,这是因为每个节点都需要启动若干组件,这些组件都是在pod中运行,需要从Google下载镜像
查看pod的状态
查看集群信息
查看etcd集群
查看集群缓颤是否 健康
查看集群的leader
注意 :因为是3个节点的ETCD集群,所以只能有一个宕机,如果同时又2个节点宕机,则会出现问题Unable to connect to the server: EOF
etd集群需要大多数节点(仲裁)才能就集群状态的更新达成一致,所以ETCD集群节点一般是奇数个,而且只有存活节点个数大于下线节 点个数才能正常运行,5个节点的ETCD集群,允许同时2个节点故障。
一般建议5个节点,超过五个虽然容错性更高,但是集群写入性就会差。
检查IPVS
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)