版权声明:本文为 ABC实验室 原创文章,版权所有,侵权必究!
本文最新记录
版本 | 更新时间 | 说明 |
---|---|---|
1.1 | 2022-09-10 | 基于k8s稳定版本v1.18.2验证 |
1.0 | 2020-05-08 | 初始发布 |
编者语
Kubernetes作为新一代云计算平台,自2014年开源以来得到快速发展(2016年)并逐步成熟(2018年),极大推动了云原生领域及技术(微服务、FaaS和Serverless)的发展,被誉为影响云计算未来10年的革新技术。随着Kubernetes及其生态的广泛成熟,我想近年除了那些大厂外,在中小型IT公司Kubernetes也一定得到普遍的青睐和积极采用。可以说近年是Kubernetes大踏步进入中小企业市场的最佳时机,今年是Kubernetes“生产力元年”。因此作为开发人员,很有必要花点时间跟进学习下Kubernetes这门新技术。本文结合自己的实践分享下Kubernetes简单快速上手过程(简称快手指南,哈哈),希望对大家有所帮助。
注:从 Google 搜索引擎的趋势数据来看,Kubernetes和Spring Boot的关注度同趋势地从2016年后迅猛增长,而相应OpenStack和Hadoop在2016后遇冷下降明显,折射着云计算2.0时代的到来。
目标
作为新人,Kubernetes上手普遍存在如下痛点:
- 技术门槛较高,有较多概念和依赖。例如:Docker技术栈、Kubernetes体系新名词、复杂的YAML配置让人头疼。
- 部署困难。例如:多节点群集,多个部署工具和方式选择困难,Kubernetes部署过程中问题多。
- 欠缺好的文章指导,目前能Google搜索的技术文章不是滞后就是凌乱,而官方文档虽然权威、详尽,但新人起步的针对性不足。
- 让人心烦的网络和存储配置。作为云计算平台,除了计算容器化外,平台的网络和存储需要额外选择和配置。
- 额外的应用适配。搭建好了的平台,只有跑上我们开发的应用才是终极胜利。但这又是另外一件不很轻松的事情。
基于以上常见痛点,本文结合实验室搭建的Kubernetes演示环境,通过“所见即所得”方式来讲解下具体的实践过程,希望能达到如下目标:
- 通过试用免费开放的实验环境,增强体验感和可操作性;
- Github提供同步学习的开放源代码,增强演示过程的可复制性,让所见即所得;
- 精简Kubernetes概念,快速了解核心内容;
- 同步最新版本,通过Step-by-Step方式跳过各种坑,轻松部署Kubernetes;
- 通过运行演示的NodeJs和SpringBoot应用,达到学以致用的最终目标;
- 面向产线增加关键知识点延伸,便于接下来进一步拓展学习;
预演
本教程涉及源代码可以通过如下方式下载:
- 国内Gitlab: https://gitlab.abcxlab.com/bootcamp/k8s-quick-start
- 国外Github:https://github.com/abcxlab/k8s-quick-start
本教程支持在线演示环境体验,具体访问方式如下:
- 群集演示地址: https://k8s.abcxlab.com/
- 演示登录Token: 请扫码关注ABC实验室微信公众号,输入”k8s” 即可获取。
演示群集Dashboard截图
建议先体验演示环境,获取直观感受!
概述
Kubernetes 希腊语为“舵手”,是一个轻便、可扩展的工业级容器编排平台,用于管理容器化应用和服务。Google基于内部Borg系统研发并于2014年正式开源,随后在2015 年将它捐赠给新成立的云原生计算基金会(CNCF),近年来逐渐发展出了云原生生态。
架构
Kubernetes架构如下图所示
Kubernetes群集是一个主从分布式架构,由Master节点(多个)组成的控制平面和Worker节点(多个)组成的计算平面共同组成。主要组件如下:
- API Server:负责所有组件之间通信,并负责存储状态和配置到Etcd库中;
- Controller Manager:包含不同类型的群集控制器(如ReplicationSet/Deployment/Service等控制器),执行群集级别的功能,如复制组件、持续跟踪工作节点、处理节点识别等;
- Scheduler:重点负责给应用的Pod调度分配相应节点;
- Etcd:一个可靠的分布式数据存储,持久化保存群集状态和元数据;
- Kubelet:管理所在工作节点的所有容器,并持续跟踪和保持和API Server通讯,响应相关容器管理事件;
- Kube-proxy:他负责组件之间的负载均衡和服务的网络连通;
- Docker引擎:底层运行环境,可以是docker、rtk或其他引擎;
核心概念
- Pod:最小的调度分配单元,可包含一组容器和卷组成,同一个Pod的容器组共享同一个网络命名空间;
- ReplicationController/ReplicateSet: 用于控制Pod副本数量,保证Pod始终运行;
- StatefulSet:类似ReplicateSet,但StatefulSet提供Pod状态保持,在重新调度后保留他们的标识和状态,适合数据库等有状态应用场景;
- DeamonSet: 保证在所有群集节点上运行一个Pod;
- Service: 为一组功能相同的Pods提供单一不变的接入点,解耦Pods伸缩能力;
- Deployment:类似ReplicationController/ReplicateSet, 增加滚动升降级策略和能力;
- ConfigMap:配置选项,支持配置从Pod中解耦分离;
- Secret:类似ConfigMap,用于敏感数据保存;
特点
Kubernetes平台有如下典型特征:
- 容器的自动装箱,即调度;
- 水平扩容和伸缩,通过控制Pod副本数量达到伸缩能力;
- 服务发现和负载均衡;
- 服务自愈和恢复能力;
- 应用自动发布和回滚;
- 服务流量路由;
- 可扩展跟踪;
设计理念
-
分层式架构设计,自下而上分别为:核心层、应用层、管理层、接口层、生态层;
-
申明式API,通过List-Watch机制提供健壮的异步群控通讯,采用CRD(自定义资源)机制面向未来扩展;
-
透明的控制平面,基于统一的申明式API,增强平台内部透明性和外部一致性;
-
工作负载可移植,解耦上层应用和底层系统平台;
安装说明
好了,简单了解完基本概念和架构后,让我们开始动手实践下吧!
安装步骤
为了便于学习和掌握群集安装的具体过程,我们把群集安装整个过程做一个模块化切分,可分为如下8大步:
配置说明
- 安装工具 kubeadm版本: v1.18.2 (稳定版本)
- Kubernetes版本:v1.18.20 (稳定版本)
- 硬件最低要求: 2核 4G内存 20G 硬盘 (参考官方)
- 服务器操作系统:Ubuntu Server 18.04 LTS
- Docker版本: 19.03.15~3-0~ubuntu-bionic (稳定版本)
- 环境域名: k8s.abcxlab.com (Dashboard),*.k8s.abcxlab.com (应用)
节点说明
群集节点安排: 1个Master节点、2个Worker节点,具体如下所示:
代码说明
源代码地址:https://gitlab.abcxlab.com/bootcamp/k8s-quick-start
源代码目录说明:
/app – – springboot应用 和 nodejs 应用目录,包括应用源代码、k8s部署脚本、镜像Dockerfile配置等
/k8s – – Kubernetes 配置脚本,包括安装脚本和网络、负载和Dashboard等YAML配置文件等
应用说明
搭建好Kubernetes平台后,用于应用部署的两类常见应用说明如下:
SpringBoot应用
- 应用名称:micro
- 功能说明:功能很简单,只打印输出应用所在容器的hostname
- 应用代码:https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/tree/master/app/springboot/micro
- Docker镜像地址:https://hub.docker.com/r/abcxlab/micro
- 镜像构建方式:GoogleContainerTools/jib
NodeJs应用
- 应用名称:kubia
- 功能说明:功能很简单,只打印输出应用所在容器的hostname
- 应用代码:https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/tree/master/app/nodejs/kubia
- Docker镜像地址: https://hub.docker.com/r/abcxlab/kubia
- 镜像构建方式:Docker build
安装过程
节点配置
按照最低硬件要求配置类似如下三个物理节点服务器(虚拟机也可),一个为Master节点,另外两个为Worker节点。
注:本快速安装为非高可用安装,支持高可用可参考文末“延伸”章节介绍
Hostname
|
角色
|
IP
|
---|---|---|
XAnt | Master Node | 192.168.1.4 |
XBox | Worker Node | 192.168.1.5 |
XBee | Worker Node | 192.168.1.6 |
1. 配置主机名和 hosts
# 192.168.1.4节点运行 hostnamectl set-hostname XAnt # 192.168.1.5节点运行 hostnamectl set-hostname XBox # 192.168.1.6节点运行 hostnamectl set-hostname XBee # 三个节点同时配置hosts sudo bash -c ' cat >> /etc/hosts<<EOF 192.168.1.4 XAnt 192.168.1.5 XBox 192.168.1.6 XBee EOF'
2. 安装Ubuntu Server 18.04 LTS 操作系统,并关闭虚拟内存swap功能。
#临时关闭 sudo swapoff -a free -h total used free shared buff/cache available Mem: 15G 8.4G 321M 348M 6.9G 6.6G Swap: 0B 0B 0B
Docker安装
所有节点部署Docker作为容器引擎,安装命令如下:
curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/install-docker.sh | sh -
Master安装
kubernates Master节点安装,分为三个步骤
1. 安装kubeadm工具,命令如下:
curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/install-kubeadm.sh | sh -
2.手动下载所需镜像(防止自动安装时所需国外镜像没法下载),命令如下:
curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/pull-kube-image.sh | bash -
3. 使用kubeadm创建群集,命令如下:
sudo kubeadm init --kubernetes-version=v1.18.20 --pod-network-cidr=10.244.0.0/16 --skip-phases=preflight
正确执行三个步骤后,如果出现如下类似提示,说明安装成功。
... Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.1.4:6443 --token rfstgm.lxk9eik0ub409ifo \ --discovery-token-ca-cert-hash sha256:ec0d455d57d9b8348793a1ba1b937412f4264f1ee37215857c8e8e451d452fa2
按照上面提示在Master上运行配置好kubernetes-cli运行环境,命令如下:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
同时记下Worker 节点加入群集的命令,类似如下:
kubeadm join 192.168.1.4:6443 --token rfstgm.lxk9eik0ub409ifo \
--discovery-token-ca-cert-hash sha256:ec0d455d57d9b8348793a1ba1b937412f4264f1ee37215857c8e8e451d452fa2
关于网络配置提示,先不用担心,后续网络配置章节会做详细介绍。
提示:为了便于后续Master节点命令行中便捷输入,建议配置Shell自动补全功能, 如下所示:
#针对bash shell配置 echo "source <(kubectl completion bash)" >> ~/.bashrc source ~/.bashrc #针对zsh shell配置 vim ~/.zshrc #追加如下内容 if [ $commands[kubectl] ]; then source <(kubectl completion zsh) fi source ~/.zshrc
Worker安装
Worker节点的安装第一步类似Master节点(这里用XBox举例)
1.先kubeadm工具,命令如下:
curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/install-kubeadm.sh | sh -
2.再手动下载所需镜像(防止自动安装时所需国外镜像没法下载),命令如下:
curl -sfL https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/pull-kube-image.sh | bash -
3.最后按照Master节点提示,执行如下节点Join命令
sudo kubeadm join 192.168.1.4:6443 --token rfstgm.lxk9eik0ub409ifo --discovery-token-ca-cert-hash sha256:ec0d455d57d9b8348793a1ba1b937412f4264f1ee37215857c8e8e451d452fa2
提示:如果token过期或忘记discovery-token-ca-cert-hash相应参数值,可以通过在Master节点运行如下命令获取相应值,其中ca-cert-hash记得加”sha256:“前缀
#重新生成token kubeadm token create #获取discovery-token-ca-cert-hash openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
按照以上类似步骤,安装另外一个Worker节点XBee。
等所有节点都安装完毕后,在Master节点XAnt进行安装验证。
3. 检查群集,看节点是否加入群集
如图上所示即表明我们kubernetes群集安装成功,如果Worker节点状态暂时显示为NotReady也不用着急,我们继续配置网络即可。
提醒:安装过程中遇到问题时,可参考文末“常见问题”章节
网络配置
kubernetes 网络模型核心为三点
- 每个 Pod 都拥有一个独立 IP 地址;
- Pods通过扁平的网络连通,不同节点上Pods可以无NAT地直接通讯;
- Service Cluster IP 尽可在集群内部访问,外部请求需要通过 NodePort、LoadBalance 或者 Ingress 来访问;
采用kubeadm工具安装只支持CNI(Container Network Interface)网络插件,不支持默认的kubenet。因此需要安装相应插件(例如Flannel、Calico、Romana、Weave-net等插件,本文选择采用Overlay网络的Flannel插件),安装命令如下:
备注:Flannel插件相关YAML配置来自官网: https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#安装网络插件
sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/1.0_kube-flannel.yaml
# 验证是否安装成功
sudo kubectl get nodes -n kube-system
Nginx-Ingress安装
kubernetes群集内部服务可以通过三种方式暴露给外部访问(南北流量)
- NodePort方式,依赖节点的端口映射,属于节点原生网络。
- LoadBalance方式,依赖基础设施中负载均衡服务(例如:AWS ELB 或阿里云ELB等),特点是多个LB实例和相应IP地址(属于4层LB)。
- Ingress方式,它相对LoadBalance方式的优势在于通过安装的Ingress控制器(例如Nginx-Ingress) 基于固定IP的代理多个HTTP/HTTPS服务,有点类似于Nginx虚拟主机反向代理的用法(属于7层LB)。
这三种连通内网方式相关比较可参考下图:
由于Ingress连通方式的优点,本文选择Nginx-Ingress组件来暴露内部服务(例如:Kubernetes Dashboard 应用和演示应用都使用Ingress方式)
Nginx-Ingress安装命令如下:
备注:nginx-ingress相关YAML配置来自官网:https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
#下载Ingress控制器配置文件
wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/2.0_kube-ingress-nginx-extip.yaml
#按需修改externalIP和Port (见备注)
vim 2.0_kube-ingress-nginx-extip.yaml
#安装Ingress控制器
sudo kubectl apply -f 2.0_kube-ingress-nginx-extip.yaml
# 验证是否安装成功
sudo kubectl get pods -n ingress-nginx
注意:Ingress控制器对外IP和端口需要根据自己环境Worker节点安排做相应配置,默认配置演示群集中XBee和XBox两个Worker节点的IP,端口分别为9090(HTTP)和9443(HTTPS)(如下图所示)。两组IP可以提高可用性,在群集外围可以绑定到基础设施环境的LB上(演示环境用Nginx),提供对外服务(例如:https://k8.abcxlab.com)或者直接提供访问(例如:https://micro.k8s.abcxlab.com:9443/ )
Dashboard安装
安装好网络插件和Ingress控制器后,就可以开开心心部署应用了。我们就来试试部署Kubernetes群集管理仪表盘Dashboard吧。
备注:Dashboard相关YAML配置来自官网:https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
# 安装Dashboard应用及相应授权 sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/3.0_kube-dashboard.yaml # 下载dashboard ingress配置文件 wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/3.1_kube-dashboard-ingress.yaml #把k8s.abcxlab.com域名改为自己要使用的域名:dashboard.your.domain vim 3.1_kube-dashboard-ingress.yaml # 为Dashboard应用配置Ingress访问 sudo kubectl apply -f 3.1_kube-dashboard-ingress.yaml # 创建登录用的ServiceAccount: admin sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/k8s/3.2_kube-dashboard-admin-user.yaml # 验证是否安装成功 sudo kubectl get pods -n kubernetes-dashboard
注意:Dashboard的Ingress配置文件的域名:k8s.abcxlab.com 需要修改为自己的域名:<dashboard.your.domain>
如果Dashboard部署成功,就可以通过https://<dashboard.your.domain>:9443 方式访问如下登录界面了。(注意:需要域名访问)
在Master节点执行如下命令获取Dashboard登录Token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin | awk '{print $1}')
应用部署
如果一切没问题,接下来就可以用搭建的群集进行应用部署啦!
1.部署NodeJs/kubia应用
# 部署kubia应用 sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/nodejs/1_kubia-deployment.yaml # 下载kubia应用ingress配置文件 wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/nodejs/2_kubia-ingress.yaml # 把kubia.k8s.abcxlab.com域名改为自己要使用的域名 kubia.your.domain vim 2_kubia-ingress.yaml # 为kubia应用配置Ingress访问 sudo kubectl apply -f 2_kubia-ingress.yaml #检查部署是否成功 sudo kubectl get ingress #访问kubia应用 curl -kL https://kubia.k8s.abcxlab.com:9443/
注意:如果安装kubia出现nginx ingres failed calling webhook异常,可以试试 “ kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission ” 命令删除ingress-nginx-admission 后再执行 “ sudo kubectl apply -f 2_kubia-ingress.yaml ”
2.水平伸缩NodeJs/kubia应用
#扩容:从2副本扩容到3
sudo kubectl scale deployment kubia --replicas=3
#检查扩容是否成功
sudo kubectl get pod
#收缩:从3副本扩容到1
sudo kubectl scale deployment kubia --replicas=1
#检查收缩是否成功
sudo kubectl get pod
3.部署SpringBoot/micro应用
类似于NodeJs/kubia应用部署,命令如下:
#部署micro应用 sudo kubectl apply -f https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/springboot/1_micro-deployment.yaml # 下载micro应用ingress配置文件 wget https://gitlab.abcxlab.com/bootcamp/k8s-quick-start/-/raw/master/app/springboot/2_micro-ingress.yaml #把micro.k8s.abcxlab.com域名改为自己要使用的域名 micro.your.domain vim 2_micro-ingress.yaml # 为micro应用配置Ingress访问 sudo kubectl apply -f 2_micro-ingress.yaml #检查部署是否成功 sudo kubectl get ingress curl -kL https://micro.k8s.abcxlab.com:9443/
好了,到此整个Kubernetes群集End-to-End部署和试用完毕,接下来简单聊聊和产线相关话题。
延伸
高可用部署
Kubernetes群集高可用,主要要保证Etcd高可用性和Master节点组件高可用性。
按照Etcd分布式数据库是内置还是外置,Kubernetes高可用部署可分为如下两种方式
1.Master堆叠方式,如下图所示:
2.Etcd外部群集方式,如下图所示:
kubeadm工具也支持高可用群集部署,由于篇幅有限,更多介绍可参考官方文档:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/high-availability/
常见问题
- Minikube、kubeadm、Kubespray、Kops等Kubernetes部署工具该如何选择?
简单来说就是几个工具的使用场景不一样,Minikube 通过虚拟机方式快速安装单节点 Kubernetes 集群,可用于个人电脑快速体验Kubernetes;Kubeadm 是官方推荐的Kubernetes 分发工具,该工具有助于在现有基础架构上引导最佳 Kubernetes 集群实践,优点是能够在任何地方发布最小的可行 Kubernetes 集群;但 Kubeadm 不提供基础架构配置(例如:网络、负载均衡、存储等都需要额外配置);Kops适合于在阿里云、AWS、GCE、Azure、OpenStack等云平台上部署Kubernetes群集,目前不支持裸机部署。Kubespray是产线部署常用工具,依赖Ansible,支持AWS,GCE,Azure,OpenStack等云平台,以及物理服务器的IaaS平台。 - 群集部署过程中,有哪些简单debug方式?
a. 通过 kubectl describe 命令, 查看pod/svc/rc/ds/ingress/deployment等状态
b. 通过 kubectl logs 命令,查看pod日志
c. 通过 kubectl exec -it 进入pod 内部,debug功能
d. tail -f /var/log/syslog 跟踪系统日志 - 群集部署过程中,有哪些简单重试方式?
a. 删除群集:kubeadm reset
b. 删除部署: kubectl delete -f <yaml file>
c. 重启服务: sudo service kubelet restart
参考
- Flannel 插件:https://github.com/coreos/flannel
- Nginx Ingress插件:https://kubernetes.github.io/ingress-nginx/deploy/
- Dashboard应用:https://github.com/kubernetes/dashboard
留言 点赞 关注 官方公众号
—— ABC实验室,让技术更简单