一、Kubernetes简介
在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应
用了很多年,Borg系统运行管理着成千上万的容器应用。
• Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收
了Borg系统中的经验和教训。
• Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,
将最终的应用服务交给用户。
** Kubernetes的好处**:

• 隐藏资源管理和错误处理,用户仅需要关注应用的开发。
• 服务高可用、高可靠。
• 可将负载运行在由成千上万的机器联合而成的集群中

1.1kubernetes设计架构
在这里插入图片描述
1.2Kubernetes主要由以下几个核心组件组成:

• etcd:         保存了整个集群的状态
• apiserver:    提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
• controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
• scheduler:    负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
• kubelet:      负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
• Container runtime:  负责镜像管理以及Pod和容器的真正运行(CRI)
• kube-proxy:         负责为Service提供cluster内部的服务发现和负载均衡

1.2.1除了核心组件,还有一些推荐的Add-ons:

• kube-dns:负责为整个集群提供DNS服务
• Ingress Controller:为服务提供外网入口
• Heapster:提供资源监控
• Dashboard:提供GUI
• Federation:提供跨可用区的集群
• Fluentd-elasticsearch:提供集群日志采集、存储与查询

1.3Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
在这里插入图片描述

核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
      1. Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
      2.Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

1.4Kubernetes基本概念之Name和NameSpace
在Kubernetes中,所有对象都会被指定一个唯一的Name和UID。
用户还可以指定一些不要求唯一性的数据附加到对象上,例如Label和Annotation。
1.4.1 Name
Name是创建一个Kubernetes对象时必须指定的,无论是Pod,ReplicaSet或者Deployment等等。如果通过REST API访问的话,形式就如/api/v1/pods/some-name。
一个Name只能由小写字母,-和.组成,并且长度不能超过253个字符。
在同一个命名空间下,同种类型的对象,其Name必须唯一。

1.4.2 UID
Kubernetes在创建一个对象时,除了拥有Name以外,还会为其分配一个全局唯一的UID。
1.4.3Kubernetes基本概念之Namespace
Namespace类似于Linux系统中用户的概念,通过将系统内部的对象分配到不同的Namespace中,形成逻辑上的分,便于不同的分组在共享集群资源的同时还能被分别管理。同一Namespace下的Kubenetes对象的Name必须唯一。
常见的 pod, service, replication controller 和 deployment 等都是属于某一个 namespace 的(默认是 default),而 node, persistent volume,namespace 等资源则不属于任何 namespace。

二、Kubernetes(k8s)的部署搭建流程
2.1基础实验环境

主机名        IP                   功能
server1    172.25.254.1        harbor仓库主要给k8s节点提供镜像源
server2    172.25.254.2        k8s:master节点:4G运行内存2个CPU
server3    172.25.254.3        k8s:节点(node1):2G运行内存2个CPU
server4    172.25.254.4        k8s:节点(node2):2G运行内存2个CPU
一个或者多个兼容 deb 或者 rpm 软件包的操作系统,比如 Ubuntu 或者 CentOS
每台机器 2 GB 以上的内存,内存不足时应用会受限制
主节点上 2 CPU 以上
集群里所有的机器有完全的网络连接,公有网络或者私有网络都可以

2.2harbor仓库
server1部署harbor仓库前面文章有具体部署过程
注意:最好配置(阿里云)镜像加速器(/etc/docker/daemon.json文件里面写入加速器地址),加快镜像下载速度,加速器地址就在aliyum镜像官网。

3.部署Kubernetes(k8s)
3.1关闭节点的selinux和iptables防火墙
3.2所有节点安装docker

软件包:在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  启动服务并设置开机自启

3.3.所有主机设置防火墙策略

cd /etc/sysctl.d/

vim bridge.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

 sysctl --system  刷新策略信息
 docker info查看

3.4在server1上传仓库认证文件到其他节点

[root@server1 reg.westos.org]# pwd
/etc/docker/certs.d/reg.westos.org
[root@server1 reg.westos.org]# scp ca.crt server2/3/4:

k8s官网
https://kubernetes.io/docs/setup/production- environment/container-runtimes/#docker
3.5所有节点创建dameon.json文件

vim /etc/docker/daemon.json

{                   cgroupdriver设置成systemd驱动保证docker和k8s使用相同的控制方式
  "exec-opts": ["native.cgroupdriver=systemd"], 
  "log-driver": "json-file", 
  "log-opts": {
  "max-size": "100m"
  }, "storage-driver": "overlay2", 
  "storage-opts": [
  "overlay2.override_kernel_check=true"
  ]
}
systemctl restart docker 记得重启docker服务
复制到其他节点
scp /etc/docker/daemon.json server2/3/4
重启服务:systemctl restart docker

3.6所有节点禁用swap分区:

wapoff -a
vim  /etc/fstab 
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
注释掉/etc/fstab文件中的swap定义

3.7安装部署软件kubeadm:


配置k8s所需的yum源并上传到其他节点
vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0

所有节点安装:
     kubelet:用来初始化集群的指令 
     kubeadm:在集群各个节点用来启动pod和容器 
     kubectl:用来与集群通信的命令工具(可以只装其中某一个节点;这里全装)
yum install -y kubelet kubeadm kubectl  
systemctl enable --now kubelet 启动并开机自启
kubeadm config print init-defaults  查看默认配置信息


默认从k8s.gcr.io上下载组件镜像,需要翻墙才可以,所以需要修改镜像仓库,改为国内的阿里云速度更快更安全:
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers 列出所需镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers  拉取镜像


    --pod-network-cidr=10.244.0.0/16    使用flannel网络组件时必须添加
    --kubernetes-version     指定k8s安装版本
    --image-repository   指定镜像仓库位置当前是aliyun的网站
    
上传到server1的harbor仓库
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的仓库路径
for i in `docker images | grep reg.westos.org | awk '{print $1":"$2}'`;do docker push $i; done上传镜像到harbor仓库
for i in `docker images | grep aliyuncs | awk '{print $1":"$2}'`;do docker rmi $i; done 删除之前拉取的阿里云镜像

在这里插入图片描述

在server2: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

3.8初始化master节点

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网络组件时必须添加

在这里插入图片描述
生成token和哈希码:当其他节点想要加入集群时必须使用此参数 ;但是token值只有24h之后无法在使用,过期之后需要重新生成token值方便其他主机加入集群,哈希码是固定的
节点扩容

在server3/4上执行命令加入集群
kubeadm join --token b3a32e.7cef20447b55261e 172.25.254.2:6443 -- discovery-token-ca-cert-hash sha256:bc718df41fdceb0db6c5380c7e27c204589b41dcb5f9a3bc52c254b707377f2f

kubeadm token list     查看token值
kubeadm token create   重新生成token
 查看查看 --discovery-token-ca-cert-hash 方法
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |  openssl dgst -sha256 -hex | sed 's/^.* //'

3.9安装flannel网络组件:

获取flannel网络组件地址:https://github.com/coreos/flannel
所有节点都配置及部署导入文件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml  安装网络组建
添加仓库的地址解析(172.25.254.1  reg.westos.org)
server2/3/4/:vim /etc/hosts
172.25.254.1 server1 reg.westos.org


在这里插入图片描述
4.0master节点查看状态:

[root@server2 ~]# kubectl get pod -n kube-system  必须全部为running时间稍有点缓慢耐心等待

在这里插入图片描述
4.1其他节点server3 、4会自动拉取镜像
在这里插入图片描述
在这里插入图片描述
4.2kubectl命令指南:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl- commands

kubectl get cs
kubectl get node
kubectl get pod -n kube-system

在这里插入图片描述
在这里插入图片描述
4.3在所有节点设置私有仓库指向位置

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://reg.westos.org"],                  
  "exec-opts": ["native.cgroupdriver=systemd"], 
  "log-driver": "json-file", 
  "log-opts": {
  "max-size": "100m"
  }, "storage-driver": "overlay2", 
  "storage-opts": [
  "overlay2.override_kernel_check=true"
  ]
}
systemc	restart docker 重启服务

4.3k8s的节点删除与恢复
在server2master上删除节点

[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   <none>   27h   v1.18.4
server4   Ready                      <none>   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    <none>   27h   v1.18.4
恢复重新加入加入节点
[root@server3 ~]# kubeadm reset  清除之前加入的信息
按照刚开始加入节点的方式重新加入即可
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐