Zero to JupyterHub with Kubernetes中篇 - Kubernetes 常规使用记录
前言:纯个人记录使用。
- 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。
- 搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。
- 搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。
参考: https://www.yuque.com/fairy-era/yg511q/xyqxge
文章目录
- 1、Kubernets介绍
- 1.1 简介
- 1.2 架构与组件
- 2、重要资源实战
- 2.1 Namespace
- 2.2 Pods
- 2.3 Deployment
- 2.4 pvc 和 pv 数据存储
- 2.5 Service
1、Kubernets介绍
1.1 简介
Kubernetes是Google 团队发起的一个开源项目,用于自动部署、扩展和管理容器化(docker)的应用程序。主要目的是管理跨多个主机的容器。
Kubernetes 中的绝大多数概念都抽象成 Kubernetes 管理的一种资源对象(一切皆资源)。
1.2 架构与组件
Master : 负责管理集群,协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。
- kube-apiserver:集群控制的访问入口,提供HTTP REST服务。
- kube-controller-manager:集群中所有资源对象的自动化控制中心,负责维护集群的状态,比如程序部署、故障检测、自动扩展、滚动更新等。
- kube-scheduler:负责集群资源调度,按照策略将Pod调度到相应node上。
- etcd:负责存储集群中各种资源对象信息(键值对形式)。
Node:k8s集群工作节点。每个工作节点都有一个kubelet,它管理本节点并且负责与Master主节点通信。每个节点上都需安装Docker相关服务。
-
kubelet :负责维护容器的生命周期,通过控制docker来创建、更新、销毁容器(负责Pod的创建、启动、监控、重启、销毁等工作),同时与Master 节点通讯,实现集群管理的基本功能。
-
kube-proxy:实现集群内部服务发现和负载均衡(代理应用的访问入口,如jupyterhub应用)。
-
docker:负责pod容器应用。
Kubernetes 核心组件:
- etcd:保存了整个集群的状态,就是一个数据库
- apiserver :提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
- controller manager: 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
- scheduler :负责资源的调度、按照预定的调度策略将Pod调度到相应的机器上
- kubelet :负责维护容器的生命周期、同时负责Volume(CSI/Container Storage Interface)和网络(CNI/Container Network Interface)的管理
- kube-proxy :负责为Service提供cluster 内部的服务发现和负载均衡
- docker:负责镜像管理以及Pod和容器的真正运行(CRI/Container R untime Interface)
其他插件:
-
Dashboard :提供集群GUI
-
Metrics-scraper: 为Dashboard提供资源监控
-
Ingress Controller :为服务提供外网接口
-
Coredns: 负责为整个集群提供DNS服务
2、重要资源实战
-
kubectl:k8s集群命令行工具
kubectl [command] [type] [name] [flags]
● command:指定要对资源执行的操作,比如create、get、delete。
● type:指定资源的类型,比如deployment、pod、service。
● name:指定资源的名称,名称大小写敏感。
● flags:指定额外的可选参数。-
command 资源操作命令
# 基本命令 create 创建一个资源 edit 编辑一个资源 get 获取一个资源 patch 更新一个资源 delete 删除一个资源 explain 解释展示资源文档# 运行调试命令 run 在集群中运行一个指定的镜像 expose 暴露资源为Service,常用于暴露应用端口 describe 显示资源内部信息 logs 输出容器在Pod中的日志 attach 连接运行中的容器,通常用于与正在运行的进程进行交互,查看进程的输出或向进程发送输入。 exec 执行容器中的一个命令(bin/bash) 参数 -i(interactive)交互式 ,-t 启用伪终端 cp 在Pod内外复制文件 rollout 管理版本的发布 scale 扩(缩)容Pod的数量 autoscale 自动调整Pod的数量# 高级命令 apply 通过yaml文件对资源进行配置 label 更新资源上的标签# 其他 cluster-info 集群信息 显示集群信息 version 显示当前Client和Server的版本 api-resources 查看集群资源对象
-
type 资源操作类型
# 查看集群所有资源对象 [root@k8s-master ~/test]$ kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND namespaces ns v1 false Namespace pods po v1 true Pod nodes no v1 false Node # Pod资源控制器 replicasets rs apps/v1 true ReplicaSet deployments deploy apps/v1 true Deployment # 负载均衡和服务发现 services svc v1 true Service ingresses ing extensions/v1beta1 true Ingress # 资源存储 persistentvolumeclaims pvc v1 true PersistentVolumeClaim persistentvolumes pv v1 false PersistentVolume...
-
-
常规使用方式
# 创建或更新资源 kubectl apply -f xxx.yaml # 删除资源 kubectl delete -f xxx.yaml # 查看资源 kubectl get(describe) 资源名称
2.1 Namespace
-
Namespace:命名空间,用于进行资源隔离。
-
kubernetes系统中一种非常重要的资源,它的主要作用是用来实现
多套系统的资源隔离
或者多租户的资源隔离
。 -
默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
-
可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
# 查看所有命名空间 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get namespace NAME STATUS AGE default Active 7d5h # 所有未指定的Namespace的对象都会被分配在default命名空间。 kube-node-lease Active 7d5h # 集群节点之间的心跳维护,v1.13开始引入。 kube-public Active 7d5h # 此命名空间的资源可以被所有人访问(包括未认证用户)。 kube-system Active 7d5h # 所有由kubernetes系统创建的资源都处于这个命名空间(calico网络pod) kubernetes-dashboard Active 2d1h # 人为自定义集群资源可视化命名空间 # 查看命名空间中资源 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pods -n kubernetes-dashboard -o wide(/json/yaml:结果输出形式) NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dashboard-metrics-scraper-7b59f7d4df-l6ngh 1/1 Running 0 28d 10.244.235.195 k8s-master <none> <none> kubernetes-dashboard-548f88599b-k7824 1/1 Running 1 28d 10.244.169.132 k8s-node2 <none> <none># 创建命名空间 [root@k8s-master /data/s0/kubernetes/test]$ kubectl create ns test namespace/test created
-
2.2 Pods
- pods: Pod 是Kubernetes调度的基本单位,是一组紧密相关的容器集合(至少一个),它们共享PID、IPC、Network 和 namespace。Pod 设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通讯和文件共享这种简单高效的方式组合完成整个服务。每个Pod可以由一个或多个业务容器和一个根容器(Pause)组成。一个Pod表示某个应用的一个实例。
-
Pod 创建与删除
-
pod资源清单
apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,资源类型,例如 Pod metadata: #必选,元数据name: string #必选,Pod名称namespace: string #Pod所属的命名空间,默认为"default"labels: #自定义标签列表name: string spec: #必选,Pod中容器的详细定义containers: #必选,Pod中容器列表- name: string #必选,容器名称image: string #必选,容器的镜像名称imagePullPolicy: [ Always|IfNotPresent|Never] #获取镜像的策略,always:总是从镜像仓库拉取;IfNotPresent:优先使用本地镜像,无再从镜像仓库拉取;Never 只使用本地镜像 command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令args: [string] #容器的启动命令参数列表workingDir: string #容器的工作目录volumeMounts: #挂载到容器内部的存储卷配置- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符readOnly: boolean #是否为只读模式ports: #需要暴露的端口库号列表- name: string #端口的名称containerPort: int #容器需要监听的端口号hostPort: int #容器所在主机需要监听的端口号,默认与Container相同protocol: string #端口协议,支持TCP和UDP,默认TCPenv: #容器运行前需设置的环境变量列表- name: string #环境变量名称value: string #环境变量的值resources: #资源限制和请求的设置limits: #资源限制的设置cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数requests: #资源请求的设置cpu: string #Cpu请求,容器启动的初始可用数量memory: string #内存请求,容器启动的初始可用数量lifecycle: #生命周期钩子postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器exec: #对Pod容器内检查方式设置为exec方式command: [string] #exec方式需要制定的命令或脚本httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、portpath: stringport: numberhost: stringscheme: stringHttpHeaders:- name: stringvalue: stringtcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式port: numberinitialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次successThreshold: 0failureThreshold: 0securityContext:privileged: falserestartPolicy: [Always | Never | OnFailure] #Pod的重启策略nodeName: <string> #设置NodeName表示将该Pod调度到指定到名称的node节点上nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定- name: stringhostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络volumes: #在该pod上定义共享存储卷列表- name: string #共享存储卷名称 (volumes类型有很多种)emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值hostPath: #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录path: string #Pod所在宿主机的目录,将被用于同期中mount的目录type: DirectoryOrCreate # 目录存在就使用,不存在就先创建再使用secret: #类型为secret的存储卷,挂载集群与定义的secret对象到容器内部scretname: string items: - key: stringpath: stringconfigMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部name: stringitems:- key: stringpath: string
-
pod创建
# 创建一个含 nginx:1.20 和busybox:1.30的pod [root@k8s-master /data/s0/kubernetes/test]$ kubectl explain pod.spec.containers.volumeMounts # 可查看yaml配置文件相关参数 [root@k8s-master /data/s0/kubernetes/test]$ vim pod_nginx_busybox.yaml apiVersion: v1 kind: Pod metadata:name: pod-test # 名字不要含下划线namespace: testlabels:app: nginx spec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresent # 优先使用本地镜像(注意P字母大小写)volumeMounts: # 将主机存储地址路径,挂载到容器对应目录- name: host-path mountPath: /var/log/nginx # 容器内路径 - name: busyboximage: busybox:1.30imagePullPolicy: Never # 只使用本地镜像command: ["/bin/sh","-c","touch /logs/log.txt;while true;do /bin/echo $(date +%T) >> /logs/log.txt;sleep 5;done;"] # 容器启动后,每隔5秒,把日期写入日志文件volumeMounts: - name: host-path mountPath: /logs volumes: # 声明 主机存储路径(将容器内数据持久化在pod所在主机上)- name: host-pathhostPath: path: /data/s0/kubernetes/test/logstype: DirectoryOrCreate # 如果目录不存在,就创建# 创建pod [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f pod_nginx_busybox.yaml pod/pod-nginx-busybox created# 查看pod [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pods -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-nginx-busybox 2/2 Running 0 73s 10.244.235.214 k8s-master <none> <none># 查看服务 [root@k8s-master /data/s0/kubernetes/test]$ curl 10.244.235.214:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>... <p><em>Thank you for using nginx.</em></p> </body> </html># 查看容器外部挂载目录 [root@k8s-master /data/s0/kubernetes/test]$ ls /data/s0/kubernetes/test/logs access.log error.log log.txt
-
pod删除
# 删除pods [root@k8s-master /data/s0/kubernetes/test]$ kubectl delete -f pod_nginx_busybox.yaml kubectl delete -f pod_nginx_busybox.yaml
-
2.3 Deployment
-
Deployment:kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Deployment是其中一种pod控制器。
Deployment 控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。
Deployment 确保任意时间都有指定数量的pod 副本在运行。如果为某个Pod创建了Deployment 并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Deploymen会替换它,保持总数为3,如果之前不响应的Pod恢复了,超出3个副本,Deployment 将终止其中一个保持总数为3。当创建Deployment 时,需要指定两个东西:
Pod模版:用来创建Pod副本的模版
Label标签:Deployment 需要监控的 Pod 的标签。(通过Label Selector控制相应label的pods)
- ReplicaSet(RS):作用是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对Pod数量的扩缩容。Deployment 控制器 在ReplicaSet控制器的基础上增加了版本更新或回退,应用发布的停止与继续。
-
**Label:**不是资源对象,是识别 Kubernetes资源对象的标签,以key:value的方式附加到对象上(key最长不能超过63字节,value可以为空,也可以是不超过253字节的字符串)。Label不提供唯一性,并且实际上经常很多对象(如pods对象)都是使用相同的label来标识具体的应用。 Label 定义好后其他对象可以使用Label Selector 来选择一组相同label的对象。
-
deployment 资源清单
apiVersion: apps/v1 # 版本号 kind: Deployment # 类型 metadata: # 元数据 name: <string> # rs名称 namespace: <string> # 所属命名空间 labels: <map[string]string> #标签 controller: deploy spec: # 详情描述 replicas: <integer> # 副本数量 revisionHistoryLimit: <integer> # 保留历史版本,默认为10 paused: false # 暂停部署,默认是false progressDeadlineSeconds: <integer> # 部署超时时间(s),默认是600 strategy: # 策略 type: Recreate/RollingUpdate # 滚动更新策略,默认滚动更新rollingUpdate: # 滚动更新 maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的Pod 的最大值,可以为百分比,也可以为整数 selector: # 选择器,通过它指定该控制器管理哪些pod matchLabels: <map[string]string> # Labels匹配规则 app: nginx-pod matchExpressions: # Expressions匹配规则 key: <string> # appoperator: <string> # In values: [nginx-pod] template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本 metadata:annotations: <map[string]string> # 版本备注deployment.kubernetes.io/revision: "1" # 定义版本号kubernetes.io/change-cause: "nginx:1.20" # 版本注释说明labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.21imagePullPolicy: IfNotPresentports: - containerPort: 80
-
deployment 创建与使用
# deployment yaml文件创建 [root@k8s-master /data/s0/kubernetes/test]$ vim deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx # deploy 名称 namespace: test labels: controller: deploy spec:replicas: 3 # 3个副本 revisionHistoryLimit: 3 paused: falseprogressDeadlineSeconds: 600 strategy:type: RollingUpdate rollingUpdate: maxSurge: 30% maxUnavailable: 30%selector:matchLabels: app: nginx-pod template: # pod 模板metadata:annotations: deployment.kubernetes.io/revision: "1" kubernetes.io/change-cause: "nginx:1.20" labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.20 imagePullPolicy: IfNotPresentports: - containerPort: 80volumeMounts: - name: host-path mountPath: /var/log/nginxvolumes: - name: host-pathhostPath: path: /data/s0/kubernetes/test/logs1type: DirectoryOrCreate # deployment 生成 [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f deploy-nginx.yaml deployment.apps/deploy-nginx created# deployment 查看 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get deploy -n test NAME READY UP-TO-DATE AVAILABLE AGE deploy-nginx 3/3 3 3 46s # 查看 replicaset [root@k8s-master /data/s0/kubernetes/test]$ kubectl get rs -n test -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR deploy-nginx-59b4f66f9c 3 3 3 3m18s nginx nginx:1.20 app=nginx-pod,pod-template-hash=59b4f66f9c # 查看 pod [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-nginx-59b4f66f9c-6jbv5 1/1 Running 0 4m20s 10.244.235.216 k8s-master <none> <none> deploy-nginx-59b4f66f9c-j8nzm 1/1 Running 0 4m20s 10.244.235.215 k8s-master <none> <none> deploy-nginx-59b4f66f9c-k7ng9 1/1 Running 0 4m20s 10.244.36.74 k8s-node1 <none> <none> # 查看历史版本 [root@k8s-master /data/s0/kubernetes/test]$ kubectl rollout history deployment deploy-nginx -n test REVISION CHANGE-CAUSE 1 nginx:1.20
-
deployment 版本更新与回退
# nginx 版本升级 [root@k8s-master /data/s0/kubernetes/test]$ vim deploy-nginx.yaml nginx:1.20 --> nginx:1.21 [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f deploy-nginx.yaml # 查看pod变化 - pod 分批滚动更新 [root@k8s-node1 /data/s0/kubernetes/test]$ kubectl get rs -n test -w deploy-nginx-5f475b845c-2v4fj 1/1 Running 0 72s deploy-nginx-5f475b845c-895c9 1/1 Running 0 72s deploy-nginx-5f475b845c-zdgnz 1/1 Running 0 72s deploy-nginx-785b98f9c6-2dv65 0/1 Pending 0 0s deploy-nginx-785b98f9c6-2dv65 0/1 Pending 0 0s deploy-nginx-785b98f9c6-2dv65 0/1 ContainerCreating 0 0s deploy-nginx-785b98f9c6-2dv65 0/1 ContainerCreating 0 1s deploy-nginx-785b98f9c6-2dv65 1/1 Running 0 2s deploy-nginx-5f475b845c-895c9 1/1 Terminating 0 115s deploy-nginx-785b98f9c6-6hvdb 0/1 Pending 0 0s deploy-nginx-785b98f9c6-6hvdb 0/1 Pending 0 0s deploy-nginx-785b98f9c6-6hvdb 0/1 ContainerCreating 0 0s deploy-nginx-785b98f9c6-6hvdb 0/1 ContainerCreating 0 1s deploy-nginx-785b98f9c6-6hvdb 1/1 Running 0 2s deploy-nginx-5f475b845c-2v4fj 1/1 Terminating 0 117s deploy-nginx-785b98f9c6-bbstf 0/1 Pending 0 0s deploy-nginx-785b98f9c6-bbstf 0/1 Pending 0 0s deploy-nginx-785b98f9c6-bbstf 0/1 ContainerCreating 0 0s deploy-nginx-5f475b845c-895c9 0/1 Terminating 0 117s deploy-nginx-785b98f9c6-bbstf 0/1 ContainerCreating 0 1s deploy-nginx-785b98f9c6-bbstf 1/1 Running 0 1s deploy-nginx-5f475b845c-zdgnz 1/1 Terminating 0 118s deploy-nginx-5f475b845c-2v4fj 0/1 Terminating 0 119s deploy-nginx-5f475b845c-2v4fj 0/1 Terminating 0 2m deploy-nginx-5f475b845c-2v4fj 0/1 Terminating 0 2m deploy-nginx-5f475b845c-zdgnz 0/1 Terminating 0 2m deploy-nginx-5f475b845c-zdgnz 0/1 Terminating 0 2m2s deploy-nginx-5f475b845c-zdgnz 0/1 Terminating 0 2m2s deploy-nginx-5f475b845c-895c9 0/1 Terminating 0 2m3s deploy-nginx-5f475b845c-895c9 0/1 Terminating 0 2m3s # 查看历史版本 [root@k8s-master /data/s0/kubernetes/test]$ kubectl rollout history deployment deploy-nginx -n test REVISION CHANGE-CAUSE 1 nginx:1.20 2 nginx:1.21# 版本回退 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get rs -n test -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR deploy-nginx-5f475b845c 0 0 0 4m15s nginx nginx:1.20 app=nginx-pod,pod-template-hash=5f475b845c deploy-nginx-785b98f9c6 3 3 3 2m22s nginx nginx:1.21 app=nginx-pod,pod-template-hash=785b98f9c6[root@k8s-master /data/s0/kubernetes/test]$ kubectl rollout undo deployment deploy-nginx --to-revision=1 -n test deployment.apps/deploy-nginx rolled back# 查看版本回退效果 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get rs -n test -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR deploy-nginx-5f475b845c 3 3 3 17m nginx nginx:1.20 app=nginx-pod,pod-template-hash=5f475b845c deploy-nginx-785b98f9c6 0 0 0 15m nginx nginx:1.21 app=nginx-pod,pod-template-hash=785b98f9c6
-
deployment 清除
[root@k8s-master /data/s0/kubernetes/test]$ kubectl delete -f deploy-nginx.yaml deployment.apps "deploy-nginx" deleted
-
2.4 pvc 和 pv 数据存储
容器持久化存储采用hostPath方式(表示挂载Pod所在宿主机的目录),但使用pod控制器重启或更新pod时,Pod可能别的Node节点启动,这样pod读写文件就找不到之前对应node文件。
-
nfs服务器
NFS是一个网络文件共享存储系统,可以搭建一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,这样,无论Pod在节点上怎么转移,只要Node和NFS的对接没有问题,数据就可以成功访问。
## nfs 安装包下载 # 联网环境下 # > yum install -y nfs-utils rpcbind # 离线安装(联网机器下载安装包,离线机器安装rpm) 联网机器 > yum reinstall --downloadonly --downloaddir ./ rpcbind /nfs-utils 离线机器 > rpm -ivh *.rpm# Nfs服务创建 # 设置共享目录 [root@k8s-node1 /data/s0/kubernetes/nfs]$ vim /etc/exports /data/s0/kubernetes/nfs 192.168.10.0/24(rw,no_root_squash) # 设置共享网段 [root@k8s-node1 /data/s0/kubernetes/nfs]$ chmod 777 -R /data/s0/kubernetes/nfs # 加载配置 [root@k8s-node1 /data/s0/kubernetes/nfs]$ exportfs -r # 服务启动 [root@k8s-node1 /data/s0/kubernetes/nfs]$ systemctl start rpcbind [root@k8s-node1 /data/s0/kubernetes/nfs]$ systemctl start nfs# 其他需要存储的节点安装nfs-utils,目的可以驱动NFS设备 # 在其他节点测试共享是否成功 [root@k8s-master /data/s0/kubernetes]$ showmount -e k8s-node1 [root@k8s-node2 /data/s0/kubernetes]$ showmount -e k8s-node1
-
PVC 和 PV 高级存储
PVC(Persistent Volume Claim):持久化卷请求声明,是用户向k8s系统发出的一种存储资源申请。
PV(Persistent Volume):持久化卷,是对底层的共享存储的一种抽象。
目的:隔离应用方与存储方,做到应用程序与底层存储解耦。
-
PV 与 PVC 资源清单
# PV 资源清单 apiVersion: v1 kind: PersistentVolume metadata:name: pv1 # 注意pv无需指定命名空间 spec:nfs: # 存储类型,和底层实际存储对应(NFS只是其中一种)path: <string>readOnly: false # 只读权限server: <string> -requiredcapacity: <map[string]string> # 存储能力,目前只支持存储空间的设置storage: 2GiaccessModes: <[]string> # 访问模式- ReadWriteOnce # 读写权限,允许单个节点- ReadOnlyMany # 只读权限,允许多个节点- ReadWriteMany # 读写权限,允许多个节点storageClassName: <string> # 存储类别,具有特定类型的PV只能和请求了该类别的PVC进行绑定persistentVolumeReclaimPolicy: <string> # 回收策略:Retain(保留)/Recycle(回收)/Delete(应用后端删除)# PVC 资源清单 apiVersion: v1 kind: PersistentVolumeClaim metadata:name: pvc1namespace: test spec:accessModes: <[]string> # 访问模式- selector: # 通过Label Selector的设置,可使PVC对于系统中已存在的PV进行筛选。storageClassName: # 存储类别resources: # 请求空间requests:storage: 5Gi
-
PV 与 PVC 创建使用
-
PV创建
# PV 存储资源创建: 两个2G,一个3G # nfs 共享目录设置 [root@k8s-node1 /data/s0/kubernetes/test]$ mkdir -pv /data/s0/kubernetes/nfs/{pv1,pv2,pv3,pv4,pv5} [root@k8s-node1 /data/s0/kubernetes/test]$ vim /etc/exports /data/s0/kubernetes/nfs/pv1 192.168.9.0/24(rw,no_root_squash) /data/s0/kubernetes/nfs/pv2 192.168.9.0/24(rw,no_root_squash) /data/s0/kubernetes/nfs/pv3 192.168.9.0/24(rw,no_root_squash) /data/s0/kubernetes/nfs/pv4 192.168.9.0/24(rw,no_root_squash) /data/s0/kubernetes/nfs/pv5 192.168.9.0/24(rw,no_root_squash) [root@k8s-node1 /data/s0/kubernetes/test]$ exportfs -r# pv创建 [root@k8s-master /data/s0/kubernetes/test]$ vim pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: pv1 spec:nfs: path: /data/s0/kubernetes/nfs/pv1readOnly: false server: k8s-node1capacity: storage: 2GiaccessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata:name: pv2 spec:nfs: path: /data/s0/kubernetes/nfs/pv2readOnly: false server: k8s-node1capacity: storage: 2GiaccessModes: - ReadWriteMany storageClassName: highpersistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata:name: pv3 spec:nfs: path: /data/s0/kubernetes/nfs/pv3readOnly: false server: k8s-node1capacity: storage: 3GiaccessModes: - ReadWriteMany storageClassName: highpersistentVolumeReclaimPolicy: Retain [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f pv.yaml persistentvolume/pv1 created persistentvolume/pv2 created persistentvolume/pv3 created # 查看pvs [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv1 2Gi RWX Retain Available 23s pv2 2Gi RWX Retain Available high 23s pv3 3Gi RWX Retain Available high 23s
-
PVC创建
# PVC 应用资源请求 [root@k8s-master /data/s0/kubernetes/test]$ vim pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: pvc1namespace: test spec:accessModes:- ReadWriteManystorageClassName: highresources: requests:storage: 2Gi [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f pvc.yaml persistentvolumeclaim/pvc1 created # 查看pv存储卷,PVC在pvs中查找存储类型一致、且最低符合存储容量要求的pv进行绑定 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv1 2Gi RWX Retain Available 3m58s pv2 2Gi RWX Retain Bound test/pvc1 high 3m58s pv3 3Gi RWX Retain Available high 3m58s
-
pod使用pvc
# deployment - pod 持久化存储 [root@k8s-master /data/s0/kubernetes/test]$ vim deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx # deploy 名称 namespace: test labels: controller: deploy spec:replicas: 3 # 3个副本 revisionHistoryLimit: 3 paused: falseprogressDeadlineSeconds: 600 strategy:type: RollingUpdate rollingUpdate: maxSurge: 30% maxUnavailable: 30%selector:matchLabels: app: nginx-pod template: # pod 模板metadata:annotations: deployment.kubernetes.io/revision: "1" kubernetes.io/change-cause: "nginx:1.20" labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.20 imagePullPolicy: IfNotPresentports: - containerPort: 80volumeMounts: - name: nfs-path mountPath: /var/log/nginxvolumes: - name: nfs-path # 使用pvc(nfs)persistentVolumeClaim: claimName: pvc1readOnly: false [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f deploy-nginx.yaml # 查看pod [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-nginx-6d8656f6d-2tzp2 1/1 Running 0 61s 10.244.36.80 k8s-node1 <none> <none> deploy-nginx-6d8656f6d-p9zr9 1/1 Running 0 63s 10.244.235.222 k8s-master <none> <none> deploy-nginx-6d8656f6d-s7cfr 1/1 Running 0 59s 10.244.36.81 k8s-node1 <none> <none> # 查看共享卷 [root@k8s-node1 /data/s0/kubernetes]$ ls nfs/pv2 access.log error.log
-
-
2.5 Service
-
**Service:**可以看做是一组同类pod对外的唯一访问接口,也是通过Label Selector 来选择一组相同label的对象。借助Service,应用可以方便的实现服务发现和负载均衡。
主要解决问题:
- Pod的IP会随着Pod的重建产生变化,服务ip不固定。
- Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问,service可以暴露服务端口且能实现负载均衡。
- Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行了一个kube-proxy的服务进程。当创建Service的时候会通过API Server向etcd写入创建的Service的信息,而kube-proxy会基于监听的机制发现这种Service的变化,然后它会将最新的Service信息转换为对应的访问规则。
-
Service 创建与使用
-
Service 资源清单
apiVersion: v1 # 版本 kind: Service # 类型 metadata: # 元数据name: <string> # 资源名称namespace: <string> # 命名空间 spec:selector: <map[string]string> # 标签选择器,用于确定当前Service代理那些Podapp: nginxtype: <string> # Service的类型,指定Service的访问方式 ClusterIP/NodePort/LoadBalancer/ExternalNameclusterIP: <string> # 虚拟服务的IP地址sessionAffinity: <string> # session亲和性,支持ClientIP、None两个选项,默认值为Noneports: <[]Object> # 端口信息- port: 8080 # Service端口protocol: TCP # 协议targetPort : # Pod端口nodePort: # 主机端口
-
Service 创建
# 查看现有pod [root@k8s-master /data/s0/kubernetes/test]$ kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-nginx-6d8656f6d-2tzp2 1/1 Running 0 55m 10.244.36.80 k8s-node1 <none> <none> deploy-nginx-6d8656f6d-p9zr9 1/1 Running 0 55m 10.244.235.222 k8s-master <none> <none> deploy-nginx-6d8656f6d-s7cfr 1/1 Running 0 55m 10.244.36.81 k8s-node1 <none> <none># 配置Service [root@k8s-master /data/s0/kubernetes/test]$ vim nginx-svc.yaml apiVersion: v1 kind: Service metadata: name: svc namespace: test spec:selector: app: nginx-podtype: NodePortports:- port: 8080 protocol: TCP targetPort: 80 nodePort: 30080 # 启动Service [root@k8s-master /data/s0/kubernetes/test]$ kubectl apply -f nginx-svc.yaml service/svc created # 查看服务 [root@k8s-master /data/s0/kubernetes/test]$ kubectl get svc -n test -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc NodePort 10.0.0.240 <none> 8080:30080/TCP 52s app=nginx-pod# 测试服务 [root@k8s-master /data/s0/kubernetes/test]$ curl k8s-node1:30080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ... <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>
-
相关文章:
Zero to JupyterHub with Kubernetes中篇 - Kubernetes 常规使用记录
前言:纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 参考&…...
WordCloud去掉停用词(fit_words+generate)的2种用法
-------------词云图集合------------- WordCloud去掉停用词(fit_wordsgenerate)的2种用法 通过词频来绘制词云图(jiebaWordCloud) Python教程95:去掉停用词词频统计jieba.tokenize示例用法 将进酒—李白process_t…...
Python 中如何处理异常?
在Python中,异常处理是一种重要的编程技术,它允许开发者优雅地处理程序运行过程中出现的错误或异常情况,而不是让程序直接崩溃。 通过异常处理,我们可以使程序更加健壮、用户友好。 异常处理的基本结构 Python中最基本的异常处…...
C++——多态(下)
目录 引言 多态 4.多态的原理 4.1 虚函数表指针 4.2 多态的原理 5.单继承和多继承关系的虚函数表 5.1 单继承中的虚函数表 5.2 多继承中的虚函数表 结束语 引言 接下来我们继续学习多态。 没有阅读多态(上)的可以点击下面的链接哦~ C——多态…...
qsort函数详解+代码展示
文章目录 概要系列文章目录前言(1) 定义(2) 使用(举例子 上代码)1、定义数组:2、定义比较函数:3、调用 qsort:4、输出结果: (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数,&#x…...
leetcode hot100【LeetCode 136. 只出现一次的数字】java实现
LeetCode 136. 只出现一次的数字 题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 …...
(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发
摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品,从而也带动了一系列与此相关产业,是人们的生活发生了翻天覆地的变化,而网络化的出现也在改变着人们传统的生活方式,包括工作,学习,社交…...
对抗攻击算法:FGSM和PGD
FGSM 传送门 FGSM 利用了梯度上升的思想,通过损失函数相对于输入图像的梯度来找到 最容易 迷惑网络的方向,并沿着这个方向对图像进行微小的扰动。 FGSM 的基本想法是,沿着这个梯度的符号方向对图像进行微调,以最大化损失函数。具…...
【八股文】小米
文章目录 一、vector 和 list 的区别?二、include 双引号和尖括号的区别?三、set 的底层数据结构?四、set 和 multiset 的区别?五、map 和 unordered_map 的区别?六、虚函数和纯虚函数的区别?七、extern C …...
xtu oj 众数
样例输入# 3 1 0 1 2 1 1 2 3 1 1 2 2样例输出# 1 2 3 解题思路:与数组大小有关,先排序 举个例子思考一下 n4 k2 数组为1 2 3 4 如果我们想让众数那个位的值为3(即max3),3出现的次数为3,即众数为3,需要修改多少次…...
ENVI计算ROI分离度为灰色compute roi separability
我们在使用ENVI做影像分类的时候,需要采集样本兴趣区(ROI),在采集完兴趣区需要计算样本ROI的分离度。 但是有时会发下你 计算ROI分离度的选项为灰色状态不能计算。 如果不是以下问题: “一个是必须首先选择或创建至少…...
Adaboost集成学习 | Python实现基于NuSVR-Adaboost多输入单输出回归预测
目录 效果一览基本介绍程序设计参考资料效果一览 基本介绍 基于NuSVR-Adaboost多输入单输出回归预测python代码 NuSVR是一种支持向量回归(SVR)算法的变体,用于解决回归问题。SVR是一种监督学习方法,它用于预测连续目标变量,而不是分类标签。NuSVR在SVR的基础上引入了一个…...
Python学习第十三天--面向对象,类和对象
一、面向过程和面向对象区别 面向过程:需要实现一个功能时,着重的是开发的步骤和过程,每个步都需要自己亲力亲为,需要编写代码(自己来做) 面向对象:需要实现一个功能时,不注重的是…...
AI运用落地思考:如何用AI进行系统运维?
1. 故障预测与预防 数据收集与分析:通过收集系统的各种运行数据,如服务器性能指标(CPU使用率、内存占用、磁盘I/O等)、网络流量数据、应用程序日志等。利用AI算法对这些海量数据进行分析,挖掘数据中的模式和相关性。例…...
springboot学习-分页/排序/多表查询的例子
最近喜欢上了springboot,真是个好的脚手架。今天继续学习分页/排序/多表查询等复杂功能。按步骤记录如下. 按步骤做的发现不可用,最终还是用的jdbctemplate解决。这也是一次经验。总计在最后。 1.maven依赖 首先从https://start.spring.io/ 选择需要的…...
windows 应用 UI 自动化实战
UI 自动化技术架构选型 UI 自动化是软件测试过程中的重要一环,网络上也有很多 UI 自动化相关的知识或资料,具体到 windows 端的 UI 自动化,我们需要从以下几个方面考虑: 开发语言 毋庸置疑,在 UI 自动化测试领域&am…...
ffmpeg命令详解
原文网址:ffmpeg命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍ffmpeg命令的用法。 命令示例 1.mp4和avi的基本互转 ffmpeg -i D:\input.mp4 E:\output.avi ffmpeg -i D:\input.avi E:\output.mp4 -i 表示input,即输入。后面填一个输入地址和一…...
【漏洞复现】CVE-2022-43396
漏洞信息 NVD - CVE-2022-43396 In the fix for CVE-2022-24697, a blacklist is used to filter user input commands. But there is a risk of being bypassed. The user can control the command by controlling the kylin.engine.spark-cmd parameter of conf. 背景介绍…...
文件的摘要算法(md5、sm3、sha256、crc)
为了校验文件在传输中保证完整性和准确性,因此需要发送方先对源文件产生一个校验码,并将该值传输给接收方,将附件通过ftph或http方式传输后,由接收方使用相同的算法对接收文件再获取一个新的校验码,将该值和发送方传的…...
如何借助AI生成PPT,让创作轻松又高效
PPT是现代职场中不可或缺的表达工具,但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作,常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化,还重新定义了效率与创意的关系…...
云技术-docker
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…...
对docker安装的mysql实现主从同步
1:分别安装mysql主,从数据库 将主库容器名称改为mysql_master,将从库容器名称改为mysql_slave 安装教程:docker安装mysql 2:配置主库的my.cnf挂载文件 [mysqld] #log-bin:表示启用binlog功能,并指定二进制日志的存储目录。 log-binmysql-bin #binlog_f…...
【不定长滑动窗口】【灵神题单】【刷题笔记】
采摘水果 fruits[i]表示第i棵树上的水果种类目的是尽可能多收集水果规矩: 只有两个篮子,且每个篮子只能装一种水果,但是每个篮子能装的总量没限制一旦开始采摘,就会连续采摘,把两个篮子都用掉也就是说,采摘到最后一颗…...
AI写论文指令
一、论文选题指令 1、确定研究对象:我是一名xxx,请从以下素材内容中,结合xx相关知识,提炼出可供参考的学术概念 。以下是结合素材内容,提炼出的几个可供参考的学术概念 概念a:概念b:概念C&…...
2625扁平化嵌套数组
请你编写一个函数,它接收一个 多维数组 arr 和它的深度 n ,并返回该数组的 扁平化 后的结果。 多维数组 是一种包含整数或其他 多维数组 的递归数据结构。 数组 扁平化 是对数组的一种操作,定义是将原数组部分或全部子数组删除,…...
QT6学习第五天 第一个QT Quick程序
QT6学习第五天 第一个QT Quick程序 概述创建Qt Quick程序使用Qt资源文件 概述 如果将程序的用户界面成为前端,程序的数据存储和逻辑业务成为后端,那么传统QT Widgets程序的前后端都是用C完成的。对于现代软件开发而言,前端演化速度远快于后端…...
【开发商城系统】
在广西开发商城系统,可以按照以下步骤进行: 确定项目需求:与客户沟通,了解商城系统所需的功能和特性,并确定项目的预算和时间限制。 进行市场调研:了解广西地区的电商市场情况,包括竞争对手、消…...
(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)
文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前,请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…...
C++ 11重点总结1
智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…...
海康VsionMaster学习笔记(学习工具+思路)
一、前言 VisionMaster算法平台集成机器视觉多种算法组件,适用多种应用场景,可快速组合算法,实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀,自带强大的视觉分析工具库,可…...
网站推广的主要方法/seo网站seo
楼主工作的单位是一家欧洲公司,主营奢侈品的生产和销售,我们有一个PLM(产品生命周期管理系统),用来管理产品的主数据,例如对部品及物料从设计到生产,以及BOM等主数据的管理,我们采购…...
北京网站建设公司网络营销外包网络建站报价/免费网站模板网
1.Redis 事务是什么 可以一次执行多个命令,本质是一组命令的集合。一个事务中的,所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。 2.Redis 事务的作用 一个队列中,一次性、顺序性、排他性的执行…...
常州专业网站建设公司咨询/怎么在百度上推广产品
Linux Read ACPI Table Tools.ACPI tools的安装:#yum install acpica-tools或者到下面链接下载源码:下面示例是解析SSDT1表的步骤。#acpidump -o ACPI_table.out#acpixtract -a ACPI_table.outIntel ACPI Component ArchitectureACPI Binary Table Extra…...
温州网站建设专业的公司/网络营销企业案例
用OpenInventor实现的NeHe OpenGL教程-第八课这节课我们将在第七节课的基础上增加纹理透明的效果。在OpenGL中,透明效果是通过“融合”(Blend)方式实现的。在NeHe教程中已经对融合的原理做了详细的讨论。这里我们就不再详细讨论了…...
番禺建设银行网站/百度科技有限公司
1. ls 查看命令 是list的缩写 ---以查看文件权限(包括目录、文件夹、文件权限)查看目录信息 (1) ls -a 列出目录所有文件,包含以 . 开头的隐藏文件 2. cd 切换目录命令 是changeDirectory的缩写 ---切换目录 (1࿰…...
网站建设哪个品牌好/2345网址导航下载桌面
题目背景 大家都知道,基因可以看作一个碱基对序列。它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。 在一个人类基因工作组的任务中,生物学家研究的是&#…...