--------------------------1.优势---------------------------------
--------------------------2.四组基本概念---------------------
--------------------------3.核心组件---------------------------
--------------------------4.其他概念----------------------------
--------------------------5.基本命令----------------------------
--------------------------6.kubeadm操作及命令------------
最近在学k8s,整理了一些理论知识,刚入门学习理论比较难,理论比较枯燥,但建议都要记起来。真的很重要。
1.优势
1.自动装箱,水平扩展,自我修复。
2.服务发现和负载均衡
3.自动发布(默认滚动发布模式)和回滚
4.集中化配置管理和秘钥管理
5.存储编排
6.任务批处理运行
。。。
2.四组基本概念
●Pod/Pod控制器
●Name/Namespace
●Label/Label选择器
●Service/Ingress
Pod
Pod是K8S里能够被运行的最小的逻辑单元(原子单元)
1个Pod里面可以运行多个容器,它们共享UTS+NET+IPC名称空间
可以把Pod理解成豌豆荚,而同一Pod内的每个容器是一颗颗豌豆
一个Pod里运行多个容器,又叫:边车(SideCar)模式
Pod控制器
●Pod控制器是Pod启动的一种模式,用来保证在K8S里启动的Pod应始终按照人们的预期运行(副本数,生命周期,健康状态检查…)
●K8S内提供了众多的Pod控制器,常用的有以下几种:
Deployment
DaemonSet
ReplicaSet
StatefulSet
Job
Cronjob
Name
●由于K8S内部,使用“资源”来定义每一 种逻辑概念(功能)故每种”资源”,都应该有自己的 ”名称”。
●资源”有api版本( apiVersion )类别( kind )、元数据( metadata )、定义清单( spec)、状态( status )等配置信息。
●"名称”通常定义在“资源”的"元数据”信息里。
Namespace
●随着项目增多、人员增加、集群规模的扩大,需要一种能够隔离K8S内各种“资源”的方法,这就是名称空间
●名称空间可以理解为K8S内部的虚拟集群组
●不同名称空间内的“资源” ,名称可以相同,相同名称空间内的同种"资源”,"名称” 不能相同
●合理的使用K8S的名称空间,使得集群管理员能够更好的对交付到K8S里的服务进行分类管理和浏览
●K8S里默认存在的名称空间有: default、 kube-system、 kube-public
●查询K8S里特定“资源”要带上相应的名称空间
Label
●标签是k8s特色的管理方式 ,便于分类管理资源对象。
●一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
●一个资源拥有多个标签,可以实现不同维度的管理。
●标签的组成: key=value与标签类似的,还有一种"注解”( annotations )
Label选择器
●给资源打上标签后,可以使用标签选择器过滤指定的标签
●标签选择器目前有两个:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)
●许多资源支持内嵌标签选择器字段
matchLabels
matchExpressions
Service
●在K8S的世界里,虽然每个Pod都会被分配一个单独的IP地址 ,但这个IP地址会随着Pod的销毁而消失
●Service (服务)就是用来解决这个问题的核心概念
●一个Service可以看作一 组提供相同服务的Pod的对外访问接口
●Service作用于哪些Pod是通过标签选择器来定义的
Service实现类型:
ClusterIP:提供一个集群内部的虚拟IP地址以供Pod访问(默认模式)
NodePort:在Node上打开一个端口以供外部访问
LoadBalancer:通过外部的负载均衡器来访问
ClusterIP是默认模式,LoadBalancer需要额外的模组来提供负载均衡
Ingress
●Ingress是K8S集群里 工作在OSI网络参考模型下,第7层的应用 ,对外暴露的接口
●Service只能进行L 4流量调度,表现形式是ip+port
●Ingress则可以调度不同业务域、不同URL访问路径的业务流量
注(访问顺序):Ingress --> service–>pod–>docker
3.核心组件
1.配置存储中心–>etcd服务
2.主控(master)节点
●kube-apiserver服务
●kube-controller-manager服务
●kube-scheduler服务
3.运算( node )节点
●kube-kubelet服务
●Kube-proxy服务
4.CLI客户端
CLI客户端
●kubectl
5.核心附件
●CNI网络插件→flannel/calico
●服务发现用插件→coredns
●服务暴露用插件> traefik
●GUI管理插件> Dashboard
Apiserver(k8s集群的大脑)
●提供了集群管理的RESTAPI接口(包括鉴权、数据校验及集群状态变更)
●负责其他模块之间的数据交互,承担通信枢纽功能
●是资源配额控制的入口
●提供完备的集群安全机制
controller-manager(控制器管理器)
由一系列控制器组成,通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态
●Node Controller
●Deployment Controller
●Service Controller
●Volume Controller
●Endpoint Controller
●Garbage Controller
●Namespace Controller
●Job Controller
●Resource quta Controller
…
Scheduler(调度程序)(监控node资源的状况)
●主要功能是接收调度pod到适合的运算节点上
●预算策略( predict )
●优选策略( priorities )
Kubelet(容器的搭起,销毁等动作)(负责pod的生命周期,运行node上)(容器的守护进程)
●简单地说, kubelet的主要功能就是定时从某个地方获取节点上pod的期望状态(运行什么容器、运行的副本数量网络或者存储如何配置等等) ,并调用对应的容器平台接口达到这个状态
●定时汇报当前节点的状态给apiserver,以供调度的时候使用
●镜像和容器的清理工作保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源
kube-proxy(发现机制,运行在node上,最先用iptables做隔离,现在流行用ipvs,简单的网络代理,和负载均衡器,更方便)
●是K8S在每个节点上运行网络代理, service资源的载体
●建立了pod网络和集群网络的关系( clusterip- >podip )
●常用三种流量调度模式
●Userspace (废弃)
●Iptables (废弃)
●Ipvs(推荐)
●负责建立和删除包括更新调度规则、通知apiserver自己的更新,或者从apiserver哪里获取其他kube-proxy的调度规则变化来更新自己的
Endpoint Controller 负责维护Service和Pod的对应关系
Kube-proxy负责service的实现,即实现了K8s内部从pod到Service和外部从node port到service的访问
注:Pod网络是kube-kubelet提供,不是直接由Kube-proxy提供
各组件的工作流程:
User(采用命令kubectl)—> API server(响应,调度不同的Schedule)—> Schedule(调度)—> Controller Manager(创建不同的资源)—> etcd(写入状态)—> 查找集群
(node哪个有资源,通过Schedule,到对应的node上创建pod)
4.其他概念
RC(ReplicationController)
Kubelet需要管理大量的pod,而显而易见的是通常情况下一个应用不会以单独一个pod完成,比较常见的是使用大量的Pod组成一个简单应用,管理这些大量的pod的一个方案RC
RC可以指定pod的副本数量,并且在其中有Pod故障时可以自动拉起新的pod,大大简化了维护难度
目前建议采用ReplicaSet和Deployment代替RC
ReplicaSet副本控制器
确保pod的一定数量的分数(replica)在运行,如果超过这个数量,制器会杀死一些,如果少了,控制器会启动一些。
用来解决pod的扩容和缩容问题。
新一代的RS,主要功能和RC一样,维持pod的数量稳定,指定pod的运行位置,使用方法也相似,主要区别是更新了api,支持更多功能
RS不建议直接使用,而是用更上层的概念Deployment调用ReplicaSet
通常用于无状态应用,与Deployments配置使用。
Deployments
提供官方的用于更新Pod和ReplicaSet的方法,Deployments用来定义您预期的应用状态。
Deployments集成了上线部署,滚动升级,创建副本,暂停上线任务,恢复上线任务,回滚到以前某一版本(成功/稳定)的Deployments等功能
目前最常用的控制器就是Deployment,创建Deployment时也会创建ReplicaSet
Deployment可以管理一个或多个RS,并且通过RS来管理pod
注意:一个完整的应用一般都是多个Deployment构成
StatefulSets有状态应用用于解决各个pod实例独立生命周期管理,提供各个实例的启动顺序和唯一性
稳定,唯一的网络标识符
稳定,持久存储
有序的,优雅的部署和扩展
有序,优雅的删除和终止
有序的自动滚动更新
DaemonSet能够让所有的node节点运行同一个Pod。(一般用来部署代理,如果收集日志的代理,可以通过DaemonSet快速的在node上部署同一个pod)
副本数的控制是通过RS去控制的,
Service
(相当于锁定器,不会因为pod被销毁而找不到后端资源,pod销毁,Ip等信息会改变) 定义了pods的逻辑集合和访问这个集合的策略,pods集合是通过定义service时提供的label选择器完成的
Node管理机制
Container Runtime(容器) 归Kubelet进程管理
Kubelet发现机制,如果发现容器挂了,Kubelet会通过API server 监控容器状态,如果本身状态为1,变成了0,它就会去把容器再拉起来
5.基本命令
Format:Kubectl command -type name flags
常用Command:
create:(创建资源)
apply:(应用资源的配置变更,也可以代替create创建新的资源)
get:(查看资源)
describe:(查看资源的详细描述)
delete:(删除资源)
常用的flags包含-n=namespace,-o=wide(能看到宿主机)
默认namespace(default,kube-system)
查看存在有哪些namespace
Kubectl get namespace
Kubectl get ns
查看命名空间中的存在的pod
Kubectl get pod –namespace=kube-system
Kubuctl get pod –n kube-system
运行一个Deployment
创建一个简单的deployment
Kubectl create deployment mydep –image-nginx (mydep创建名称,基于nginx镜像)
查看deployment的创建情况
Kubectl get deployment
回显:
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 1/1 1 1 2m3s
查看pod跑在哪个节点上
Kubectl get pod –ndefault
从yaml文件创建deployment
Kubectl create –f name.yaml
查看创建结果
Kubectl get deployment
回显:
NAME READY UP-TO-DATE AVAILABLE AGE
name 3/3 3 3 114s
create –f 指从某个文件创建对应资源
可以apply代替create
主流用法,一个Pod里边只跑一个容器
6.kubeadm涉及一些操作及命令
kubeadm安装kubenetes1.18.2
1.基础环境:
设置本地DNS秘钥登录(免密登录)
ssh-keygen ssh-copy-id root@192.168.0.99
设置node节点通过master能访问外网
参考我另一篇文档“华为云内网服务器通过公网服务器访问外网”
设置docker-ce yum仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2.卸载自带老版本依赖
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
3.安装docker-ce
yum install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
systemctl enable docker
配置docker加速器
vim /etc/docker/daemon.json
{
"registry-mirrors" : ["https://registry.docker-cn.com"]
}
4.k8s仓库取得阿里云镜像
cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enable=1
yum install kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2
配置docker的service文件,添加环境变量,让它帮我们代理访问k8s来拉取镜像
vim /usr/lib/systemd/system/docker.service
...
[Service]
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,192.168.0.0/24"
...
改了service文件,需要重新加载一下
systemctl daemon-reload
systemctl restart docker
docker info
查看iptables内生的桥接相关功能,默认开启。
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
修改配置文件
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
KUBE_PROXY=MODE=ipvs ##指明kube_proxy使用ipvs模式
systemctl enable kubelet.service
kubeadm init --kubernetes-version=v1.18.2 --pod-network-cidr=10.10.10.0/24 --service-cidr=172.7.0.0/24 --ignore-preflight-errors=Swap
(这可能跟“科学上网”有关,由于kubeadm
默认从官网k8s.grc.io下载所需镜像,而国内无法访问。因此需要把上面在docker的service文件中设置的代理注释或删除掉,同时需要通过–image-repository指定阿里云镜>像仓库地址)
下面这个指定了阿里云镜像仓库地址:
kubeadm init --kubernetes-version=v1.18.2 --pod-network-cidr=10.10.10.0/24 --service-cidr=172.7.0.0/24 --ignore-preflight-errors=Swap --image-repository registry.aliyuncs.com/google_containers
–pod-network-cidr string
指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
–service-cidr string
默认值:“10.96.0.0/12” 为服务的虚拟 IP 地址另外指定 IP 地址段
kubeadm join 192.168.0.102:6443 --token 4orxq1.exesrgh7hkgce60o \
--discovery-token-ca-cert-hash sha256:20fb6b286380ccd8ec6c82fd03f790b9c4df7fb3dbfabb7bc2f83f4755e543e7
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证
docker image ls ## 查看镜像
ss -ntl | grep 6443 ## kube-apiserver的端口
kubectl get cs ##查询组件状态
kubectl get nodes ##查询集群节点 (因为还没有部署好flannel,所以节点显示为NotReady)
kubectl get ns ##查看命名空间
部署网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
docker image ls |grep flannel ##会看到下载好的flannel的镜像
kubectl get nodes ##master 节点已经Ready
kubectl get pods -n kube-system |grep flannel ##kube-system名称空间下flannel插件
节点部署
kubeadm join 192.168.0.102:6443 --token 4orxq1.exesrgh7hkgce60o \
--discovery-token-ca-cert-hash sha256:20fb6b286380ccd8ec6c82fd03f790b9c4df7fb3dbfabb7bc2f83f4755e543e7
###node节点会自动拉取kube-proxy、flannel、pause镜像
kubectl get node
kubectl get image ls