一、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
[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
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 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 清除之前加入的信息
按照刚开始加入节点的方式重新加入即可