1. 概念
k8s作为时下最火的容器编排引擎,我们非常有必要花时间去学习、研究并且掌握它。
1.1 什么是k8s
k8s全称Kubernetes,k8s是 Google 团队发起的一个开源项目,它的目标是管理跨多个主机的容器,用于自动部署、扩展和管理容器化的应用程序,主要实现语言为 Go 语言。
1.2 k8s架构
如下图所示是k8s的整体架构图(该图片摘自网络):
- k8s架构图
1.3 k8s核心组件
从上述k8s的架构图来看,一个k8s集群物理上是由一个master节点和若干个(一般至少为2个)工作节点组成,而对应不同的节点会因为角色功能的不同都会有各自的核心组件。
master
k8s的主控节点,负责管理集群和协调集群中的所有活动,其核心组件至少包括如下几种:
- apiserver: 对内/外提供 HTTP REST资源操作接口;
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler:资源的调度策略,将不同的pod调度到不同的工作节点上执行;
- etcd:保存整个集群的状态信息,其实质是个数据库;
node
k8s的工作节点,完成最终pod中容器的程序的运行和业务的处理,其核心组件主要包括:
- kubelet:负责 Pod 的创建、启动、监控、重启、销毁等工作,同时与 Master 节点协作,实现集群管理的基本功能;
- kube-proxy:实现 Kubernetes Service 的通信和负载均衡;
Deployment
Replication Controller
ReplicaSets
pod
k8s资源调度的最小单位,它是由紧密联系、资源共享的一组容器在组成,可以理解成一个具体应用的实例。
service
提供访问策略,资源的访问入口。
namespace
为k8s集群提供虚拟的隔离作用,一般地至少会存在两个命名空间:default、kube-system,实际使用中我们可以根据需求自建namespace。
2. 搭建k8s集群环境
了解了k8s的基本概念之后,进一步理解k8s最快的方式就是亲自搭建一个k8s集群,此处只有一个节点(也就是同时扮演master和node的角色)。
2.1 安装docker
docker的安装此处不再赘述,可参照我的另一篇博文:https://www.jianshu.com/p/911dba395ef3
2.2 安装k8s基础组件
这里我是通过kubeadm
来搭建k8s集群,所以需要首先同时安装kubeadm、kubectl、kubelet
,安装的过程其实跟docker类似,可参考如下:
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
echo 'deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main' > /etc/apt/sources.list.d/k8s.list
apt-get update && apt-get install -y kubeadm kubectl kubelet
2.3 创建k8s初始集群环境
2.3.1 下载k8s组件
搭建k8s集群所需的组件基本上都放在google网站上,需要科学上网,如果网络搞不定,可以先从docker hub下载这些组件然后修改tag,首先可通过下图命令来查看需要安装的k8s组件:
- kubeadm config images list
接着,写一个下载所需docker image和修改tag的shell脚本:
- cat pull_and_tag_k8s_images.sh
然后执行
sh pull_and_tag_k8s_images.sh
完成k8s组件镜像的下载和标签的修改。
2.3.2 初始化集群环境
首先执行swapoff -a
来关闭,然后执行如下命令构建k8s初始化环境:
kubeadm init --pod-network-cidr=10.244.0.0/16
根据输出的提示安装kubectl的配置文件:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
安装pod网络是pod间能够通信:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
出于安全考虑,默认master不允许参与pod调度因为,现在只有一个节点,为了能够让pod调度到master,需要执行:
kubectl taint node vienfu-virtualbox node-role.kubernetes.io/master-
# 如果新添加了node,需要重新恢复master only状态,执行如下命令
kubectl taint node vienfu-virtualbox node-role.kubernetes.io/master=""
#上述命令中的vienfu-virtualbox是master的主机名
自此,单节点的k8s集群环境算是部署完成了,可通过kubectl get nodes -o wide命令查看:
- kubectl get nodes -o wide