k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s。
k8s最初是在Google公司内部使用了10多年的技术,它的前身是叫做Borg(博格),直到2015年才被Google公司捐赠为开源项目。
在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应 用了很多年,Borg系统运行管理着成千上万的容器应用。
- Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收 了Borg系统中的经验和教训。
- Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合, 将最终的应用服务交给用户。
• 隐藏资源管理和错误处理,用户仅需要关注应用的开发。
• 服务高可用、高可靠。
• 可将负载运行在由成千上万的机器联合而成的集群中
etcd | 保存了整个集群的状态 |
---|---|
apiserver | 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现 等机制 |
controller manager | 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等 |
scheduler | 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上 |
kubelet | 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理 |
Container runtime | 负责镜像管理以及Pod和容器的真正运行(CRI) |
kube-proxy | 负责为Service提供cluster内部的服务发现和负载均衡 |
kube-dns | 负责为整个集群提供DNS服务 |
---|---|
Ingress Controller | 为服务提供外网入口 |
Heapster | 提供资源监控 |
Dashboard | 提供GUI |
Federation | 提供跨可用区的集群 |
Fluentd-elasticsearch | 提供集群日志采集、存储与查询 |
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
• 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件 式应用执行环境
• 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服 务发现、DNS解析等)
• 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动 态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
• 接口层:kubectl命令行工具、客户端SDK以及集群联邦
• 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范 畴
• Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、 OTS应用、ChatOps等
• Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身 的配置和管理等
k8s官网
https://kubernetes.io/docs/setup/production- environment/container-runtimes
主机名 IP 功能
server1 172.25.11.101 harbor仓库主要给k8s节点提供镜像源
server2 172.25.11.102 k8s:master节点:4G运行内存2个CPU
server3 172.25.11.103 k8s:节点(node1):2G运行内存2个CPU
server4 172.25.11.104 k8s:节点(node2):2G运行内存2个CPU
server1部署harbor仓库前面文章有具体部署过程
注意:最好配置(阿里云)镜像加速器(/etc/docker/daemon.json文件里面写入加速器地址),加快镜像下载速度,加速器地址就在aliyum镜像官网。
软件包:在aliyun的开源镜像网站查找docker
containerd.io-1.2.13-3.1.el7.x86_64.rpm
docker-ce-19.03.8-3.el7.x86_64.rpm
docker-ce-cli-19.03.8-3.el7.x86_64.rpm
解决依赖性:https://centos.pkgs.org/7/centos-extras-armhfp/container-selinux-2.107-3.el7.noarch.rpm.html
container-selinux-2.77-1.el7.noarch.rpm 安装过程解决依懒性(注意版本号)
systemctl enable --now docker 启动服务并设置开机自启
[root@server1 reg.westos.org]# pwd
/etc/docker/certs.d/reg.westos.org
[root@server1 reg.westos.org]# scp ca.crt server2/3/4:
systemctl restart docker 记得重启docker服务
复制到其他节点:scp /etc/docker/daemon.json server2/3/4
重启服务:systemctl restart docker
swapoff -a
vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
注释掉/etc/fstab文件中的swap定义
scp /etc/yum.repos.d/k8s.repo server2/3/4
kubelet | 用来初始化集群的指令 |
---|---|
kubeadm | 在集群各个节点用来启动pod和容器 |
kubectl | 用来与集群通信的命令工具(可以只装其中某一个节点;这里全装) |
默认从k8s.gcr.io上下载组件镜像,需要才可以,所以需要修改镜像仓库:
for i in `docker images | grep aliyuncs| awk '{print $1":"$2}' | awk -F / '{print $3}'`;do docker
tag registry.aliyuncs.com/google_containers/$i reg.westos.org/library/$i ; done
修改镜像标签为server1的仓库路径
先登录habor仓库
docker login westos.org
for i in `docker images | grep reg.westos.org`;do docker push reg.rwestos.org/library/$i; done
上传镜像到harbor仓库
for i in `docker images | grep aliyuncs | awk '{print $1":"$2}'`;do docker rmi $i; done
删除之前拉取的阿里云镜像
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org/library 初始化集群集群
--pod-network-cidr=10.244.0.0/16:指定flannel网络组件时必须添加
cpu不能为单核,不然会失败。
生成token和哈希码:当其他节点想要加入集群时必须使用此参数 ;但是token值只有24h之后无法在使用,过期之后需要重新生成token值方便其他主机加入集群,哈希码是固定的
在server1:master节点配置kubectl
useradd kubeadm 创建此用户并做权限下放
visudo 编辑权限下放
kubeadm ALL=(ALL) NOPASSWD: ALL
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
若是使用超级用户将此.kube/config目录复制到root家目录下
配置kubectl命令补齐功能:
echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@server2 ~]# kubectl drain server3 --delete-local-data --force --ignore-daemonsets 删除节点
node/server3 cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-flannel-ds-amd64-95cp4, kube-system/kube-proxy-cl7lr
node/server3 drained
[root@server2 ~]# kubectl get node 查看还存在集群当中
NAME STATUS ROLES AGE VERSION
server2 Ready master 28h v1.18.4
server3 Ready,SchedulingDisabled 27h v1.18.4
server4 Ready 27h v1.18.4
[root@server2 ~]# kubectl delete node server3 彻底删除
node "server3" deleted
[root@server2 ~]# kubectl get node 查看已经删除
NAME STATUS ROLES AGE VERSION
server2 Ready master 28h v1.18.4
server4 Ready 27h v1.18.4
[root@server3 ~]# kubeadm reset 清除之前加入的信息
按照刚开始加入节点的方式重新加入即可