一、Kubernetes简介
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用(就像canary deployments)。
其主要功能如下:
- 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。
- 以集群的方式运行、管理跨机器的容器。
- 解决Docker跨机器容器之间的通讯问题。
- Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态。
当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台,除此之外,也可以直接运行在物理机上。
K8s架构概览:
K8s集群由主结点和工作结点两类结点构成。其中主结点上运行着K8s Control Plane,控制并管理着整个K8s系统;工作结点上运行用户实际部署到K8s应用。
K8s的结点上运行着一些组件,共同协作以完成容器编排,其中主要的组件有:
etcd
一款开源软件。提供可靠的分布式数据存储服务,用于持久化存储K8s集群的配置和状态。
K8s API server 用户程序(如kubectl)、K8s其它组件之间通信的接口。
K8s其它组件之间不直接通信,而是通过API server
通信的。这一点在上图的连接中可以体现,例如,只有API server连接了etcd,即其它组件更新K8s集群的状态时,只能通过API server读写etcd中的数据。
Scheduler
排程组件,为用户应用的每一可部署组件分配工作结点。
Controller Manager
执行集群级别的功能,如复制组件、追踪工作结点状态、处理结点失败等。Controller Manager组件是由多个控制器组成的,其中很多控制器是按K8s的资源类型划分的,如Replication Manager(管理ReplicationController 资源),ReplicaSet Controller,PersistentVolume controller。
kube-proxy
在应用组件间负载均衡网络流量。
Kubelet
管理工作结点上的容器。
Container runtime Docker,
rkt等实际运行容器的组件。
官网:https://kubernetes.io/
源码:https://github.com/kubernetes
二、Kubernetes主要概念
1、Pods
Pod
是Kubernetes的基本操作单元,把相关的一个或多个容器构成一个Pod,通常Pod里的容器运行相同的应用。Pod包含的容器运行在同一个Minion(Host)上,看作一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。
2、Services
Services
也是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持,通过Proxy的port和服务selector决定服务请求传递给后端提供服务的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展或维护后端带来很大的好处。
3、Replication Controllers
Replication Controller
确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods。对于利用pod 模板创建的pods,Replication Controller根据label selector来关联,通过修改pods的label可以删除对应的pods。
Controller主要有如下用法:
1)Rescheduling
如上所述,Replication Controller会确保Kubernetes集群中指定的pod副本(replicas)在运行, 即使在节点出错时。
- Scaling
通过修改Replication Controller的副本(replicas)数量来水平扩展或者缩小运行的pods。- Rolling updates
Replication Controller的设计原则使得可以一个一个地替换pods来rolling updates服务。- Multiple release tracks
如果需要在系统中运行multiple release的服务,Replication Controller使用labels来区分multiple release tracks。
4、Labels
Labels
是用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller可以有多个label,但是每个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。
Controller Manager中的控制器监视到新的部署描述后,根据部署描述,创建ReplicaSet、Pod等资源。Scheduler监视到新的Pod资源后,结合集群的资源情况,选定一或多个工作结点运行Pod。工作结点上的Kubelet监视到有Pod被计划在自己的结点后,向Docker等Container runtime发出启动容器的指令,Docker engineer将按照指令从Docker registy拉取镜像,然后启动并运行容器。
三、Kubernetes官网
# 1. 安装docker
# 卸载旧版本
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
# 设置 yum repository
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 添加下载仓库
[root@manager ~]# sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装并启动 docker
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# sudo yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.io
# 设置开机启动
[root@manager ~]# sudo systemctl enable docker
[root@manager ~]# sudo systemctl start docker
# 检查 docker 版本
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# docker version
# 2. 安装 nfs-utils
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# sudo yum install -y nfs-utils
# 说明:必须先安装 nfs-utils 才能挂载 nfs 网络存储
# 3. K8S基本配置
# 配置K8S的yum源
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 关闭 防火墙、SeLinux、swap
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# systemctl stop firewalld
[root@manager ~]# systemctl disable firewalld
# 表示关闭selinux防火墙
[root@manager ~]# setenforce 0
[root@manager ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭系统交换区
[root@manager ~]# swapoff -a
[root@manager ~]# yes | cp /etc/fstab /etc/fstab_bak
[root@manager ~]# cat /etc/fstab_bak |grep -v swap > /etc/fstab
# 4. 修改 /etc/sysctl.conf
# 在master节点和worker节点都要执行
[root@manager ~]# vi /etc/sysctl.conf
# 内容
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 在 master 节点和 worker 节点都要执行
[root@manager ~]# sysctl -p
- 修改主机名
# 192.168.77.129
[root@localhost ~]# hostnamectl manager
# 192.168.77.128
[root@localhost ~]# hostnamectl node2
# 192.168.77.132
[root@localhost ~]# hostnamectl node1
- 更改Hostname为 master、node1、node2,配置IP地址,配置3台测试机的/etc/hosts文件(在三台服务器上同步)
[root@manager ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.77.129 manager
192.168.77.128 node2
192.168.77.132 node1
- 时间校对(三台机器都做时间校对)
[root@manager ~]# yum install ntpdate
[root@manager ~]# ntpdate ntp1.aliyun.com
13 Sep 14:48:02 ntpdate[1596]: adjust time server 120.25.115.20 offset -0.015854 sec
# 查询时钟
[root@manager ~]# hwclock
2019年10月18日 星期五 15时15分07秒 -0.112326 秒
四、常见错误
- the number of available CPUs 1 is less than the required 2
CPU最少必须为2个。 - [ERROR CRI]: container runtime is not running: output: Cannot connect to the Docker daemon at tcp://0.0.0.0:2375. Is the docker daemon running?
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
将管理地址写入 /etc/profile:
echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
使profile生效:
source /etc/profile
- 节点为NotReady
Kubernetes-kubectl命令出现错误【The connection to the server localhost:8080 was refused - did you specif...
解决:
出现这个问题的原因是kubectl命令需要使用kubernetes-admin来运行,解决方法如下,将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后配置环境变量:
- kubectl error: The connection to the server localhost:8080 was refused
使用kuberadm搭建的集群环境,work节点 使用 kubectl查询资源报错
原因:
kubeadm搭建完环境之后会删除work节点上的admin.conf的认证配置文件,如果需要在work节点上使用kubectl查询资源,需要将master节点的admin.conf 拷贝到work节点
解决办法:
1.拷贝admin.conf至work
/etc/kubernetes/admin.conf