01-08-k8s-概念以及kubeadm搭建
k8s-01-08
01-k8s-概念:
学习连接:https://www.bilibili.com/video/BV1GT4y1A756?p=1
中文官网:https://kubernetes.io/zh
中文社区:https://www.kubernetes.org.cn/
结构
-
K8s概念和架构
-
从零搭建K8s集群
- 基于客户端工具kubeadm搭建
- 基于二进制包方式
-
K8s核心概念
- Pod:K8s管理的最小单位级,是所有业务类型的基础
- Controller:控制器,有状态,无状态,一次任务,定时任务,守护进程
- Service Ingress:对外暴露端口
- RBAC:安全机制,权限模型
- Helm:下载机制
- 持久化存储
-
搭建集群监控平台系统
-
从零搭建高可用K8s集群
-
在集群环境部署项目
1、概念
1.1、K8S概述
kubernetes。用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
1.2、K8S功能
1、自动装箱、自我修复,水平扩展,服务发现、滚动更新、版本回退、密钥和配置管理、存储编排、批处理
1)、自动装箱
基于容器对应用运行环境的资源配置要求自动部署应用容器
2)、自我修复(自愈能力)
当容器失败时,会对容器进行重启
当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
服务1宕机后,会使用服务2进行继续提供服务,但是服务2如果没有完全启动,不会对外提供服务
如果某个服务器上的应用不响应了,Kubernetes会自动在其它的地方创建一个
3)、水平扩展
通过简单的命令、用户UI 界面或基于CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
当我们有大量的请求来临时,我们可以增加副本数量,从而达到水平扩展的效果
当黄色应用过度忙碌,会来扩展一个应用
4)、服务发现
用户不需使用额外的服务发现机制,就能够基于Kubernetes 自身能力实现服务发现和负载均衡
对外提供统一的入口,让它来做节点的调度和负载均衡, 相当于微服务里面的网关?
5)、滚动更新
可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
添加应用的时候,不是加进去就马上可以进行使用,而是需要判断这个添加进去的应用是否能够正常使用
6)、版本回退
可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
类似于Git中的回滚
7)、密钥和配置管理
在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
8)、存储编排
自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
9)、批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景
1.3、K8S架构组件
架构图
K8S架构主要包含两部分:Master(主控节点)和 node(工作节点)
master节点架构图
Node节点架构图
k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
-
master:主控节点
- API Server:集群统一入口,以restful风格进行操作,同时交给etcd存储
- 提供认证、授权、访问控制、API注册和发现等机制
- scheduler:节点的调度,选择node节点应用部署
- controller-manager:处理集群中常规后台任务,一个资源对应一个控制器
- etcd:存储系统,用于保存集群中的相关数据
- API Server:集群统一入口,以restful风格进行操作,同时交给etcd存储
-
Work node:工作节点
- Kubelet:master派到node节点代表,管理本机容器
- 一个集群中每个节点上运行的代理,它保证容器都运行在Pod中
- 负责维护容器的生命周期,同时也负责Volume(CSI) 和 网络(CNI)的管理
- kube-proxy:提供网络代理,负载均衡等操作
- Kubelet:master派到node节点代表,管理本机容器
-
容器运行环境【Container Runtime】
- 容器运行环境是负责运行容器的软件
- Kubernetes支持多个容器运行环境:Docker、containerd、cri-o、rktlet以及任何实现Kubernetes CRI (容器运行环境接口) 的软件。
-
fluentd:是一个守护进程,它有助于提升 集群层面日志
1.4、核心概念
1)、Pod
- Pod是K8s中最小的单元
- 一组容器的集合
- 共享网络【一个Pod中的所有容器共享同一网络】
- 生命周期是短暂的(服务器重启后,就找不到了)
2)、Volume
- 声明在Pod容器中可访问的文件目录
- 可以被挂载到Pod中一个或多个容器指定路径下
- 支持多种后端存储抽象【本地存储、分布式存储、云存储】
3)、Controller
- 确保预期的pod副本数量【ReplicaSet】
- 无状态应用部署【Deployment】
- 无状态就是指,不需要依赖于网络或者ip
- 有状态应用部署【StatefulSet】
- 有状态需要特定的条件
- 确保所有的node运行同一个pod 【DaemonSet】
- 一次性任务和定时任务【Job和CronJob】
4)、Deployment
- 定义一组Pod副本数目,版本等
- 通过控制器【Controller】维持Pod数目【自动回复失败的Pod】
- 通过控制器以指定的策略控制版本【滚动升级、回滚等】
5)、Service
- 定义一组pod的访问规则
- Pod的负载均衡,提供一个或多个Pod的稳定访问地址
- 支持多种方式【ClusterIP、NodePort、LoadBalancer】
可以用来组合pod,同时对外提供服务
6)、Label
label:标签,用于对象资源查询,筛选
7)、Namespace,命名空间,逻辑隔离
- 一个集群内部的逻辑隔离机制【鉴权、资源】
- 每个资源都属于一个namespace
- 同一个namespace所有资源不能重复
- 不同namespace可以资源名重复
8)、API
通过Kubernetes的API来操作整个集群
同时可通过 kubectl 、ui、curl 最终发送 http + json/yaml 方式的请求给API Server,然后控制整个K8S集群,K8S中所有的资源对象都可以采用 yaml 或 json 格式的文件定义或描述
如下:使用yaml部署一个nginx的pod
完整流程
- 通过Kubectl提交一个创建RC(Replication Controller)的请求,该请求通过APlserver写入etcd
- 此时Controller Manager通过API Server的监听资源变化的接口监听到此RC事件
- 分析之后,发现当前集群中还没有它所对应的Pod实例
- 于是根据RC里的Pod模板定义一个生成Pod对象,通过APIServer写入etcd
- 此事件被Scheduler发现,它立即执行执行一个复杂的调度流程,为这个新的Pod选定一个落户的Node,然后通过API Server讲这一结果写入etcd中
- 目标Node上运行的Kubelet进程通过APiserver监测到这个"新生的Pod.并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束
- 随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求
- ControllerManager通过Label标签查询到关联的Pod实例,然后生成Service的Endpoints信息,并通过APIServer写入到etod中,
- 接下来,所有Node上运行的Proxy进程通过APIServer查询并监听Service对象与其对应的Endponts信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能
2、kubernetes 集群(kubeadm搭建)
2.1安装规划和要求
1、单个master节点,然后管理多个node节点
2、多个master节点,管理多个node节点,同时中间多了一个负载均衡的过程
安装要求:(测试master:2核 4G 20G;node:4核 8G 40G)(master:8核 16G 100G;node:16核 64G 200G)
部署Kubernetes集群机器需要满足以下几个条件
- 一台或多台机器,操作系统为Centos7.X
- 硬件配置:2GB或更多GAM,2个CPU或更多CPU,硬盘30G
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap分区
2.2、搭建
1)、准备,需要有linux,至少三台虚拟机,docker等相关知识。参考:bilibili尚硅谷,很多视频自己搜
角色 | ip |
---|---|
master | 192.168.10.102 |
node1 | 192.168.10.103 |
node1 | 192.168.10.104 |
2)、需要在三台机器上都执行如下命令
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
setenforce 0 # 临时关闭
# 关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname hadoop102
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname hadoop103
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname hadoop104
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
3)、所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker
安装Docker:首先配置一下Docker的阿里yum源
cat >/etc/yum.repos.d/docker.repo<<EOF
[docker-ce-edge]
name=Docker CE Edge - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/\$basearch/edge
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
然后yum方式安装docker
# yum安装
yum -y install docker-ce
# 查看docker版本
docker --version
# 启动docker
systemctl enable docker
systemctl start docker
配置docker的镜像源
cat >> /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
然后重启docker
systemctl restart docker
systemctl status docker
4)、添加kubernetes软件源
需要配置一下yum的k8s软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
5)、安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet
6)、部署Kubernetes Master【master节点】
在 192.168.177.130 执行,也就是master节点
kubeadm init --apiserver-advertise-address=192.168.10.102 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
#由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,可以通过docker images 命令即可查看已经拉取的镜像
当我们出现下面的情况时,表示kubernetes的镜像已经安装成功
使用kubectl工具 【master节点操作】
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行完成后,我们使用下面命令,查看我们正在运行的节点
kubectl get nodes
发现目前有一个master节点已经运行了,但是还处于未准备状态
继续需要在Node节点执行其它的命令,将node1和node2加入到master节点上
下面我们需要到 node1 和 node2服务器,执行下面的代码向集群添加新节点
执行在kubeadm init输出的kubeadm join命令:
注,以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的
kubeadm join 192.168.10.102:6443 --token 3wlj8z.dgml5pxqxuk5xhsx \
--discovery-token-ca-cert-hash sha256:36a7770f040b02bf43d92bfdb49fe9ea57460d4959f1025f9069676598893cb2
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下;
kubeadm token create --print-join-command
再次查看运行情况,发现node和master关联起来了 kubectl get nodes
上面三个节点的状态都是是NotReady,需要网络插件CNI,来进行联网访问
7)、部署CNI网络插件
https://www.cnblogs.com/pyxuexi/p/14288591.html
https://blog.csdn.net/m0_49217529/article/details/110557431
查看kube-flannel.yml
文件时发现quay.io/coreos/flannel:v0.12.0-amd64
quay.io
网站目前国内无法访问
下载flannel:v0.12.0-amd64
导入到docker中
可以去https://github.com/coreos/flannel/releases
官方仓库下载镜像
docker load < flanneld-v0.12.0-amd64.docker
kubectl get pod -n kube-system
#第一步,在master节点删除flannel
kubectl delete -f kube-flannel.yml
#重新安装
kubectl apply -f kube-flannel.yml
# 下载网络插件配置
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。?????这块安装CNI一直有问题。无法下载访问
#vim /etc/hosts 参考链接:https://www.cnblogs.com/weiyili/p/14150656.html
使用wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
下载flannnel,总是报Unable to establish SSL connection 按照网上的提示加了--no-check-certificat也没用,而且我的wget也已经是最新版
http://www.bubuko.com/infodetail-3426570.html
具体原因就是raw.githubusercontent.com 这个域名解析被污染了,无法访问
https://www.ipaddress.com/ 进入这个网站,查询raw.githubusercontent.com的ip地址为199.232.96.133,在/etc/hosts中增加一行
199.232.96.133 raw.githubusercontent.com
保存,再使用wget http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 就能获取到flannel.yml了
185.199.108.133 raw.githubusercontent.com
# 添加
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看状态 【kube-system是k8s中的最小单元】
kubectl get pods -n kube-system
第一种解决方法
在wget后面添加"–no-check-certificate"如下所示:
# wget --no-check-certificate http://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
第二种解决办法
安装ca-certificates
# yum install ca-certificates -y
或者是w
# yum install ssl-cert -y
运行后的结果
运行完成后,我们查看状态可以发现,已经变成了Ready状态了
如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除
# master节点将该节点删除
#kubectl drain k8snode1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8snode1
# 然后到k8snode1节点进行重置
kubeadm reset
# 重置完后在加入
kubeadm join 192.168.10.102:6443 --token 3wlj8z.dgml5pxqxuk5xhsx \
--discovery-token-ca-cert-hash sha256:36a7770f040b02bf43d92bfdb49fe9ea57460d4959f1025f9069676598893cb2
2.3、测试kubernetes集群
K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:
# 下载nginx 【会联网拉取nginx镜像】
kubectl create deployment nginx --image=nginx
# 查看状态
kubectl get pod
如果我们出现Running状态的时候,表示已经成功运行了
将端口暴露出去,让其它外界能够访问
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看一下对外的端口
kubectl get pod,svc
能够看到,我们已经成功暴露了 80端口 到 30529上
宿主机浏览器上,访问如下地址:http://Nodeip:30529/ 将看到nginx的welcome to nginx!页面,注意是node的ip不是master的ip
3、可能遇见的错误
(安装过程中只在CNI网络急忙无法下载):参考https://gitee.com/moxi159753/LearningNotes/tree/master/K8S
1、错误一
在执行Kubernetes init方法的时候,出现这个问题
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
是因为VMware设置的核数为1,而K8S需要的最低核数应该是2,调整核数重启系统即可
2、错误二
我们在给node1节点使用 kubernetes join命令的时候,出现以下错误
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR Swap]: running with swap on is not supported. Please disable swap
错误原因是我们需要关闭swap
# 关闭swap
# 临时
swapoff -a
# 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab
3、错误三
在给node1节点使用 kubernetes join命令的时候,出现以下错误
The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused
解决方法,首先需要到 master 节点,创建一个文件
# 创建文件夹
mkdir /etc/systemd/system/kubelet.service.d
# 创建文件
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 添加如下内容
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --fail-swap-on=false"
# 重置
kubeadm reset
然后删除刚刚创建的配置目录
rm -rf $HOME/.kube
然后 在master重新初始化
kubeadm init --apiserver-advertise-address=202.193.57.11 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
初始完成后,我们再到 node1节点,执行 kubeadm join命令,加入到master
kubeadm join 202.193.57.11:6443 --token c7a7ou.z00fzlb01d76r37s \
--discovery-token-ca-cert-hash sha256:9c3f3cc3f726c6ff8bdff14e46b1a856e3b8a4cbbe30cab185f6c5ee453aeea5
添加完成后,我们使用下面命令,查看节点是否成功添加
kubectl get nodes
4、错误四
我们再执行查看节点的时候, kubectl get nodes 会出现问题
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
这是因为我们之前创建的配置文件还存在,也就是这些配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
我们需要做的就是把配置文件删除,然后重新执行一下
rm -rf $HOME/.kube
然后再次创建一下即可
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
这个问题主要是因为我们在执行 kubeadm reset 的时候,没有把 $HOME/.kube 给移除掉,再次创建时就会出现问题了
5、错误五
安装的时候,出现以下错误
Another app is currently holding the yum lock; waiting for it to exit...
是因为yum上锁占用,解决方法
yum -y install docker-ce
6、错误六
在使用下面命令,添加node节点到集群上的时候
kubeadm join 192.168.177.130:6443 --token jkcz0t.3c40t0bqqz5g8wsb --discovery-token-ca-cert-hash sha256:bc494eeab6b7bac64c0861da16084504626e5a95ba7ede7b9c2dc7571ca4c9e5
然后出现了这个错误
[root@k8smaster ~]# kubeadm join 192.168.177.130:6443 --token jkcz0t.3c40t0bqqz5g8wsb --discovery-token-ca-cert-hash sha256:bc494eeab6b7bac64c0861da16084504626e5a95ba7ede7b9c2dc7571ca4c9e5
W1117 06:55:11.220907 11230 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。也就是说 /proc/sys/net/ipv4/ip_forward 文件的值不支持转发
- 0:禁止
- 1:转发
所以我们需要将值修改成1即可
echo “1” > /proc/sys/net/ipv4/ip_forward
修改完成后,重新执行命令即可
7、错误7
kubeadm join 202.193.57.11:6443 --token c7a7ou.z00fzlb01d76r37s
–discovery-token-ca-cert-hash sha256:9c3f3cc3f726c6ff8bdff14e46b1a856e3b8a4cbbe30cab185f6c5ee453aeea5
解决:参考:https://blog.csdn.net/chengluchuang2753/article/details/118963816
swapoff -a
kubeadm reset
systemctl daemon-reload
systemctl restart kubelet
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
8、错误8
参考:https://blog.csdn.net/qq_44895681/article/details/107414231
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR Port-6443]: Port 6443 is in use
[ERROR Port-10251]: Port 10251 is in use
[ERROR Port-10252]: Port 10252 is in use
[root@hadoop02~]# kubeadm reset //重启kubeadm
[reset] WARNING: changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] are you sure you want to proceed? [y/N]: y //输入y
查看日志journalctl -xefu kubelet
或者 tail -100f /var/log/messages|grep kube
9、错误9
[failed to find plugin “portmap” in path [/opt/cni/bin]]
3月 06 15:15:11 hadoop102 kubelet[732]: W0306 15:15:11.393023 732 cni.go:237] Unable to update cni config: no valid networks found in /etc/cni/net.d
3月 06 15:15:11 hadoop102 kubelet[732]: E0306 15:15:11.567057 732 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230
更多推荐
所有评论(0)