邮箱注册网站查询,营销推广app,电商平台设计公司,天元建设集团有限公司工程前言#xff1a;纯个人记录使用。
搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。
参考纯个人记录使用。
搭建 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 Namespace2.2 Pods2.3 Deployment2.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负责存储集群中各种资源对象信息键值对形式。
Nodek8s集群工作节点。每个工作节点都有一个kubelet它管理本节点并且负责与Master主节点通信。每个节点上都需安装Docker相关服务。 kubelet 负责维护容器的生命周期通过控制docker来创建、更新、销毁容器负责Pod的创建、启动、监控、重启、销毁等工作同时与Master 节点通讯实现集群管理的基本功能。 kube-proxy实现集群内部服务发现和负载均衡代理应用的访问入口如jupyterhub应用。 docker负责pod容器应用。
Kubernetes 核心组件
etcd保存了整个集群的状态就是一个数据库apiserver 提供了资源操作的唯一入口并提供认证、授权、访问控制、API注册和发现等机制controller manager 负责维护集群的状态比如故障检测、自动扩展、滚动更新等scheduler 负责资源的调度、按照预定的调度策略将Pod调度到相应的机器上kubelet 负责维护容器的生命周期、同时负责VolumeCSI/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、重要资源实战 kubectlk8s集群命令行工具 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 资源操作类型 # 查看集群所有资源对象
[rootk8s-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使用量、内存使用量等等来实现租户可用资源的管理。 # 查看所有命名空间
[rootk8s-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 # 人为自定义集群资源可视化命名空间
# 查看命名空间中资源
[rootk8s-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# 创建命名空间
[rootk8s-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所属的命名空间,默认为defaultlabels: #自定义标签列表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名称以keysecretkey格式指定- 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: stringpod创建 # 创建一个含 nginx1.20 和busybox:1.30的pod
[rootk8s-master /data/s0/kubernetes/test]$ kubectl explain pod.spec.containers.volumeMounts # 可查看yaml配置文件相关参数
[rootk8s-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
[rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f pod_nginx_busybox.yaml pod/pod-nginx-busybox created# 查看pod
[rootk8s-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# 查看服务
[rootk8s-master /data/s0/kubernetes/test]$ curl 10.244.235.214:80
!DOCTYPE html
html
head
titleWelcome to nginx!/title...
pemThank you for using nginx./em/p
/body
/html# 查看容器外部挂载目录
[rootk8s-master /data/s0/kubernetes/test]$ ls /data/s0/kubernetes/test/logs
access.log error.log log.txt pod删除 # 删除pods
[rootk8s-master /data/s0/kubernetes/test]$ kubectl delete -f pod_nginx_busybox.yaml
kubectl delete -f pod_nginx_busybox.yaml2.3 Deployment Deploymentkubernetes很少直接控制Pod一般都是通过Pod控制器来完成的。Deployment是其中一种pod控制器。 Deployment 控制器并不直接管理Pod而是通过管理ReplicaSet来间接管理Pod即Deployment管理ReplicaSetReplicaSet管理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 ReplicaSetRS作用是保证一定数量的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: 80deployment 创建与使用 # deployment yaml文件创建
[rootk8s-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 生成
[rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f deploy-nginx.yaml
deployment.apps/deploy-nginx created# deployment 查看
[rootk8s-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
[rootk8s-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 appnginx-pod,pod-template-hash59b4f66f9c
# 查看 pod
[rootk8s-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
# 查看历史版本
[rootk8s-master /data/s0/kubernetes/test]$ kubectl rollout history deployment deploy-nginx -n test
REVISION CHANGE-CAUSE
1 nginx:1.20 deployment 版本更新与回退 # nginx 版本升级
[rootk8s-master /data/s0/kubernetes/test]$ vim deploy-nginx.yaml
nginx:1.20 -- nginx:1.21
[rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f deploy-nginx.yaml
# 查看pod变化 - pod 分批滚动更新
[rootk8s-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
# 查看历史版本
[rootk8s-master /data/s0/kubernetes/test]$ kubectl rollout history deployment deploy-nginx -n test
REVISION CHANGE-CAUSE
1 nginx:1.20
2 nginx:1.21# 版本回退
[rootk8s-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 appnginx-pod,pod-template-hash5f475b845c
deploy-nginx-785b98f9c6 3 3 3 2m22s nginx nginx:1.21 appnginx-pod,pod-template-hash785b98f9c6[rootk8s-master /data/s0/kubernetes/test]$ kubectl rollout undo deployment deploy-nginx --to-revision1 -n test
deployment.apps/deploy-nginx rolled back# 查看版本回退效果
[rootk8s-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 appnginx-pod,pod-template-hash5f475b845c
deploy-nginx-785b98f9c6 0 0 0 15m nginx nginx:1.21 appnginx-pod,pod-template-hash785b98f9c6 deployment 清除 [rootk8s-master /data/s0/kubernetes/test]$ kubectl delete -f deploy-nginx.yaml
deployment.apps deploy-nginx deleted2.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服务创建
# 设置共享目录
[rootk8s-node1 /data/s0/kubernetes/nfs]$ vim /etc/exports
/data/s0/kubernetes/nfs 192.168.10.0/24(rw,no_root_squash) # 设置共享网段
[rootk8s-node1 /data/s0/kubernetes/nfs]$ chmod 777 -R /data/s0/kubernetes/nfs
# 加载配置
[rootk8s-node1 /data/s0/kubernetes/nfs]$ exportfs -r
# 服务启动
[rootk8s-node1 /data/s0/kubernetes/nfs]$ systemctl start rpcbind
[rootk8s-node1 /data/s0/kubernetes/nfs]$ systemctl start nfs# 其他需要存储的节点安装nfs-utils目的可以驱动NFS设备
# 在其他节点测试共享是否成功
[rootk8s-master /data/s0/kubernetes]$ showmount -e k8s-node1
[rootk8s-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: stringreadOnly: 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 共享目录设置
[rootk8s-node1 /data/s0/kubernetes/test]$ mkdir -pv /data/s0/kubernetes/nfs/{pv1,pv2,pv3,pv4,pv5}
[rootk8s-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)
[rootk8s-node1 /data/s0/kubernetes/test]$ exportfs -r# pv创建
[rootk8s-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 [rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f pv.yaml
persistentvolume/pv1 created
persistentvolume/pv2 created
persistentvolume/pv3 created
# 查看pvs
[rootk8s-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 23sPVC创建 # PVC 应用资源请求
[rootk8s-master /data/s0/kubernetes/test]$ vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc1namespace: test
spec:accessModes:- ReadWriteManystorageClassName: highresources: requests:storage: 2Gi
[rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f pvc.yaml
persistentvolumeclaim/pvc1 created
# 查看pv存储卷PVC在pvs中查找存储类型一致、且最低符合存储容量要求的pv进行绑定
[rootk8s-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 持久化存储
[rootk8s-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
[rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f deploy-nginx.yaml
# 查看pod
[rootk8s-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
# 查看共享卷
[rootk8s-node1 /data/s0/kubernetes]$ ls nfs/pv2
access.log error.log2.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
[rootk8s-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
[rootk8s-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
[rootk8s-master /data/s0/kubernetes/test]$ kubectl apply -f nginx-svc.yaml
service/svc created
# 查看服务
[rootk8s-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 appnginx-pod# 测试服务
[rootk8s-master /data/s0/kubernetes/test]$ curl k8s-node1:30080
!DOCTYPE html
html
head
titleWelcome to nginx!/title
...
pFor online documentation and support please refer to
a hrefhttp://nginx.org/nginx.org/a.br/
Commercial support is available at
a hrefhttp://nginx.com/nginx.com/a./p
pemThank you for using nginx./em/p
/body
/html