Kubernetes是Google公司开发的容器编排软件,可以帮助用户在软件上开发程序,可以设计程序组,可以设计逻辑单元,可以通过建立集群的方式扩展程序,内置的功能很多,适合开发企业扩展程序,由于这款软件是开源的,所以开发人员可以随意添加自己的程序组,可以将扩展内容部署到云端或者是服务器;这款软件安装部署还是比较复杂的,用户可以到软件查看开发文档,也可以md文件了解相关模块介绍!
软件功能
全球规模
基于允许 Google 每周运行数十亿个容器的原则进行设计,Kubernetes 可以在不增加您的运维团队的情况下进行弹性扩展。
永不过时
无论您应用运行在本地还是运行于全球任何地域,Kubernetes 的灵活性都可以随着您的需求复杂度不断增加,还可以持续、轻松地对外提供服务。
随处运行
Kubernetes 是开源的,可以让您自由地部署在企业内部,私有云、混合云或公有云基础架构,使您轻松将应用迁移至任何位置。
软件特色
要使用 Kubernetes,你需要用 Kubernetes API 对象 来描述集群的预期状态(desired state) :包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等。你可以使用命令行工具 kubectl 来调用 Kubernetes API 创建对象,通过所创建的这些对象来配置预期状态。你也可以直接调用 Kubernetes API 和集群进行交互,设置或者修改预期状态。
一旦你设置了你所需的目标状态,Kubernetes 控制面(control plane) 会促成集群的当前状态符合其预期状态。为此,Kubernetes 会自动执行各类任务,比如运行或者重启容器、调整给定应用的副本数等等。Kubernetes 控制面由一组运行在集群上的进程组成:
Kubernetes 主控组件(Master) 包含三个进程,都运行在集群中的某个节上,通常这个节点被称为 master 节点。这些进程包括:kube-apiserver、kube-controller-manager和kube-scheduler。
集群中的每个非 master 节点都运行两个进程:
kubelet,和 master 节点进行通信。
kube-proxy,一种网络代理,将 Kubernetes 的网络服务代理到每个节点上。
Kubernetes 对象
安装kubeadm
准备开始
一台或多台运行着下列系统的机器:
Ubuntu 16.04+
Debian 9
CentOS 7
RHEL 7
Fedora 25/26 (尽力服务)
HypriotOS v1.0.1+
Container Linux (针对1800.6.0 版本测试)
每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响您应用的运行内存)
2 CPU 核心或更多
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
节点之中不可以有重复的主机名,MAC 地址,product_uuid。更多详细信息请参见这里 。
开启主机上的一些特定端口. 更多详细信息请参见这里。
禁用 Swap 交换分区。为了保证 kubelet 正确运行,您 必须 禁用交换分区。
确保每个节点上 MAC 地址和 product_uuid 的唯一性。
您可以使用下列命令获取网络接口的 MAC 地址:ip link 或是 ifconfig -a下列命令可以用来获取 product_uuid sudo cat /sys/class/dmi/id/product_uuid一般来讲,硬件设备会拥有独一无二的地址,但是有些虚拟机可能会雷同。Kubernetes 使用这些值来唯一确定集群中的节点。如果这些值在集群中不唯一,可能会导致安装失败。
检查网络适配器
如果您有一个以上的网络适配器,同时您的 Kubernetes 组件通过默认路由不可达,我们建议您预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接。
检查所需端口
Master 节点
NodePort 服务 的默认端口范围。
任何使用 * 标记的端口号都有可能被覆盖,所以您需要保证您的自定义端口的状态是开放的。
虽然主节点已经包含了 etcd 的端口,您也可以使用自定义的外部 etcd 集群,或是指定自定义端口。 您使用的 pod 网络插件 (见下) 也可能需要某些特定端口开启。由于各个 pod 网络插件都有所不同,请参阅他们各自文档中对端口的要求。
安装 runtime
从 v1.6.0 起,Kubernetes 开始允许使用 CRI,容器运行时接口。默认的容器运行时是 Docker,这是由 kubelet 内置的 CRI 实现 dockershim 开启的。
其他的容器运行时有:
containerd (containerd 的内置 CRI 插件)
cri-o
frakti
rkt
参考 CRI 安装指南 获取更多信息.
安装 kubeadm, kubelet 和 kubectl
您需要在每台机器上都安装以下的软件包:
kubeadm: 用来初始化集群的指令。
kubelet: 在集群中的每个节点上用来启动 pod 和 container 等。
kubectl: 用来与集群通信的命令行工具。
kubeadm 不能 帮您安装或管理 kubelet 或 kubectl ,所以您得保证他们满足通过 kubeadm 安装的 Kubernetes 控制层对版本的要求。如果版本没有满足要求,就有可能导致一些难以想到的错误或问题。然而控制层与 kubelet 间的 小版本号 不一致无伤大雅,不过请记住 kubelet 的版本不可以超过 API server 的版本。例如 1.8.0 的 API server 可以适配 1.7.0 的 kubelet,反之就不行了。
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
在 Master 节点上配置 kubelet 所需的 cgroup 驱动
使用 Docker 时,kubeadm 会自动为其检测 cgroup 驱动在运行时对 /var/lib/kubelet/kubeadm-flags.env 文件进行配置。 如果您使用了不同的 CRI, 您得把 /etc/default/kubelet文件中的 cgroup-driver 位置改为对应的值,像这样:
KUBELET_EXTRA_ARGS=--cgroup-driver=
这个文件将会被 kubeadm init 和 kubeadm join 用于为 kubelet 获取 额外的用户参数。
请注意,您只需要在您的 cgroup driver 不是 cgroupfs 时这么做,因为 cgroupfs 已经是 kubelet 的默认值了。
需要重启 kubelet:
systemctl daemon-reload
systemctl restart kubelet
使用 kubeadm 创建一个单主集群
kubeadm 能帮助您建立一个小型的符合最佳实践的 Kubernetes 集群。通过使用 kubeadm, 您的集群会符合 Kubernetes 合规性测试的要求. Kubeadm 也支持其他的集群生命周期操作,比如升级、降级和管理启动引导令牌。
因为您可以在不同类型的机器(比如笔记本、服务器和树莓派等)上安装 kubeadm,因此它非常适合与 Terraform 或 Ansible 这类自动化管理系统集成。
kubeadm 的简单便捷为大家带来了广泛的用户案例:
新用户可以从 kubeadm 开始来试用 Kubernetes。
熟悉 Kubernetes 的用户可以使用 kubeadm 快速搭建集群并测试他们的应用。
大型的项目可以将 kubeadm 和其他的安装工具一起形成一个比较复杂的系统。
kubeadm 的设计初衷是为新用户提供一种便捷的方式来首次试用 Kubernetes, 同时也方便老用户搭建集群测试他们的应用。 此外 kubeadm 也可以跟其它生态系统与/或安装工具集成到一起,提供更强大的功能。
您可以很方便地在支持 rpm 或 deb 软件包的操作系统上安装 _kubeadm_。对应 kubeadm 的 SIG, SIG Cluster Lifecycle, 提供了预编译的这类安装包,当然您也可以自己基于源码为其它操作系统来构造安装包。
kubeadm 成熟程度
kubeadm 的整体功能目前还是 Beta 状态,然而很快在 2018 年就会转换成正式发布 (GA) 状态。 一些子功能,比如自托管或者配置文件 API 还在开发过程当中。 随着工具的发展,创建集群的方法可能会有所变化,但是整体部署方案还是比较稳定的。 在 kubeadm alpha 下面的任何命令都只是 alpha 状态,目前只提供初期阶段的服务。
维护周期
Kubernetes 发现版本的通常只维护支持九个月,在维护周期内,如果发现有比较重大的 bug 或者安全问题的话, 可能会发布一个补丁版本。下面是 Kubernetes 的发布和维护周期,同时也适用于 kubeadm。
准备开始
一个或者多个兼容 deb 或者 rpm 软件包的操作系统,比如 Ubuntu 或者 CentOS
每台机器 2 GB 以上的内存,内存不足时应用会受限制
主节点上 2 CPU 以上
集群里所有的机器有完全的网络连接,公有网络或者私有网络都可以
目标
搭建一个单主 Kubernetes 集群或者高可用集群
在集群上安装 Pod 网络组件以便 Pod 之间可以互相通信
步骤
在您的机器上安装 kubeadm
请查阅安装 kubeadm。
Note:
注意: 如果您的机器已经安装了 kubeadm, 请运行 apt-get update && apt-get upgrade 或者 yum update 来升级至最新版本的 kubeadm.
升级过程中,kubelet 会每隔几秒钟重启并陷入了不断循环等待 kubeadm 发布指令的状态。 这个死循环的过程是正常的,当升级并初始化完成您的主节点之后,kubelet 才会正常运行。
初始化您的主节点
主节点是集群里运行控制面的机器,包括 etcd (集群的数据库)和 API 服务(kubectl CLI 与之交互)。
选择一个 Pod 网络插件,并检查是否在 kubeadm 初始化过程中需要传入什么参数。这个取决于 您选择的网络插件,您可能需要设置 --Pod-network-cidr 来指定网络驱动的 CIDR。请参阅安装网络插件。
(可选) 除非特别指定,kubeadm 会使用默认网关所在的网络接口广播其主节点的 IP 地址。若需使用其他网络接口,请 给 kubeadm init 设置 --apiserver-advertise-address= 参数。如果需要部署 IPv6 的集群,则需要指定一个 IPv6 地址,比如 --apiserver-advertise-address=fd00::101。
(可选) 在运行 kubeadm init 之前请先执行 kubeadm config images pull 来测试与 gcr.io 的连接。
现在运行:
kubeadm init
如果需要再次运行 kubeadm init,您必须先卸载集群。
如果您需要将不同架构的节点加入您的集群,请单独在这类节点上为 kube-proxy 和 kube-dns 创建 Deployment 或 DaemonSet。 这是因为这些组件的 Docker 镜像并不支持多架构。
kubeadm init 首先会执行一系列的运行前检查来确保机器满足运行 Kubernetes 的条件。 这些检查会抛出警告并在发现错误的时候终止整个初始化进程。 然后 kubeadm init 会下载并安装集群的控制面组件,这可能会花费几分钟时间,其输出如下所示:
如果需要让普通用户可以运行 kubectl,请运行如下命令,其实这也是 kubeadm init 输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果您是 root 用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
请备份好 kubeadm init 输出中的 kubeadm join 命令,因为您会需要这个命令来给集群添加节点。
令牌是主节点和新添加的节点之间进行相互身份验证的,因此请确保其安全。任何人只要知道了这些令牌,就可以随便给您的集群添加节点。 可以使用 kubeadm token 命令来列出、创建和删除这类令牌。 请参阅kubeadm 参考指南。
安装 Pod 网络插件
Caution: 注意: 这一节包含了安装和部署顺序的重要信息,执行之前请仔细阅读。
您必须先安装 Pod 网络插件,以便您的 Pod 可以互相通信。
网络必须在部署任何应用之前部署好。此外,在网络安装之前是 CoreDNS 不会启用的。 kubeadm 只支持基于容器网络接口(CNI)的网络而且不支持 kubenet 。
有一些项目为 Kubernetes 提供使用 CNI 的 Pod 网络,其中一些也支持网络策略. 请参阅插件页面了解可用网络插件的完整列表。 - CNI v0.6.0 也提供了 IPv6 的支持。 - CNI 网桥 和 local-ipam 是 Kubernetes 1.9 版本里提供的唯一支持 IPv6 的网络插件。
注意 kubeadm 默认会创建一个比较安全的集群并强制启用RBAC。 请确保您的网络方案支持 RBAC。
您可以使用下列命令安装网络插件:
∨ 展开