1 序言
最近学习了Kubernetes集群管理工具,在阿里云环境中进行了部署适用,该文章对近期的学习和使用作一个记录。
2 Kubernetes简介
Kubernetes 是一个自动化部署、伸缩和操作应用程序容器的开源平台。
它是2014年谷歌基于Borg设计的Go语言开源版本的大规模容器管理系统,经过近些年的推广和应用,在容器管理、基础服务架构领域中基本已奠定了霸主地位。
它的核心功能是基于容器技术实现自动管理资源及跨多个数据中心的资源利用率的最大化。
3 为什么使用Kubernetes
容器技术本身就为现代模块化系统设计提供了极大的便利,当我们使用容器时,传统系统架构中的底层代码和功能模块都实现了良好的封装性及迁移能力。其对环境的隔离使我们能更专注的实现功能或业务本身。
但在容器化和云技术发展日新月异的今天,仅仅是对环境的剥离完全无法满足复杂业务的部署需求。在复杂业务场景下,我们往往需要更精细的资源管理和智能化的资源调度策略,对已有服务的伸缩扩容机制管理,对分布式资源的管理例用及更健全的安全机制等更复杂的需求,尤其是在对微服务或无服务器架构等新型分布式架构的部署中,这几点尤为重要。
Kubernetes提供了一个容器编排的平台,基于此平台你可以更简单地实现上述地一系列功能性能需求,让企业地精力击中在业务本身,极大地降低部署和运维的成本,同时实现更高的性能。
4 Kubernetes版本
由于Kubernetes开源特性,目前存在多种Kubernetes的发行版本,用户可根据自己的需求下载不同的发行版本以减少部署成本。
运用较广的版版本主要有:
Rancher :Rancher容器管理平台是基于Kubernetes来构建的,多集群Kubernetes部署是Rancher的Kubernetes发行版强调的重点。如果你想跨多个云部署Kubernetes,或者由于某些原因不希望使用命名空间隔离Kubernetes工作负载,那么Rancher将是你的首选项。Rancher可以部署在本地数据中心和云上,甚至可以在包含两者的跨基础设施架构上工作。Rancher和OpenShift的相似之处在于它在Kubernetes上集成了多种工具,但Rancher更为灵活,基于Rancher你可以自由选择组件。
OpenShift :OpenShift是一个包含了Kubernetes以及其他各种运行、部署和管理容器所需工具的容器化平台。这是一个相对不太灵活的Kubernetes发行版,当你在使用工具和平台来构建完整的容器化堆栈时,它并不会给予你太多的选择。另一方面,OpenShift提供了几乎所有你可能需要的开箱即用的工具,你将获得尽可能接近完整的Kubernetes。OpenShift由Red Hat开发,可以同时在本地数据中心和云中运行。
Canonical Kubernetes :开发Ubuntu Linux的Canonical公司提供了功能强大且具有支持良好的Kubernetes发行版。除了要求你必须使用Ubuntu,Canonical的Kubernetes发行版相对“纯粹”,如果你希望安装组件,你可以将它与你所需的任何组件进行集成。它可以在本地数据中心或者云中运行。
Google Kubernetes Engine :当其他云供应商专注于自己的编排工具时,谷歌云就已经押注在Kubernetes身上了,这并不稀奇,从Kubernetes项目伊始,Google便是Kubernetes的主要支持者。如今,Google Kubernetes Engine是一种灵活且简单的Kubernetes发行版。由于它运行在谷歌云中,因此你无需担心安装问题。
Azure Kubernetes Service :Azure曾经将赌注押在Docker Swarm上,但是Azure Kubernetes Service(AKS)现在是Azure云的主要编排解决方案。这是一款仅运行在云上的Kubernetes发行版。
AWS Elastic Kubernetes Service :虽然AWS云上的容器服务Elastic Container Service(ECS)拥有自己的编排器,但AWS还提供了Elastic Kubernetes Service(EKS),这是一种围绕Kubernetes构建的替代方案。和AKS一样,EKS仅在云上运行。
此外,国内也有一些颇有建树的开源版本,如Kubersphere等简化操作,同时具备更好可视化的版本。
5 Kubernetes结构
上图是一个典型的K8S集群,具备一个Master节点和多个工作节点,其中Master节点负责整个集群核心功能如API服务、资源调度、资源自动化控制等,工作节点中则以Pod为单位管理各个任务的容器,多个Pod组成了集群的对外服务。
6 Kubernetes资源对象
7 Kubernetes部署
环境:阿里云服务器
操作系统:CentOS 7.4
部署相关软件:
Master部署流程
Master节点中需要安装kubeadm kubectl kubelet
Node节点中需要安装kubeadm kubelet
两类节点中均需要安装etcd和docker基础服务。
安装具体步骤:
非阿里云环境请自行替换yum源。
关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
关闭交换分区
临时关闭:
swapoff -a
永久关闭:
sudo sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab
安装etcd
yum install etcd -y
安装docker
yum install docker-ce -y
安装kubeadm kubelet kubectl
添加阿里的kubernetes源:
vim kubernetes.repo
[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
exclude=kubectl kubeadm kubelet
安装kubelet/kubectl:
yum install -y kubelet kubeadm kubectl –disableexcludes=kubernetes
启动安装服务:
systemctl start kubelet
systemctl enable kubelet
systemctl start kubectl
systemctl enable kubectl
配置kubeadm
该步骤非必须,若想要详细配置安装的kubernetes细节,则需要进行配置,若不需要,也可以直接进行安装(指定pod地址即可)。
kubeadm config print init-defaults > init.default.yaml
对init.default.yaml中的内容进行配置。
安装kubernetes
(安装过程中碰到的大多数问题都是网络问题,有条件请挂VPN)
下载镜像:
由于国内无法访问谷歌云,故此处最好通过手动方式进行下载
docker国内镜像源手动安装/替换
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull coredns/coredns:1.8.0 # 这个在registry.cn-hangzhou.aliyuncs.com/google_containers中没有
修改镜像tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2 k8s.gcr.io/kube-apiserver:v1.21.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2 k8s.gcr.io/kube-controller-manager:v1.21.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2 k8s.gcr.io/kube-scheduler:v1.21.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2 k8s.gcr.io/kube-proxy:v1.21.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 k8s.gcr.io/pause:3.4.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag coredns/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
把所需的镜像下载好,init的时候就不会再拉镜像,由于无法连接google镜像库导致出错
删除原来的镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker rmi coredns/coredns:1.8.0
这里需要注意的是阿里云中没有coredns,且该镜像下载完成后进行tag修改的时候需要在版本号前加V,否则在集群创建时会下载该文件失败而导致安装中断。
安装:
kubeadm init –apiserver-advertise-address 172.16.236.11 –kubernetes-version=v1.21.2 –pod-network-cidr=10.244.0.0/16
或
kubeadm init –config=init-config.yaml
看到
即表示安装成功
随后执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
master既安装完成,可使用
kubectl -n kube-system get configmap
查看configmap列表以验证。
Node部署流程
node部署整体与Master一致,不需要安装kubectl(装了也无所谓)。
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull coredns/coredns:1.8.0
以上镜像在各节点仍然需要。
在安装完kubeadm,kubelet后,不使用kubeadm init命令,而是用刚刚master节点的其他节点加入的命令拷贝过来:
kubeadm join 172.16.236.11:6443 –token abcdef.0123456789abcdef \
–discovery-token-ca-cert-hash sha256:2697aa317efecd3ac74d662e16c213b4135d0bce5df608627fdc635899d0165e
加入成功后,在master节点使用
kubectl get nodes
可查看集群中节点信息。
安装CNI网络插件
在上一步中查看到的节点状态均为NotReady。
此时应自行选择CNI网络插件,此处以Calico CNI为例:
kubectl apply -f “http://docs.projectcalico.org/manifests/calico.yaml”
安装完成后,各节点状态为Ready。
至此,Kubernetes集群安装组建完成。
安装过程中碰到的问题
1:我手动下载了镜像也修改了镜像tag,为什么还是会拉取不下来报错?
可通过错误日志,仔细核对tag的名称,某些版本tag名称与下载的镜像名称或版本有细微差别,这点在很多技术博客中未提及。比如coredns的版本名称为v1.8.0而非1.8.0。
2:安装完成后,有的节点为Ready有的为NotReady,为什么?
有的节点在新加入时,coredns镜像未下载,或其他网络问题,将镜像下载完全后重启kubelet服务,等待一段时间。
3:集群组建完成后kubectl get pods –all-namespace查看集群工作状态时,有错误状态的Pod。
正确状态如下:
通过kubectl –namespace=kube-system describe pod calico-node-gsvrx(podname)命令,查看pod详细信息。
当多个节点存在时,每个节点都对应了kube-proxy-和calico-node-的状态,一般当某个calico-node出现异常或coredns出现异常时,可能是某节点的coredns镜像未具备,验证后重启节点即可解决。
CNI网络(calico为例)未安装时,coredns无法正常运行。
某节点kube-proxy运行不正常,先解决calico和coredns的问题,然后重启kubelet服务等待。
一般来说,这一步出现问题大多数情况都是镜像未完全具备导致的。