K8S的安装部署以及基础知识
Kubernetes(K8S)概述
Kubernetes又称作k8s,是Google在2014年发布的一个开源项目。
最初Google开发了一个叫Borg的系统(现在命名为Omega),来调度近20多亿个容器。 在积累了数十年的经验后,Google决定重写这个容器管理系统,并贡献给开源
社区, 而这个系统就是Kubernetes。它也是Omega的开源版本。
从2014年第一个版本发布以来,迅速得到了开源社区的追捧,目前,k8s已经成为了 发展最快、市场占有率最高的容器编排引擎产品。
Kubernetes中文社区 | 中文文档 https://www.kubernetes.org.cn/k8s
安装minikube
设置阿里云镜像
vim /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0
安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/local/bin/minikube
安装kubectl
curl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectlchmod +x ./kubectl #赋予操作权限sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
安装conntrack
yum install conntrack 我们先操作一波
启动minikube
minikube start --vm-driver=none --image-mirror-country='cn'
启动minkube报错解决
Minikube不能成功启动的报错分析及解决方案
Minikube启动前需要对系统环境进行初始化:启用docker服务
sudo systemctl enable docker.service关闭防火墙
sudo systemctl stop firewalld关闭内存交换
sudo swapoff -a修改为cgroupfs
cat > /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重启docker
systemctl restart docker关闭selinux
sudo setenforce 0文件权限
sudo chmod -R 777 /etc/kubernetes/addons/启动kubelet服务,注意:可能需要第一次允许minikube start后才会拉取kubelet
systemctl 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 path
WARNING 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或尝试永久关闭SELINUX
8.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
停止minikube
minikube stop
查看所有deployment
kubectl get deployment
查看所有pod
kubectl get pods
查看节点
[root@VM-12-15-centos download]` kubectl get nodesNAME STATUS ROLES AGE VERSIONvm-12-15-centos Ready control-plane,master 79m v1.23.1
【解释】
node是⽤于承载运行中的容器的。
有⼀个n
ode,这个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配置文件的
kubectl apply -f xxx.yml
查看所有pod信息以及ip和port
[root@zhaowa-edu-01 ~]` kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODENOMINATED NODE READINESS GATESmy-nginx-b7d7bc74d-jgfks 1/1 Running 0 7m35s 172.18.0.3zhaowa-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 2m39s
k8s重要概念介绍
| 组件名称 | 作用 |
|---|---|
| Cluster | 资源的集合。我们的k8s利⽤这些资源运⾏各种基于容器的应用。是计算、存储和网络资源的集合 |
| Master | Cluster的⼤脑。司令部。主要的任务就是用来调度的。决定我们的应用应该放到哪⾥去执行。 为了高可⽤,也可以运⾏多个master。职责是运行容器应用。 |
| Node | 来负责运⾏容器应⽤。Node是由Master去管理的,负责监控和容器状态的汇报。 |
| Pod | k8s的最小工作单元,包含1orN个容器。 Pod的使用方式: ⼀个pod运⾏⼀个容器 最常⽤的就是这种情况。 ⼀个pod运⾏多个容器 ⼀定是非常紧密相关的⼀组容器,并且需要资源的共享。⼀起启动、⼀起停止。 |
| Controller | k8s通过它来管理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。
k8s架构中,主要是由Master和Node组成的。
下面我们来针对这两部分进行详细的介绍。
Master
- API-Server
属于前端交互接⼝。提供基于Http/https RESTful API。
接收对应的指令。
- Scheduler
负责决定将pod放到那个Node上去运⾏的。
- Controller Manager
⾮常关键的组件。管理Cluster中的各种资源。
- etcd
负责保存k8s的配置信息和各种资源的状态信息。
如果数据发⽣了变化,etcd会快速通知相关的组件。

Node
- kubelet
创建和运⾏容器。
- kube-proxy
负责我们请求的转发。
如果对于多个副本,它会实现负载均衡。

Deployment
创建资源的方式
- 方式一
用kubectl命令直接创建。
比如:kubectl run nginx-deployment--image=nginx:1.7.9--replicas=2
在命令行中通过参数指定资源的属性。(但是,在K8S v1.18.0以后,–replicas已弃用 ,推荐用 kubectl apply 创建 pods)
- 方式二
通过配置文件和kubectl apply创建。
步骤:
1.编写yml配置文件。(下一页有书写样例,nginx.yml)
2.执行命令:kubectl apply -f /home/muse/nginx.yml
nginx.yml配置文件
- replicas: 2
部署的副本实例数量,默认为1
- metadata:
metadata定义Pod的元数据,至少要定义一个 label。label的key和value可以任意指定
- spec:
描述Pod的规格,此部分定义Pod中每一个容 器的属性,name和image是必需的

构建过程解析
用户通过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.2beta.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.2beta.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.2beta.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
DaemonSet
Deployment部署的副本pod会分布在各个Node上,每个Node都可能运行好几个副本。
Daemonsetl的不同之处在于:每个Node上最多只能运行一个副本。
Daemon Set的典型应用场景
1.在每个节点上运行存储 Daemon,比如 glusterd或 ceph
2.在每个节点上运行日志收集 Daemon,如 flunentdi或 logstashe
3.在毎个节点上运行监控 Daemon,比如 Prometheus Node Exporter或 collectd
查看k8s自己就用 Daemonsetie运行系统组件

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

Service
我们不应该期望Pod是健壮的,而是要假设Pod中的容器很可能因为各种原因发生故障而死掉。
Deployment等Controller会通过动态创建和销毁Pod来保证应用整体的健壮性。换句话说,Pod是脆弱的,但应用是健壮的。
Service提供了固定的ip和端口,并且里面包含一组pod,即使Pod的ip发生变化,但是面对客户端的是Service的固定ip和端口。
Rolling Update
滚动更新是一次只更新一小部分副本,成功后再更新更多的副本,最终完成所有副本的更新。滚动更新的最大好处是零停机,整个更新过程始终有副本在运行,从而保证
了业务的连续性。

K8S的安装部署以及基础知识的更多相关文章
- Kubernetes1.91(K8s)安装部署过程(八)-- kubernetes-dashboard安装
kubernets-dashboard顾名思义是操作面板安装,也就是可视化管理机器,同意我们用镜像结合配置文件部署. 1.下载镜像: docker pull registry.docker-cn.co ...
- centos6.5/centos7安装部署企业内部知识管理社区系统wecenter
企业内部知识系统wecenter社区系统安装及部署 centos 6.5环境安装 因为是公司内部使用在线人数不会太多,使用yum安装lamp环境即可 1.安装lamp基本环境 yum -y insta ...
- Kubernetes1.91(K8s)安装部署过程(七)--coredns安装
为了是集群内的服务能使用dns进行服务解析,集群内需要使用dns服务器,可以按照kube官方dns,即kubedns或者其他的dns,比如coredns, 本例中按照的为coredns,按照简单,编辑 ...
- Kubernetes1.91(K8s)安装部署过程(六)--node节点部署
hi,everybody,我回来了,之前安装到flannel之后,文章一直没有更新,甚至不少小伙伴都来加qq询问是否继续更新了, 这里说明下原因,我在部署1.91node的时候的确出现了各种各样的问题 ...
- Kubernetes1.91(K8s)安装部署过程(一)--证书安装
安装前忠告:如果你用的是虚拟机,强烈不建议你使用克隆(链接克隆)的方式,至于完整克隆不知道有没有问题,每一台全新安装centos7系统最好. 一.安装前主题环境准备 1.docker安装 建议使用官网 ...
- Gitlab安装部署及基础操作
环境说明 系统版本 CentOS 7.2 x86_64(较新版本的gitlab集成了更多功能,顺利运行起来的硬件要求较高,这里给了3G内存) 软件版本 gitlab-ce-10.8.4 GitLa ...
- K8s+dashboard安装部署【h】
系统安装使用虚拟机安装两个centos系统,在/etc/hosts里增加两行192.168.140.128 kuber-master192.168.140.129 kuber-node1 关闭防火墙s ...
- Kubernetes1.91(K8s)安装部署过程(四)--Master节点安装
再次明确下架构: 三台虚拟机 centos 7.4系统,docker为17版本,ip为10.10.90.105到107,其中105位master,接下来的master相关组件安装到此机器上. etc ...
- [MongoDB]------windos下的安装部署与基础使用
1.安装 首先前往官网进行下载,这里贴个地址https://www.mongodb.com/download-center#community 点击大大的原谅色的DOWNLOAD(msi)按钮进行下载 ...
随机推荐
- 【LeetCode】747. Largest Number At Least Twice of Others 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 寻找两次最大值 排序 大顶堆 日期 题目地址:htt ...
- 初识TMMi——测试成熟度模型集成
利用零碎的时间,粗略了解了一下TMMi V1.2,整理一下学习笔记跟大家分享一下. 本文分为四个部分,分别为TMMi概述.TMMi结构.成熟度级别和过程域.TMMi实施周期,希望能够帮助大家更好的理解 ...
- 【C++】leetcode竞赛笔记
*注--代码非博主本人所写,仅供学习参考,侵删 20200516双周赛: 1 to_string(int a) 将a转换成字符串形式 2 gcd(int a,int b) 返回a,b的最大公约数,若 ...
- Noise
目录 motivation settings results motivation 提高网络的一个有用的技巧就是增加训练数据: 真实数据, 或者用GAN拟合的数据. 这里想要研究的是, 噪声是否能够算 ...
- 本地修改配置hosts文件解决Github加载慢问题
本地修改配置hosts文件解决Github加载慢问题 手动方式 hosts 文件在每个系统的位置不一,详情如下: Windows 系统:C:\Windows\System32\drivers\etc\ ...
- [python]MergeTxt按列合并同一个文件下多个txt文件
开发需求:应项目需要,要将记录成txt的实验数据进行按列合并(也即为不同文件上下合并),从而进行机器学习训练. 实验数据类似如此 模拟验证数据 1.txt *****1***** abcdefghij ...
- HTML网页设计基础笔记 • 【第7章 盒子模型】
全部章节 >>>> 本章目录 7.1 盒子模型原理 7.1.1 盒子模型概述 7.1.2 盒子的大小 7.1.3 盒子之间的关系 7.2 标准文档流 7.2.1 标准文档流 ...
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- SpringCloud创建Config读取本地配置
1.说明 Config Server获取配置支持的方式很多, 包括Git仓库(github/gitee等),任何与JDBC兼容的数据库, Subversion,Hashicorp Vault,Cred ...
- 数学库Sage安装和使用
什么是Sage? Sage是免费的.开源的数学软件,支持代数.几何.数论.密码学.数值计算和相关领域的研究和教学. 可以简单看成一个数学库 下载 国内地址 安装 Windows下安装 下载安装程序即可 ...