10min快速了解k8s基础
Kubernetes简介
Kubernetes(简称K8S,K和S之间有8个字母)是用于自动部署,扩展和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。
Kubernetes具有如下特性:
- 服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。
- 存储编排:自动挂载所选存储系统,包括本地存储。
- Secret和配置管理:部署更新Secrets和应用程序的配置时不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。
- 批量执行:除了服务之外,Kubernetes还可以管理你的批处理和CI工作负载,在期望时替换掉失效的容器。
- 水平扩缩:使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行扩缩。
- 自动化上线和回滚:Kubernetes会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。
- 自动装箱:根据资源需求和其他约束自动放置容器,同时避免影响可用性。
- 自我修复:重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器。
Minikube简介
Minikube是一种轻量级的Kubernetes实现,可在本地计算机上创建VM并部署仅包含一个节点的简单集群,Minikube可用于Linux、MacOS和Windows系统。Minikube CLI提供了用于引导集群工作的多种操作,包括启动、停止、查看状态和删除。
Kubernetes核心概念
由于Kubernetes有很多核心概念,学习它们对理解Kubernetes的使用很有帮助,所以我们先来学习下这些核心概念。
Node
Kubernetes集群是指Kubernetes协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。
一个Kubernetes集群包含两种类型的资源:
- Master:负责管理整个集群。协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。
- Node:用于托管正在运行的应用。可以是一个虚拟机或者物理机,它在Kubernetes集群中充当工作机器的角色,每个Node都有Kubelet,它管理Node而且是Node与Master通信的代理,Node还具有用于处理容器操作的工具,例如Docker或rkt。
image.png
Deployment
Deployment负责创建和更新应用程序的实例。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障维护问题。
可以使用Kubernetes命令行界面Kubectl创建和管理Deployment。Kubectl使用Kubernetes API与集群进行交互。
image.png
Pod
Pod相当于逻辑主机
的概念,负责托管应用实例。包括一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源(共享存储、网络、运行信息等)。
image.png
Service
Service是一个抽象层,它定义了一组Pod的逻辑集,并为这些Pod支持外部流量暴露、负载平衡和服务发现。
尽管每个Pod 都有一个唯一的IP地址,但是如果没有Service,这些IP不会暴露在群集外部。Service允许您的应用程序接收流量。Service也可以用在ServiceSpec标记type的方式暴露,type类型如下:
- ClusterIP(默认):在集群的内部IP上公开Service。这种类型使得Service只能从集群内访问。
- NodePort:使用NAT在集群中每个选定Node的相同端口上公开Service。使用
<NodeIP>:<NodePort>
从集群外部访问Service。是ClusterIP的超集。 - LoadBalancer:在当前云中创建一个外部负载均衡器(如果支持的话),并为Service分配一个固定的外部IP。是NodePort的超集。
- ExternalName:通过返回带有该名称的CNAME记录,使用任意名称(由spec中的externalName指定)公开Service。不使用代理。
image.png
Docker安装
由于Kubernetes运行需要依赖
容器运行时
(负责运行容器的软件),现比较通用的容器运行时有Docker、containerd和CRI-O。这里选择Docker,先在Linux服务器上安装好Docker环境。
- 安装
yum-utils
:
yum install -y yum-utils device-mapper-persistent-data lvm2
- 为yum源添加docker仓库位置:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker:
yum install docker-ce
- 启动Docker:
systemctl start docker
Minikube安装
- 首先我们需要下载Minikube的二进制安装包并安装:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
- 然后使用如下命令启动Minikube:
minikube start
- 如果你使用的是
root
用户的话会无法启动并提示如下信息,那是因为Minikube不允许使用root权限启动,需要创建一个非root账号再启动;
* minikube v1.16.0 on Centos 7.6.1810
* Automatically selected the docker driver
* The "docker" driver should not be used with root privileges.
* If you are running minikube within a VM, consider using --driver=none:
* https://minikube.sigs.k8s.io/docs/reference/drivers/none/X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
- 这里创建了一个属于
docker
用户组的macro
用户,并切换到该用户;
# 创建用户
useradd -u 1024 -g docker macro
# 设置用户密码
passwd macro
# 切换用户
su macro
- 再次使用
minikube start
命令启动Minikube,启动成功后会显示如下信息:
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* Preparing Kubernetes v1.20.0 on Docker 20.10.0 ...- Generating certificates and keys ...- Booting up control plane ...- Configuring RBAC rules ...
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Kubernetes的使用
创建集群
通过Minikube我们可以创建一个单节点的K8S集群,集群管理Master和负责运行应用的Node都部署在此节点上。
- 查看Minikube的版本号:
minikube version
minikube version: v1.16.0
commit: 9f1e482427589ff8451c4723b6ba53bb9742fbb1
- 查看kubectl的版本号,第一次使用会直接安装kubectl:
minikube kubectl version
复制代码
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
- 如果你想直接使用kubectl命令的话,可以将其复制到
/bin
目录下去:
# 查找kubectl命令的位置
find / -name kubectl
# 找到之后复制到/bin目录下
cp /mydata/docker/volumes/minikube/_data/lib/minikube/binaries/v1.20.0/kubectl /bin/
# 直接使用kubectl命令
kubectl version
- 查看集群详细信息:
kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
KubeDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
- 查看集群中的所有Node,可以发现Minikube创建了一个单节点的简单集群:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 46m v1.20.0
部署应用
一旦运行了K8S集群,就可以在其上部署容器化应用程序。通过创建Deployment对象,可以指挥K8S如何创建和更新应用程序的实例。
- 指定好应用镜像并创建一个Deployment,这里创建一个Nginx应用:
kubectl create deployment kubernetes-nginx --image=nginx:1.10
创建一个Deployment时K8S会产生如下操作:
- 选择一个合适的Node来部署这个应用;
- 将该应用部署到Node上;
- 当应用异常关闭或删除时重新部署应用。
查看所有Deployment:
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-nginx 1/1 1 1 21h
- 我们可以通过
kubectl proxy
命令创建一个代理,这样就可以通过暴露出来的接口直接访问K8S的API了,这里调用了查询K8S版本的接口;
[macro@linux-local root]$ kubectl proxy
Starting to serve on 127.0.0.1:8001
[root@linux-local ~]# curl http://localhost:8001/version
{"major": "1","minor": "20","gitVersion": "v1.20.0","gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38","gitTreeState": "clean","buildDate": "2020-12-08T17:51:19Z","goVersion": "go1.15.5","compiler": "gc","platform": "linux/amd64"
}
查看应用
通过对运行应用的Pod进行操作,可以查看容器日志,也可以执行容器内部命令。
- 查看K8s中所有Pod的状态:
kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 1 21h
- 查看Pod的详细状态,包括IP地址、占用端口、使用镜像等信息;
kubectl describe pods
Name: kubernetes-nginx-78bcc44665-8fnnn
Namespace: default
Priority: 0
Node: minikube/192.168.49.2
Start Time: Tue, 05 Jan 2021 13:57:46 +0800
Labels: app=kubernetes-nginxpod-template-hash=78bcc44665version=v1
Annotations: <none>
Status: Running
IP: 172.17.0.7
IPs:IP: 172.17.0.7
Controlled By: ReplicaSet/kubernetes-nginx-78bcc44665
Containers:nginx:Container ID: docker://31eb1277e507ec4cf8a27b66a9f4f30fb919d17f4cd914c09eb4cfe8322504b2Image: nginx:1.10Image ID: docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575Port: <none>Host Port: <none>State: RunningStarted: Wed, 06 Jan 2021 09:22:40 +0800Last State: TerminatedReason: CompletedExit Code: 0Started: Tue, 05 Jan 2021 14:24:55 +0800Finished: Tue, 05 Jan 2021 17:32:48 +0800Ready: TrueRestart Count: 1Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-dhr4b (ro)
Conditions:Type StatusInitialized True Ready True ContainersReady True PodScheduled True
Volumes:default-token-dhr4b:Type: Secret (a volume populated by a Secret)SecretName: default-token-dhr4bOptional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>
复制代码
- 将Pod的名称设置为环境变量,方便之后使用
$POD_NAME
来应用Pod的名称:
export POD_NAME=kubernetes-nginx-78bcc44665-8fnnn
- 查看Pod打印的日志:
kubectl logs $POD_NAME
- 使用
exec
可以在Pod的容器中执行命令,这里使用env
命令查看环境变量:
kubectl exec $POD_NAME -- env
复制代码
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-nginx-78bcc44665-8fnnn
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
NGINX_VERSION=1.10.3-1~jessie
HOME=/root
- 进入容器内部并执行
bash
命令,如果想退出容器可以使用exit
命令:
kubectl exec -ti $POD_NAME -- bash
公开暴露应用
默认Pod无法被集群外部访问,需要创建Service并暴露端口才能被外部访问。
- 创建一个Service来暴露kubernetes-nginx这个Deployment:
kubectl expose deployment/kubernetes-nginx --type="NodePort" --port 80
- 查看K8S中所有Service的状态:
kubectl get services
复制代码
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h16m
kubernetes-nginx NodePort 10.105.177.114 <none> 80:31891/TCP 5s
- 查看Service的详情,通过
NodePort
属性可以得到暴露到外部的端口;
kubectl describe services/kubernetes-nginx
Name: kubernetes-nginx
Namespace: default
Labels: app=kubernetes-nginx
Annotations: <none>
Selector: app=kubernetes-nginx
Type: NodePort
IP Families: <none>
IP: 10.106.227.54
IPs: 10.106.227.54
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30158/TCP
Endpoints: 172.17.0.7:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
- 通过CURL命令通过
Minikube IP:NodePort IP
可以访问Nginx服务,此时将打印Nginx主页信息;
curl $(minikube ip):30158
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
标签的使用
通过给资源添加Label,可以方便地管理资源(如Deployment、Pod、Service等)。
- 查看Deployment中所包含的Label;
kubectl describe deployment
Name: kubernetes-nginx
Namespace: default
CreationTimestamp: Tue, 05 Jan 2021 13:57:46 +0800
Labels: app=kubernetes-nginx
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=kubernetes-nginx
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
- 通过Label查询Pod:
kubectl get pods -l app=kubernetes-nginx
NAME READY STATUS RESTARTS AGE
kubernetes-nginx-78bcc44665-8fnnn 1/1 Running 1 21h
- 通过Label查询Service:
kubectl get services -l app=kubernetes-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-nginx NodePort 10.106.227.54 <none> 80:30158/TCP 4m44s
- 给Pod添加Label:
kubectl label pod $POD_NAME version=v1
- 查看Pod的详细信息,可以查看Label信息:
kubectl describe pods $POD_NAME
Name: kubernetes-nginx-78bcc44665-8fnnn
Namespace: default
Priority: 0
Node: minikube/192.168.49.2
Start Time: Tue, 05 Jan 2021 13:57:46 +0800
Labels: app=kubernetes-nginxpod-template-hash=78bcc44665version=v1
- 通过Label查询Pod:
kubectl get pods -l version=v1
- 通过Label删除服务:
kubectl delete service -l app=kubernetes-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30h
可视化管理
Dashboard是基于网页的K8S用户界面。你可以使用Dashboard将容器应用部署到K8S集群中,也可以对容器应用排错,还能管理集群资源。
- 查看Minikube内置插件,默认情况下Dashboard插件未启用:
minikube addons list
|-----------------------------|----------|--------------|
| ADDON NAME | PROFILE | STATUS |
|-----------------------------|----------|--------------|
| dashboard | minikube | disabled |
| default-storageclass | minikube | enabled ✅ |
|-----------------------------|----------|--------------|
- 启用Dashboard插件:
minikube addons enable dashboard
- 开启Dashboard,通过
--url
参数不会打开管理页面,并可以在控制台获得访问路径:
minikube dashboard --url
* Verifying dashboard health ...
* Launching proxy ...
* Verifying proxy health ...
http://127.0.0.1:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- 要想从外部访问Dashboard,需要从使用kubectl设置代理才行,
--address
设置为你的服务器地址;
kubectl proxy --port=44469 --address='192.168.5.94' --accept-hosts='^.*' &
- 从外部访问服务器需要开启防火墙端口;
# 切换到root用户
su -
# 开启端口
firewall-cmd --zone=public --add-port=44469/tcp --permanent
# 重启防火墙
firewall-cmd --reload
- 通过如下地址即可访问Dashboard:
http://192.168.5.94:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- 查看K8S集群中的资源状态信息:
image.png
- 通过yaml脚本创建K8S资源:
image.png
- 查看K8S中所有Pod的状态信息,通过更多按钮可以查看容器日志和执行内部命令。
image.png
总结
当我们的应用需要部署在多个物理机上时,传统的做法是一个个物理机器去部署。如果我们使用了K8S的话,就可以把这些物理机认为是一个集群,只需通过K8S把应用部署到集群即可,无需关心物理机的部署细节。同时K8S提供了水平扩容、自动装箱、自动修复等功能,大大减少了应用集群化部署的工作量。
第二部分
Kubernetes是Google开源的容器集群管理系统,是Google多年⼤规模容器管理技术Borg的开源版本,主要功能包括:
基于容器的应用部署、维护和滚动升级
负载均衡和服务发现
跨机器和跨地区的集群调度
自动伸缩
无状态服务和有状态服务
广泛的Volume支持
插件机制保证扩展性
Kubernetes发展非常迅速,已经成为容器编排领域的领导者,接下来我们将讲解Kubernetes中涉及到的一些主要概念。
1、Pod
Pod是一组紧密关联的容器集合,支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式完成服务,是Kubernetes调度的基本单位。Pod的设计理念是每个Pod都有一个唯一的IP。
Pod具有如下特征:
包含多个共享IPC、Network和UTC namespace的容器,可直接通过localhost通信
所有Pod内容器都可以访问共享的Volume,可以访问共享数据
优雅终止:Pod删除的时候先给其内的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然还在运行的进程
特权容器(通过SecurityContext配置)具有改变系统配置的权限(在网络插件中大量应用)
支持三种重启策略(restartPolicy),分别是:Always、OnFailure、Never
支持三种镜像拉取策略(imagePullPolicy),分别是:Always、Never、IfNotPresent
资源限制,Kubernetes通过CGroup限制容器的CPU以及内存等资源,可以设置request以及limit值
健康检查,提供两种健康检查探针,分别是livenessProbe和redinessProbe,前者用于探测容器是否存活,如果探测失败,则根据重启策略进行重启操作,后者用于检查容器状态是否正常,如果检查容器状态不正常,则请求不会到达该Pod
Init container在所有容器运行之前执行,常用来初始化配置
容器生命周期钩子函数,用于监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数,支持两种钩子函数:postStart和preStop,前者是在容器启动后执行,后者是在容器停止前执行
2、Namespace
Namespace(命名空间)是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或者用户组。常见的pod、service、replicaSet和deployment等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。
常用namespace操作:
kubectlgetnamespace, 查询所有namespace
kubectl createnamespacens-name,创建namespace
kubectldeletenamespacens-name, 删除namespace
删除命名空间时,需注意以下几点:
删除一个namespace会自动删除所有属于该namespace的资源。
default 和 kube-system 命名空间不可删除。
PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。
Events是否属于namespace取决于产生events的对象。
3、Node
Node是Pod真正运行的主机,可以是物理机也可以是虚拟机。Node本质上不是Kubernetes来创建的, Kubernetes只是管理Node上的资源。为了管理Pod,每个Node节点上至少需要运行container runtime(Docker)、kubelet和kube-proxy服务。
常用node操作:
kubectlgetnodes,查询所有node
kubectl cordon $nodename, 将node标志为不可调度
kubectl uncordon $nodename, 将node标志为可调度
taint(污点)
使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将Node已经存在的Pod驱逐出去。每个污点的组成:key=value:effect,当前taint effect支持如下三个选项:
NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去
常用命令如下:
kubectl taint node node0 key1=value1:NoShedule,为node0设置不可调度污点
kubectl taint node node0 key-,将node0上key值为key1的污点移除
kubectl taint node node1 node-role.kubernetes.io/master=:NoSchedule,为kube-master节点设置不可调度污点
kubectl taint node node1 node-role.kubernetes.io/master=PreferNoSchedule,为kube-master节点设置尽量不可调度污点
容忍(Tolerations)
设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。 但我们可以在Pod上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。
4、Service
Service是对一组提供相同功能的Pods的抽象,并为他们提供一个统一的入口,借助 Service 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签(label)来选取后端Pod,一般配合ReplicaSet或者Deployment来保证后端容器的正常运行。
service 有如下四种类型,默认是ClusterIP:
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
LoadBalancer: 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort
ExternalName: 将服务通过DNS CNAME记录方式转发到指定的域名
另外,也可以将已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建 Service 的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint。
5、Volume 存储卷
默认情况下容器的数据是非持久化的,容器消亡以后数据也会跟着丢失,所以Docker提供了Volume机制以便将数据持久化存储。Kubernetes提供了更强大的Volume机制和插件,解决了容器数据持久化以及容器间共享数据的问题。
Kubernetes存储卷的生命周期与Pod绑定
容器挂掉后Kubelet再次重启容器时,Volume的数据依然还在
Pod删除时,Volume才会清理。数据是否丢失取决于具体的Volume类型,比如emptyDir的数据会丢失,而PV的数据则不会丢
目前Kubernetes主要支持以下Volume类型:
emptyDir:Pod存在,emptyDir就会存在,容器挂掉不会引起emptyDir目录下的数据丢失,但是pod被删除或者迁移,emptyDir也会被删除
hostPath:hostPath允许挂载Node上的文件系统到Pod里面去
NFS(Network File System):网络文件系统,Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。
glusterfs:同NFS一样是一种网络文件系统,Kubernetes可以将glusterfs挂载到Pod中,并进行永久保存
cephfs:一种分布式网络文件系统,可以挂载到Pod中,并进行永久保存
subpath:Pod的多个容器使用同一个Volume时,会经常用到
secret:密钥管理,可以将敏感信息进行加密之后保存并挂载到Pod中
persistentVolumeClaim:用于将持久化存储(PersistentVolume)挂载到Pod中
...
6、PersistentVolume(PV) 持久化存储卷
PersistentVolume(PV)是集群之中的一块网络存储。跟 Node 一样,也是集群的资源。PersistentVolume (PV)和PersistentVolumeClaim (PVC)提供了方便的持久化卷: PV提供网络存储资源,而PVC请求存储资源并将其挂载到Pod中。
PV的访问模式(accessModes)有三种:
ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个Pod挂载。
ReadOnlyMany(ROX):可以以只读的方式被多个Pod挂载。
ReadWriteMany(RWX):这种存储可以以读写的方式被多个Pod共享。
不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是 访问模式。
PV的回收策略(persistentVolumeReclaimPolicy)也有三种
Retain,不清理保留Volume(需要手动清理)
Recycle,删除数据,即 rm -rf /thevolume/* (只有NFS和HostPath支持)
Delete,删除存储资源
7、Deployment 无状态应用
一般情况下我们不需要手动创建Pod实例,而是采用更高一层的抽象或定义来管理Pod,针对无状态类型的应用,Kubernetes使用Deloyment的Controller对象与之对应。其典型的应用场景包括:
定义Deployment来创建Pod和ReplicaSet
滚动升级和回滚应用
扩容和缩容
暂停和继续Deployment
常用的操作命令如下:
kubectl run www--image=10.0.0.183:5000/hanker/www:0.0.1--port=8080 生成一个Deployment对象
kubectlgetdeployment--all-namespaces 查找Deployment
kubectl describe deployment www 查看某个Deployment
kubectl edit deployment www 编辑Deployment定义
kubectldeletedeployment www 删除某Deployment
kubectl scale deployment/www--replicas=2 扩缩容操作,即修改Deployment下的Pod实例个数
kubectlsetimage deployment/nginx-deployment nginx=nginx:1.9.1更新镜像
kubectl rollout undo deployment/nginx-deployment 回滚操作
kubectl rollout status deployment/nginx-deployment 查看回滚进度
kubectl autoscale deployment nginx-deployment--min=10--max=15--cpu-percent=80 启用水平伸缩(HPA - horizontal pod autoscaling),设置最小、最大实例数量以及目标cpu使用率
kubectl rollout pause deployment/nginx-deployment 暂停更新Deployment
kubectl rollout resume deploy nginx 恢复更新Deployment
更新策略
.spec.strategy 指新的Pod替换旧的Pod的策略,有以下两种类型
RollingUpdate 滚动升级,可以保证应用在升级期间,对外正常提供服务。
Recreate 重建策略,在创建出新的Pod之前会先杀掉所有已存在的Pod。
Deployment和ReplicaSet两者之间的关系
使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod,检查启动状态,看它是成功还是失败。
当执行更新操作时,会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移 动到新的ReplicaSet中
8、StatefulSet 有状态应用
Deployments和ReplicaSets是为无状态服务设计的,那么StatefulSet则是为了有状态服务而设计,其应用场景包括:
稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行操作(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
有序收缩,有序删除(即从N-1到0)
支持两种更新策略:
OnDelete:当 .spec.template更新时,并不立即删除旧的Pod,而是等待用户手动删除这些旧Pod后自动创建新Pod。这是默认的更新策略,兼容v1.6版本的行为
RollingUpdate:当 .spec.template 更新时,自动删除旧的Pod并创建新Pod替换。在更新时这些Pod是按逆序的方式进行,依次删除、创建并等待Pod变成Ready状态才进行下一个Pod的更新。
9、DaemonSet 守护进程集
DaemonSet保证在特定或所有Node节点上都运行一个Pod实例,常用来部署一些集群的日志采集、监控或者其他系统管理应用。典型的应用包括:
日志收集,比如fluentd,logstash等
系统监控,比如Prometheus Node Exporter,collectd等
系统程序,比如kube-proxy, kube-dns, glusterd, ceph,ingress-controller等
指定Node节点
DaemonSet会忽略Node的unschedulable状态,有两种方式来指定Pod只运行在指定的Node节点上:
nodeSelector:只调度到匹配指定label的Node上
nodeAffinity:功能更丰富的Node选择器,比如支持集合操作
podAffinity:调度到满足条件的Pod所在的Node上
目前支持两种策略
OnDelete: 默认策略,更新模板后,只有手动删除了旧的Pod后才会创建新的Pod
RollingUpdate: 更新DaemonSet模版后,自动删除旧的Pod并创建新的Pod
10、Ingress
Kubernetes中的负载均衡我们主要用到了以下两种机制:
Service:使用Service提供集群内部的负载均衡,Kube-proxy负责将service请求负载均衡到后端的Pod中
Ingress Controller:使用Ingress提供集群外部的负载均衡
Service和Pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service所在节点暴露的端口上,然后再由kube-proxy通过边缘路由器将其转发到相关的Pod,Ingress可以给service提供集群外部访问的URL、负载均衡、HTTP路由等,为了配置这些Ingress规则,集群管理员需要部署一个Ingress Controller,它监听Ingress和service的变化,并根据规则配置负载均衡并提供访问入口。
常用的ingress controller:
nginx
traefik
Kong
Openresty
11、Job & CronJob 任务和定时任务
Job负责批量处理短暂的一次性任务 (short lived>CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。
12、HPA(Horizontal Pod Autoscaling) 水平伸缩
Horizontal Pod Autoscaling可以根据CPU、内存使用率或应用自定义metrics自动扩展Pod数量 (支持replication controller、deployment和replica set)。
控制管理器默认每隔30s查询metrics的资源使用情况(可以通过 --horizontal-pod-autoscaler-sync-period 修改)
支持三种metrics类型
预定义metrics(比如Pod的CPU)以利用率的方式计算
自定义的Pod metrics,以原始值(raw value)的方式计算
自定义的object metrics
支持两种metrics查询方式:Heapster和自定义的REST API
支持多metrics
可以通过如下命令创建HPA:kubectl autoscale deployment php-apache--cpu-percent=50--min=1--max=10
13、Service Account
Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的
授权
Service Account为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合RBAC(Role Based Access Control)来为Service Account鉴权,通过定义Role、RoleBinding、ClusterRole、ClusterRoleBinding来对sa进行授权。
14、Secret 密钥
Sercert-密钥解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。有如下三种类型:
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中;
Opaque:base64编码格式的Secret,用来存储密码、密钥等;
kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。
15、ConfigMap 配置中心
ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap跟secret很类似,但它可以更方便地处理不包含敏感信息的字符串。ConfigMap可以通过三种方式在Pod中使用,三种分别方式为:设置环境变量、设置容器命令行参数以及在Volume中直接挂载文件或目录。
可以使用 kubectl create configmap从文件、目录或者key-value字符串创建等创建 ConfigMap。也可以通过 kubectl create-f value.yaml 创建。
16、Resource Quotas 资源配额
资源配额(Resource Quotas)是用来限制用户资源用量的一种机制。
资源配额有如下类型:
计算资源,包括cpu和memory
cpu, limits.cpu, requests.cpu
memory, limits.memory, requests.memory
存储资源,包括存储资源的总量以及指定storage class的总量
requests.storage:存储资源总量,如500Gi
persistentvolumeclaims:pvc的个数
storageclass.storage.k8s.io/requests.storage
storageclass.storage.k8s.io/persistentvolumeclaims
对象数,即可创建的对象的个数
pods, replicationcontrollers, configmaps, secrets
resourcequotas, persistentvolumeclaims
services, services.loadbalancers, services.nodeports
它的工作原理为:
资源配额应用在Namespace上,并且每个Namespace最多只能有一个 ResourceQuota 对象
开启计算资源配额后,创建容器时必须配置计算资源请求或限制(也可以 用LimitRange设置默认值)
用户超额后禁止创建新的资源
10min快速了解k8s基础相关推荐
- ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...
- 单机快速体验k8s集群的测试环境
快速指南 以下为快速体验k8s集群的测试.开发环境–单节点部署(aio),国内环境下比官方的minikube方便.简单很多. 1.基础系统配置 准备一台虚机配置内存2G/硬盘30G以上 最小化安装Ub ...
- 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)
大家都知道历史上有段佳话叫"司马相如和卓文君"."皑如山上雪,皎若云间月".卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武 ...
- 『中级篇』k8s基础网络Cluster Network(66)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』k8s基础网络Cluster Network(66) 通过国人大神的一键安装k8s集群安装了3个master节点和3 ...
- 『中级篇』Minikube快速搭建K8S单节点环境(61)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』Minikube快速搭建K8S单节点环境(61) 去介绍k8s的集群安装,本地搭建一个k8s的集群. 不会科学上网的 ...
- 专题开发十二:JEECG微云快速开发平台-基础用户权限
专题开发十二:JEECG微云快速开发平台-基础用户权限 11.3.4自定义按钮权限 Jeecg中,目前按钮权限设置,是通过对平台自己封装的按钮标签(<t:dgFunOpt等)进行设置.而在开 ...
- 开发指南专题十一:JEECG微云快速开发平台--基础用户权限
开发指南专题十一:JEECG微云快速开发平台--基础用户权限 11.1. 权限设计 基本概念 权限管理模块涉及到的实体有:用户.角色和系统资源(包括系统菜单.页面按钮等).用户可以拥有多个 ...
- 小白如何快速从0基础入门平面设计
很多新手对平面设计很感兴趣,但又没有一个很好的师傅来引导,甚至连平面设计是什么,平面设计用干什么都没弄清楚,就更不用说要把平面设计能快速学好用好了.那么今天,我就来和大家讲解一下,一个新手小白,如何快 ...
- web快速入门之基础篇-js:3_3、简易购物车
目录 一.前言 二.js代码实例演示 1.简易购物车01_数量变化 (1)实例代码 (2)效果演示 2.简易购物车02_数量价格同步 (1)实例代码 (2)效果演示 一.前言 上一篇介绍了DHTML对 ...
最新文章
- 企业如何选择音视频会议系统分析
- 2022-2028年中国互联网+汽车行业深度调研及投资前景预测报告
- linux 进程参数文件 /proc/pid/cmdline 简介
- Hbase API中常用类介绍和使用
- DSS转发中sdp文件的简化
- 025_JDK的hashCode方法
- java 无法注入service_SpringBoot集成shiro,MyRealm中无法@Autowired注入Service的问题
- TypeScript 常用的新玩法
- Xamarin效果第三篇之手机底部弹窗
- 面试官让我讲讲Java中的锁,我笑了
- python三角函数拟合_使用python进行数据拟合最小化函数
- tcp中的crc检验算法原理_CRC校验原理及其实现
- jquery name选择器_Jquery--1
- Officescan防毒墙安装部署手册
- jdk1.8 64位与32位免费下载
- macOS图像文件不能正常显示缩略图预览怎么办?
- [ERP/鼎捷E10][生产管理]指定完工
- 同步模式之保护性暂停
- java libjli.so_解决setcap导致Java加载libjli.so 失败问题
- 常见的一些计算机安全类词汇