上一次接触到kubernetes集群的时候已经是一年以前了,那个时候官方的版本还只是v1.10,而现在过去一年的时间了,官方版本已经快速的迭代到了v1.17了,社区也越来越成熟、相关的生态组件也越来越丰富,可见在过去的k8s元年,它发展是多么迅猛。最近想把自己写的一些小东西封装成开放api暴露出来,于是想把自己的几台机器搞成个kubernetes集群,所以这里想重温下集群构建的流程。以下的所有文件都可以在githubhttps://github.com/lateautumn4lin/kubernetesresearch的clusterecology目录中寻找到
kubernetes集群搭建实战
首先要做的是搭建一个最基本的kubernetes集群。
准备阶段
准备阶段主要包括两个方面,一是准备好至少两台机器,做master-worker的集群架构,二是了解我们需要安装好哪些软件才能构建最基本的集群。
机器配置这次实验我选用的是腾讯云的云服务器cvm,由于我是通过不同的账号购买的,所以我选用的机器之间是通过外网来进行互通,配置方面的话选择官方默认的最低配置2核4gb。
服务器ipcpu内存硬盘系统版本hostname
192.144.152.23 2核 4gb 50gb cent os 7.6 master1
49.233.81.20 2核 4gb 50gb cent os 7.6 worker1
软件配置需要安装的软件版本
kubernetes v1.17.x
docker 18.09.7
基本的软件我们需要安装kubernetes与docker,安装kubernetes我们需要使用到其中的kubeadm与kubectl工具,kubeadm是官方推荐的初始化工具,并且在v1.13版本中已经正式ga(general availability)了,也就是说可以在生产环境中使用。而需要docker是因为kubernetes中的pod需要使用到cri(container runtime),也就是容器运行时,docker是非常标准且通用的cri,其他的例如containerd、cri-o并且在v1.14版本之后如果你的机器中有多种cri,那么kubernetes也会默认使用docker的,所以我们这里就选择docker。
检查与配置阶段
这个阶段我们主要是检查我们的服务器配置以及把我们几个服务器给串联起来。
修改hostname,配置host文件使用hostnamectl分别对worker1和master1进行hostname的永久性修改,并且配置host,之所以这么做是因为我们要统一给各个机器标记,这样我们在之后的集群管理中能够更好的通过hostname了解每台机器的作用。
hostnamectl set-hostname master1echo 127.0.0.1 $(hostname) > > /etc/hostsecho 192.144.152.23 master1 > > /etc/hostsecho 49.233.81.20 worker1 > > /etc/hosts检查cpu核数与内存这一步我们使用lscpu命令来查看我们的服务器的架构以及我们系统的内核数,因为我们要搭建一个kubernetes集群,master节点不能低于2核,这点是必须要保证的,如果内核数过低会导致整个集群的不稳定和高延迟。
lscpu# 请使用 lscpu 命令,核对 cpu 信息# architecture: x86_64 本安装文档不支持 arm 架构# cpu(s): 2 cpu 内核数量不能低于 2检查网络在所有节点执行命令
[root@master1 ~]# ip route showdefault via 172.21.0.1 dev eth0169.254.0.0/16 dev eth0 scope link metric 1002172.21.0.0/20 dev eth0 proto kernel scope link src 172.21.0.11[root@master1 ~]# ip address1: lo: mtu 65536 qdisc noqueue state unknown group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: eth0: mtu 1500 qdisc mq state up group default qlen 1000 link/ether 52:54:00:2c:42:7d brd ff:ff:ff:ff:ff:ff inet 172.21.0.11/20 brd 172.21.15.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe2c:427d/64 scope link valid_lft forever preferred_lft forever3.1 kubelet使用的ip地址
ip route show 命令中,可以知道机器的默认网卡,通常是 eth0,如 default via 172.21.0.1 dev eth0ip address 命令中,可显示默认网卡的 ip 地址,kubernetes 将使用此 ip 地址与集群内的其他节点通信,如 172.21.0.11所有节点上 kubernetes 所使用的 ip 地址必须可以互通(无需 nat 映射、无安全组或防火墙隔离)如果两台机器是在共同的内网中可以使用内网ip进行直接通信,不过我们这次的机器是在两个不同的腾讯云账号之中,彼此内网隔离,所以我们直接使用机器的外网ip进行通信,不建议大家在生产环境中使用。
配置机器之间的免登录这一步我们要通过配置各机器之间的免登录打通各个机器,把各个机器串联起来,这样方便于我们之后在各台机器之间的操作。
4.1 每台服务器生成公私钥
ssh-keygen –t rsa4.2 将id_rsa.pub追加到授权的key里面去
cat id_rsa.pub > > authorized_keys4.3 修改.ssh文件夹和其文件的权限,并重启ssh服务
chmod 700 ~/.sshchmod 600 ~/.ssh/*service sshd restart4.4 将.ssh文件夹中三个文件拷贝到目标服务器
scp ~/.ssh/authorized_keys root@192.144.152.23:~/.ssh/scp ~/.ssh/id* root@192.144.152.23:~/.ssh/上面是两台机器之间如何进行免登录配置,同理可以用于其他某两台机器。
正式安装阶段
准备好上面的机器并且检查、配置好各个参数之后我们就可以开始正式安装了。
安装kubelet以及docker切换到clusterecology目录中,可以看到install_kubelet.sh脚本,使用如下命令快速安装。
cat install_kubelet.sh | sh -s 1.17.2我们快速看看这个脚本中的代码,了解具体每一步的作用
#!/bin/bash# 在 master 节点和 worker 节点都要执行# 安装 docker# 参考文档如下# https://docs.docker.com/install/linux/docker-ce/centos/# https://docs.docker.com/install/linux/linux-postinstall/# 卸载旧版本yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine# 设置 yum repositoryyum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装并启动 dockeryum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.iosystemctl enable dockersystemctl start docker# 安装 nfs-utils# 必须先安装 nfs-utils 才能挂载 nfs 网络存储yum install -y nfs-utilsyum install -y wget# 关闭 防火墙systemctl stop firewalldsystemctl disable firewalld# 关闭 selinuxsetenforce 0sed -i s/selinux=enforcing/selinux=disabled/g /etc/selinux/config# 关闭 swapswapoff -ayes | cp /etc/fstab /etc/fstab_bakcat /etc/fstab_bak |grep -v swap > /etc/fstab# 修改 /etc/sysctl.conf# 如果有配置,则修改sed -i s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g /etc/sysctl.confsed -i s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g /etc/sysctl.confsed -i s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g /etc/sysctl.conf# 可能没有,追加echo net.ipv4.ip_forward = 1 > > /etc/sysctl.confecho net.bridge.bridge-nf-call-ip6tables = 1 > > /etc/sysctl.confecho net.bridge.bridge-nf-call-iptables = 1 > > /etc/sysctl.conf# 执行命令以应用sysctl -p# 配置k8s的yum源cat > /etc/hostscat init_master.sh | sh -s 1.17.2检查 master 初始化结果上一步安装好之后我们要检验kubernetes集群的成果,按下面的命令进行执行。
# 只在 master 节点执行# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 running 状态watch kubectl get pod -n kube-system -o wide# 查看 master 节点初始化结果kubectl get nodes -o wide如果成功的话可以看到以下输出
[root@master1 dashboard]# kubectl get nodes -o widename status roles age version internal-ip external-ip os-image kernel-version container-runtimemaster1 ready master 7h26m v1.17.2 172.21.0.11 centos linux 7 (core) 3.10.0-862.el7.x86_64 docker://18.9.7表示我们的集群中master节点已经正式可用
获得 join命令参数下面我们要将我们的其余worker节点加入集群,worker加入集群需要得到整个集群的token和ca证书,我们首先需要在master节点上面去获取,包括加入的token和ca证书。
kubeadm token create --print-join-command# 我们会得到如下输出,这是我们加入集群的凭证kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303初始化 worker节点针对所有的 worker 节点执行
# 只在 master 节点执行# 替换 x.x.x.x 为 master 节点实际 ip(生产请使用内网 ip)# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令export master_ip=192.144.152.23# 替换 apiserver.demo 为 您想要的 dnsnameexport apiserver_name=apiserver.demoecho ${master_ip} ${apiserver_name} > > /etc/hosts# 替换为 master 节点上 kubeadm token create 命令的输出kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303加入之后我们再使用下面的命令来查看worker是否正确加入集群
kubectl get nodes查看集群整体的状况查看集群整体状况只能在master节点执行如下命令
kubectl get nodes -o wide可以看到如下的输出,集群都ready就表示节点可用
[root@master1 ~]# kubectl get nodesname status roles age versionmaster1 ready master 5m3s v1.17.2worker1 ready 2m26s v1.17.2生态组件构建
安装好kubernetes集群之后,我们得到的只是一个最基本的集群,还有很多问题我们没有解决,比如说我们想要通过可视化的方式通过页面点击的方式来操作整个集群,或者说我们想要一个类似于python中的pip那样的包管理工具那样利用类似工具来管理我们部署在kubernetes集群的应用,再或者我们想要让我们的集群和外网能够进行很方便的通信等等,所以这就需要我们利用其它的组件来不断完善我们的kubernetes生态。
我们选用的是如下的软件
需要安装的软件版本
kubernetes dashboard v2.0.3
helm v3.0.3
traefik xxx
metrics-server xxx
dashboard插件安装dashboard是因为它是一个综合性的管理平台,也是属于kubernetes 的官方项目,具体可以在这个仓库去看https://github.com/kubernetes/dashboard,虽然之前dashboard因为操作不人性化,界面丑而广泛被人诟病,但是经过kubernetes dashboard团队半年多闭关研发,dashboardv2.0版本新鲜出炉,界面和操作性也有很大提升,也是官方推荐的管理界面之一。
1.1 dashboard插件安装
具体的部署方案我根据官方的方案整理成了几个yaml文件,项目都在目录clusterecology/initdashboard下面
kubectl apply -f k8s-dashboard-rbac.yamlkubectl apply -f k8s-dashboard-configmap-secret.yamlkubectl apply -f k8s-dashboard-deploy.yamlkubectl apply -f k8s-dashboard-metrics.yamlkubectl apply -f k8s-dashboard-token.yaml执行好上面的命令之后dashboard的服务以及用户基本已经创建好,下面我们需要获取用户token来登录我们的dashboard
1.2 获取用户token
kubectl describe secret/$(kubectl get secret -n kube-system |grep admin|awk '{print $1}') -n kube-system1.3 检查服务是否可用
在之前的yaml文件中设置了nodeport端口为31001和类型为nodeport方式访问 dashboard,所以访问地址:https://192.144.152.23:31001/ 进入 kubernetes dashboard页面,然后输入上一步中创建的serviceaccount的token进入 dashboard,可以看到新的dashboard。
输入token我们可以看到dashboard的界面,如下所示是正常的dashboard界面
helm组件helm组件的产生也是源于一个关键痛点,就是我们虽然已经部署好kubernetes集群环境,但是每个微服务也得维护一套yaml文件,而且每个环境下的配置文件也不太一样,所以想要重新部署新的环境或者做环境移植的成本是真的很高。如果我们能使用类似于yum那样的工具来安装我们的应用的话岂不是会方便很多?基于这点,helm就诞生了,从此让kubernetes集群拥有一个正式的应用市场。
旧版本helm整体分为两个部分,包括helm client和tiller server,helm client主要是用户命令行工具,负责管理用户自定义的包文件,而tiller server服务接受client的请求并且解析请求之后与kubernetes集群进行交互。
而新版本,也就是helm3之后,helm移除了tiller组件,使用helm命令会直接使用了kubeconfig来与kubernetes集群通信,这样就可以做更细粒度的权限控制,这样方便了完成和使用,另一个好处是release name范围缩小至namespace,这样就能够保证不同的namespace可以使用相同的release name。
2.1 helm client组件安装
我们首先要去官网https://github.com/kubernetes/helm/releases去下载helm的压缩包。
解压后将可执行文件helm拷贝到/usr/local/bin目录下即可,这样helm客户端就在这台机器上安装完成了。
cp helm /usr/local/bin/2.2 helm使用
初始化helm
helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/helm repo add seldon https://storage.googleapis.com/seldon-chartshelm repo update安装一个最简单的服务
helm install seldon-core seldon/seldon-core-operator可以看到helm已经和kubernetes集群交互从而生成一个seldon-core的服务了
[root@master1 linux-amd64]# helm install seldon-core seldon/seldon-core-operatorname: seldon-corelast deployed: tue feb 4 22:43:58 2020namespace: defaultstatus: deployedrevision: 1test suite: none[root@master1 linux-amd64]# helm listname namespace revision updated status chart app versionseldon-core default 1 2020-02-04 22:43:58.232906547 +0800 cst deployed seldon-core-operator-1.0.1traefik组件3.1 traefik组件安装
traefik是另一个kubernetes集群中必备的组件,可以把它认为是nginx的替代品,做一个统一网关的管理工具,它的优点也是有几个方面,比如有漂亮的dashboard 界面、可基于容器标签进行配置、新添服务简单,不用像 nginx 一样复杂配置,并且不用频繁重启等等,虽然性能方面和nginx会有些许差距,但是作为个人使用的话,还是很让人爱不释手的。
metrics-server插件metrics-server是kubernetes 官方的集群资源利用率信息收集器,是heapster瘦身后的替代品。metrics-server收集的是集群内由各个节点上kubelet暴露出来的利用率信息,算是集群中基础的监控信息了,主要是提供给例如调度逻辑等核心系统使用。
git clone https://github.com/kubernetes-incubator/metrics-server.gitcd metrics-server/kubectl create -f deploy/1.8+/安装成功后,过一段时间我们就可以在dashboard中看到具体的监控信息了
疑难故障分析
有关于kubernetes集群的疑难故障主要分为几类:
(1)资源调度类
(2)网络通信类
(3)配置参数类
大多数问题都是围绕这三点来进行的(不全是,大佬勿喷),下面列举我这次安装中某些问题,有些问题在此次安装中没有涉及到,所以以后涉及到的话会讲解。
节点不允许被调度我们在安装过程中会遇到下面这个问题
1 node(s) had taints that the pod didn't tolerate这个表示某个节点被标记为不可调度,这个是k8s官方默认的,因为这个是确保master节点不会被调度到额外的容器从而消耗资源,不过我们这个实验中可以设置所有节点允许调度来避免出现这个问题。
kubectl taint nodes --all node-role.kubernetes.io/master-镜像问题按照上面的安装步骤理论上是可以完全正确的部署好k8s集群的,不过安装速度会根据网速的情况有差异,我在安装的时候也安装了一个多小时,原因也是因为镜像下载的慢,当我们看到某些pod一直在pending的时候,我们可以通过如下命令查看具体的情况。
kubectl describe pod calico-node-ndwqv -n kube-system使用到describe命令来查看具体组件的情况,虽然也可以使用logs命令来查看,不过不如describe方便。
chrome 您的连接不是私密连接创建好dashboard之后,第一次通过chrome登录dashboard我们会发现报出这个错误您的连接不是私密连接,这个是由于chrome最新版本的错误导致,我们修改启动参数就可以了。
什么是摩尔定律?摩尔定律的本质是什么?
2019年下半年光伏产业将呈现爆发式增长
2019年运营商5G提速降费红包继续实施将加速上下游产业链快速成熟
上汽大通D90:空间大、配置稳、动力十足!这样的车才是真正的7座大SUV,新车将于8月8日正式上市
Imperva收购Distil Networks 帮助企业将机器人远离其网站和应用程序
Kubernetes 集群及其生态搭建
忆联加入英特尔OCSP社区共推服务器生态建设与发展
纵览:InfiniBand与以太网标准之异同
e络盟工程师社区成员突破20万大关
集成稳压电源
反激CCM模式的开关电源MOS开关损耗推导过程
健身房智能魔镜将为我们打造高科技健身的新模式
关于开关电源的一些必须掌握的小知识
软通动力携多项开源鸿蒙成果亮相华为开发者大会2023
什么是5G LAN?5GLAN和5G专网的区别
分头部署低中功率方案 土洋芯片商竞逐无线充电
基于C51C语言的嵌套实现
全球MCU市场发展现状分析
300GHz频段中使用单载波无线链路实现100Gb/s数据传输
2018销量创纪录 特斯拉苦尽甘来