什么是Kubernetes
Kubernetes是Google开源的容器集群管理系统,它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。
Kubernetes在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes功能概要
服务发现和负载均衡
Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果到容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。
存储编排
Kubernetes允许挂载多种存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
可以使用Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。
自动二进制打包
Kubernetes允许指定每个容器所需CPU和内存,当容器指定了资源请求时,Kubernetes可以做出更好的决策来管理容器的资源。
自我修复
Kubernetes重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes存储和管理敏感信息(如密码、OAuth令牌和ssh密钥)。可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
Kubernetes架构图
Kubernetes主要包含主节点(Master Node)和工作节点(Worker Node)
Master节点负责暴露应用程序的API、调度deployments和管理整个集群。每个工作节点都运行着容器运行时,(如Docker或者rkt)通过代理与主节点通信。
Worker节点同时运行着其它组件,如:日志、监控、服务发现和其它可选组件。工作节点是Kubernetes集群中真正运行应用的地方。
Master节点主要包含以下组件:
-ETCD:保存了整个集群的状态信息,默认监听2379和2380端口(2379提供服务,2380用于集群节点通信) -APTserver:操作资源的入口,提供认证、授权、权限控制、API注册和服务发现的机制,Kubelet直接与APIserver交互,默认端口6443。 -Controller Manager:负责管理集群的状态,如异常发现、自动扩容和滚动更新等,默认监听10252端口 -scheduler:负责根据Worker节点的性能、负载、数据位置等进行调度资源的调度,按照预定的调度策略将Pod调度到相应的机器上,默认监听10251端口
Worker节点主要包含以下组件:
-Kubelet:负责从APIserver接收Pod的创建请求,启动和停止Pod并且管理Pod的生命周期、数据卷以及网络,定期向Master节点上报本节点及Pod的基本信息 -Kube-proxy:负责服务发现和集群Service的负载均衡
各个组件的通信方式如下图所示:
Kubernetes核心概念
Pod
Pod是一个或多个容器的集合并扮演着Kuberntes集群中最核心的管理单元,Pod同时也充当着容器共享的上下文和资源的逻辑边界。一个Pod运行在一个Worker节点上,内部包含多个容器
Service
一组逻辑Pods和它们访问策略的抽象,为一组相同属性的Pods抽象出一个ClusterIP,允许Pod之间以及Pod与Service之间通过ClusterIP相互通信。当外部用户需要访问这些服务时,需要在定义Service时添加NodePort的扩展。
ReplicaSet
保证集群在任何时间点上都有指定数量的Pod副本,除非你需要定制滚动更新的策略或者不需要滚动更新,Kubernetes推荐使用Deployment而不是直接操作ReplicaSet
Deployment
Deployment主要职责是为了保证运行状态pod的数量,提供Pods滚动更新和ReplicaSets的控制器,支持滚动升级。
Label
用于标记资源对象(Pod、Service等),实现对象分组,联系各种Kubernetes资源的纽带,一个Service通过Label关联到后端的Pod上。Service定义一个Pod的label选择器,具备这个Label的Pod就会为此Service效力
Namespace
用于实现多租户隔离,在一个Kubernetes集群中可以使用Namespace创建多个“虚拟集群”,这些Namespace之间可以完全隔离,也可以通过某种方式,让一个Namespace中的服务可以访问到其他的namespace中的服务
在Ubuntu系统中安装Kubernetes集群
实例集群规划,一个master节点,3个worker节点
- 192.168.100.100(master)
- 192.168.100.101(node1)
- 192.168.100.102(node2)
- 192.168.100.103(node2)
安装docker并启动相应的服务
在master和worker节点都需要先安装docker
#安装docker
apt-get install docker.io
#注册docker守护进程到systemctl
systemctl enable docker
#启动docker守护进程
systemctl start docker
#验证安装是否成功
docker ps
安装Kubernetes
在master和worker节点都需要先安装Kubernetes组件
#添加Kubernetes GPG key
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
#添加docker源仓库(第一个是国外源,第二个是国内阿里云)
apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
#安装Kubernetes必要组件
apt-get install kubeadm kubelet kubectl
关闭swap
要运行kubernetes,你必须首先关闭swap,master和worker节点都需要执行
#暂时关闭,
swapoff -a
#永久关闭,注释掉swap那一行就行
vim /etc/fstab
初始化master
下面操作只在master节点执行,首先需要初始化master,命令如下:
kubeadm init
初始化结束后,你将看到将worker node加入集群的精确命令,类似如下,token和cert会不同
kubeadm join 192.168.100.100:6443 --token aat409.plzb63oim93gjucq --discovery-token-ca-cert-hash sha256:5b906d68640eeddcd1381bf76dc0da5c522d71ceb89c547ac5a61fded064e54e
上述命令需要单独备份,如果你不慎遗失了该命令,可以在master节点上使用如下命令来重新生成一条
kubeadm token create --print-join-command
如果在初始化过程中出现了任何Error导致初始化终止了,可以使用如下命令重置之后再重新进行初始化。
kubeadm reset
接下来需要部署master节点的环境变量
#创建环境变量目录
mkdir -p $HOME/.kube
#初始化环境变量配置
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#赋予执行权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
部署flannel网络
flannel是一个专门为kubernetes设置的网络规划服务,可以让集群中的不同节点主机创建的docker容器都具有全集群唯一的虚拟IP地址。
部署flannel网络使用如下命令:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
部署Worker节点
部署worker节点的环境变量,需要用到master节点的/etc/kubernetes/admin.conf内容
#创建环境变量目录
mkdir -p $HOME/.kube
#初始化环境变量配置,填入master节点的/etc/kubernetes/admin.conf内容
vim $HOME/.kube/config
#赋予执行权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
运行加入集群命令
kubeadm join 192.168.100.100:6443 --token aat409.plzb63oim93gjucq --discovery-token-ca-cert-hash sha256:5b906d68640eeddcd1381bf76dc0da5c522d71ceb89c547ac5a61fded064e54e
当worker节点都加入master后,就可以通过如下命令查看集群状态
kubectl get nodes
#执行成功后会有类似输出
NAME STATUS ROLES AGE VERSION
kubemaster Ready master 38h v1.18.5
node1 Ready <none> 37h v1.18.5
node2 Ready <none> 37h v1.18.5
node3 Ready <none> 37h v1.18.5
参考资料
-https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/ -https://juejin.im/post/5d86db1be51d4557ca7fde07 -http://ningg.top/kubernetes-series-03-architecture/ -https://jimmysong.io/kubernetes-handbook/concepts/ -https://www.jianshu.com/p/f2d4dd4d1fb1 -https://tonybai.com/2019/10/21/how-to-deploy-a-kubernetes-cluster-with-ubuntu-server-18-04/