Kubernetes(K8S)概述
- Kubernetes又称作k8s,是Google在2014年发布的一个开源项目 。
- 最初Google开发了一个叫Borg的系统(现在命名为Omega),来调度近20多亿个容器 。在积累了数十年的经验后,Google决定重写这个容器管理系统,并贡献给开源社区, 而这个系统就是Kubernetes 。它也是Omega的开源版本 。
- 从2014年第一个版本发布以来,迅速得到了开源社区的追捧,目前,k8s已经成为了 发展最快、市场占有率最高的容器编排引擎产品 。
- Kubernetes中文社区 | 中文文档 https://www.kubernetes.org.cn/k8s
vim /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 安装minikubecurl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube 安装kubectlcurl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl chmod +x ./kubectl #赋予操作权限sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 安装conntrackyum install conntrack 我们先操作一波 启动minikubeminikube start --vm-driver=none --image-mirror-country='cn' 启动minkube报错解决Minikube不能成功启动的报错分析及解决方案Minikube启动前需要对系统环境进行初始化:启用docker服务
sudo systemctl enable docker.service关闭防火墙sudo systemctl stop firewalld关闭内存交换sudo swapoff -a修改为cgroupfscat > /etc/docker/daemon.json <<EOF{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": { "max-size": "100m"},"storage-driver": "overlay2"}EOF重新加载配置systemctl daemon-reload重启dockersystemctl restart docker关闭selinuxsudo setenforce 0文件权限sudo chmod -R 777 /etc/kubernetes/addons/启动kubelet服务,注意:可能需要第一次允许minikube start后才会拉取kubeletsystemctl enable kubelet.service初始化时的报警:1.在使用kubeadm init命令初始化节点刚开始时,会有如下的perflight阶段,该阶段会进行检查,如果其中出现了如下WARNING并且初始化失败了 。下面会对下述几个警告进行解决:
kubeadm init ...[init] Using Kubernetes version: v1.15.0[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/[WARNING FileExisting-socat]: socat not found in system pathWARNING IsDockerSystemdCheck解决办法:修改或创建/etc/docker/daemon.json,加入下述内容:
{"exec-opts": ["native.cgroupdriver=systemd"]}重启docker:systemctl daemon-reloadsystemctl restart docker查看修改后的状态:docker info | grep Cgroup2.WARNING FileExisting-socatsocat是一个网络工具, k8s 使用它来进行 pod 的数据交互,出现这个问题直接安装socat即可:
yum install -y socat3.WARNING Firewalld[WARNING Firewalld]: firewalld is active, please ensure ports [8443 10250] are open or your cluster may not function correctly
解决办法:
##暂时关闭防火墙systemctl stop firewalld.service##永久关闭systemctl disable firewalld.service4.WARNING Service-Docker[WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
解决办法:
systemctl enable docker.service5.WARNING Service-Kubelet[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
解决办法:
systemctl enable kubelet.service6.WARNING Swap[WARNING Swap]: running with swap on is not supported. Please disable swap
解决办法:
swapoff -a7.SELINUX未关闭Problems detected in kube-addon-manager [13ce287ce3f6]:
error: Error loading config file "/var/lib/minikube/kubeconfig": open /var/lib/minikube/kubeconfig: permission denied
error: Error loading config file "/var/lib/minikube/kubeconfig": open /var/lib/minikube/kubeconfig: permission denied
error: Error loading config file "/var/lib/minikube/kubeconfig": open /var/lib/minikube/kubeconfig: permission denied
解决办法:
setenforce 0或尝试永久关闭SELINUX8.
ERROR FileContent–proc-sys-net-bridge-bridge-nf-call-iptables[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决办法:
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables停止minikubeminikube stop 查看所有deploymentkubectl get deployment 查看所有podkubectl get pods 查看节点[root@VM-12-15-centos download]` kubectl get nodesNAMESTATUSROLESAGEVERSIONvm-12-15-centosReadycontrol-plane,master79mv1.23.1【解释】node是?于承载运行中的容器的 。
有?个node,这个node的角?是master 。
k8s也有集群的概念,即:cluster,包含master和node,该节点即是master节点,?是node节点 。
创建nginx的deployment
[root@zhaowa-edu-01 ~]` kubectl create deployment my-nginx --image nginx:latestdeployment.apps/my-nginx created【解释】创建deployment其实有两种?式
1.基于命令行配置运行
kubectl create
kubectl run
- 基于yaml配置文件的
查看所有pod信息以及ip和port
[root@zhaowa-edu-01 ~]` kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmy-nginx-b7d7bc74d-jgfks 1/1 Running 0 7m35s 172.18.0.3 zhaowa-edu-01 <none> <none>查看所有service[root@zhaowa-edu-01 ~]` kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h【解释】pod是不稳定的 。服务可以保证稳定 。
双十?之前,订单系统需要20个服务实例,双??促销阶段,扩容?100个服务实例 。双?之后,对服务缩容?30个服务实例 。
我们是?个稳定的请求?式,统?个ip的 。这个就是service的作用 。
查询所有命名空间
[root@zhaowa-edu-01 ~]` kubectl get namespaceNAME STATUS AGEdefault Active 21hkube-node-lease Active 21hkube-public Active 21hkube-system Active 21h【解释】默认的就是defalut 。
其它kube-*的都是k8s系统??的命名空间 。
将副本数(pod)从1个修改为3个
[root@zhaowa-edu-01 ~] ` kubectl scale deployments/my-nginx --replicas=3deployment.apps/my-nginx scaled[root@zhaowa-edu-01 ~] ` kubectl get deployNAME READY UP-TO-DATE AVAILABLE AGEmy-nginx 1/3 3 1 19m[root@zhaowa-edu-01 ~] ` kubectl get podsNAME READY STATUS RESTARTS AGEmy-nginx-b7d7bc74d-jgfks 1/1 Running 0 19mmy-nginx-b7d7bc74d-r9gsg 0/1 ContainerCreating 0 17smy-nginx-b7d7bc74d-vr958 0/1 ContainerCreating 0 17s【解释】什么是副本个数?
pod的个数
如果我们不指定副本个数的话,那么默认就是?个pod
将副本数(pod)从3个修改为2个
[root@zhaowa-edu-01 ~] ` kubectl scale deployments/my-nginx --replicas=2deployment.apps/my-nginx scaled[root@zhaowa-edu-01 ~]` kubectl get deployNAME READY UP-TO-DATE AVAILABLE AGEmy-nginx 2/2 2 2 22m[root@zhaowa-edu-01 ~]` kubectl get podNAME READY STATUS RESTARTS AGEmy-nginx-b7d7bc74d-jgfks 1/1 Running 0 22mmy-nginx-b7d7bc74d-r9gsg 1/1 Running 0 2m39sk8s重要概念介绍组件名称作用Cluster资源的集合 。我们的k8s利?这些资源运?各种基于容器的应用 。是计算、存储和网络资源的集合MasterCluster的?脑 。司令部 。主要的任务就是用来调度的 。决定我们的应用应该放到哪?去执行 。为了高可?,也可以运?多个master 。职责是运行容器应用 。Node来负责运?容器应? 。Node是由Master去管理的,负责监控和容器状态的汇报 。Podk8s的最小工作单元,包含1orN个容器 。
Pod的使用方式:
?个pod运??个容器
最常?的就是这种情况 。
?个pod运?多个容器
?定是非常紧密相关的?组容器,并且需要资源的共享 。?起启动、?起停止 。Controllerk8s通过它来管理Pod
包含:Deployment、ReplicaSet、DaemonSet、StatefulSet、Job 。
Deployment就是我们最常?的Controller 。它可以管理Pod的多个副本 。(即:--replicas=3),并且可以确保Pod按照期望的状态去运? 。
ReplicaSet它也是管理Pod的多个副本 。
我们使?deployment的时候,会?动的创建ReplicaSet,最终是有ReplicaSet去创建的pod,而我们并不是去直接的使?它 。
DaemonSet?于每个Node最多只运??个Pod副本的创建 。
StatefulSet保证副本按照固定的顺序启动、更新、删除 。Service为Pod提供了负载均衡、固定的IP和Port
pod是不稳定的,ip会变化的 。所以我们需要?个固定的ip或port 。
区别:
Controller ——> 负责k8s运行容器的 。
Service ——> 负责k8s访问容器的 。Namespace解决同一个Cluster中,如何区别分开Controller、Pod等资源的问题,资源隔离!kubernetes架构k8s架构图

文章插图
重要概念
当我们执行部署应用并指定两个副本的时候,执行流程如下所示:
- Kuberctl发送部署请求到API Server 。
- API Server通知Controller Manager创建一个deployment资源 。
- Scheduler执行调度任务,将两个副本Pod分发到node1和node2上 。
- node1和node2上的kubelet在各自的节点上创建并运行Pod 。
下面我们来针对这两部分进行详细的介绍 。
Master
- API-Server
接收对应的指令 。
- Scheduler
- Controller Manager
- etcd
如果数据发?了变化,etcd会快速通知相关的组件 。

文章插图
Node
- kubelet
- kube-proxy
如果对于多个副本,它会实现负载均衡 。

文章插图
Deployment创建资源的方式
- 方式一
比如:kubectl run nginx-deployment--image=nginx:1.7.9--replicas=2
在命令行中通过参数指定资源的属性 。(但是,在K8S v1.18.0以后,–replicas已弃用 ,推荐用 kubectl apply 创建 pods)
- 方式二
步骤:
1.编写yml配置文件 。(下一页有书写样例,nginx.yml)
2.执行命令:kubectl apply -f /home/muse/nginx.yml
nginx.yml配置文件
- replicas: 2
- metadata:
- spec:

文章插图
构建过程解析用户通过kubectl——>创建Deployment——>创建ReplicaSet——>创建Pod

文章插图
Failover设置了pod数为3个
当Node1异常的时候,会在Node2上面生成新的Pod来维护总数为3个pod
当Node1恢复正常的时候,新创建的pod也依然会在Node2上,并不会做迁移动作 。

文章插图
label默认配置下,Scheduler会将Pod调度到所有可用的Node 。不过有些情况我们可以通过lable将Pod部署到指定的Node,比如将有大量磁盘I/O的Pod部署到配置了SSD的 Node;或者Pod需要GPU,需要运行在配置了GPU的节点上 。
- 给k8s-node1添加标签——disktype=ssd
kubectl label node k8s-node1disktype=ssd - 修改nginx.yml配置文件,指定nodeSelector为上一步新建的label 。
nodeSelector:disktype: ssd - 重新部署Deployment
kubectl apply -f nginx.yml - 查看节点的标签信息
kubectl get node --show-labels[root@zhaowa-edu-01 k8sConfigFiles]# kubectl get nodeNAME STATUS ROLES AGE VERSIONzhaowa-edu-01 Ready control-plane,master 22h v1.20.2[root@zhaowa-edu-01 k8sConfigFiles]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELSzhaowa-edu-01 Ready control-plane,master 22h v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=zhaowa-edu-01,kubernetes.io/os=linux,minikube.k8s.io/commit=b017ea15ffbf8bcd6ce31e13ba16f59fd4091079,minikube.k8s.io/name=minikube,minikube.k8s.io/updated_at=2021_09_18T13_04_08_0700,minikube.k8s.io/version=v1.20.0,node-role.kubernetes.io/control-plane=,noderole.kubernetes.io/master=[root@zhaowa-edu-01 k8sConfigFiles]# kubectl label node zhaowa-edu-01 disktype=ssdnode/zhaowa-edu-01 labeled[root@zhaowa-edu-01 k8sConfigFiles]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELSzhaowa-edu-01 Ready control-plane,master 22h v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=zhaowa-edu-01,kubernetes.io/os=linux,minikube.k8s.io/commit=b017ea15ffbf8bcd6ce31e13ba16f59fd4091079,minikube.k8s.io/name=minikube,minikube.k8s.io/updated_at=2021_09_18T13_04_08_0700,minikube.k8s.io/version=v1.20.0,node-role.kubernetes.io/control-plane=,noderole.kubernetes.io/master=[root@zhaowa-edu-01 k8sConfigFiles]# kubectl label node zhaowa-edu-01 disktypenode/zhaowa-edu-01 labeled[root@zhaowa-edu-01 k8sConfigFiles]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELSzhaowa-edu-01 Ready control-plane,master 22h v1.20.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=zhaowa-edu-01,kubernetes.io/os=linux,minikube.k8s.io/commit=b017ea15ffbf8bcd6ce31e13ba16f59fd4091079,minikube.k8s.io/name=minikube,minikube.k8s.io/updated_at=2021_09_18T13_04_08_0700,minikube.k8s.io/version=v1.20.0,node-role.kubernetes.io/control-plane=,noderole.kubernetes.io/master=删除deployment假设现在配置的是2个pod数 。那么如果我们只是删除其中的一个pod,依然会被deployment根据配置,再补充为2个pod 。- 当我们删除掉deployment的时候,pod也会随之自动被删除 。
- 删除pod
kubectl delete pod nginx-deployment-7f4fc68488-5v4m7 - 删除deployment
kubectl delete deployment nginx-deployment
- 删除pod
Daemonsetl的不同之处在于:每个Node上最多只能运行一个副本 。
Daemon Set的典型应用场景
1.在每个节点上运行存储 Daemon,比如 glusterd或 ceph
2.在每个节点上运行日志收集 Daemon,如 flunentdi或 logstashe
3.在毎个节点上运行监控 Daemon,比如 Prometheus Node Exporter或 collectd
查看k8s自己就用 Daemonsetie运行系统组件

文章插图
Job容器按照持续运行时间,可以分为服务类容器和工作类容器 。
- 服务类容器通常持续提供服务,需 要一直运行,比如HTTP Server、Daemon等 。
- 工作类容器则是一次性任务,比如批处理程序,完成后容器就退出 。
对于工作类容器,我们使用Job 。

文章插图
Service
- 我们不应该期望Pod是健壮的,而是要假设Pod中的容器很可能因为各种原因发生故障而死掉 。
- Deployment等Controller会通过动态创建和销毁Pod来保证应用整体的健壮性 。换句话说,Pod是脆弱的,但应用是健壮的 。
- Service提供了固定的ip和端口,并且里面包含一组pod,即使Pod的ip发生变化,但是面对客户端的是Service的固定ip和端口 。

文章插图
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
