分成型网站建设python做项目的网站

当前位置: 首页 > news >正文

分成型网站建设,python做项目的网站,网站制作产品优化,php网站建设 关键技术文章目录 一、Namespace1、概述2、预定义的k8s命名空间2.1、default2.2、kube-public2.3、kube-system2.4、kube-node-lease 3、命名空间基本操作3.1、查看3.1.1、查看所有的命名空间3.1.2、查看指定的命名空间3.1.3、指定输出格式3.1.4、查看ns详情 3.2、创建3.2.1、命令行创建… 文章目录 一、Namespace1、概述2、预定义的k8s命名空间2.1、default2.2、kube-public2.3、kube-system2.4、kube-node-lease 3、命名空间基本操作3.1、查看3.1.1、查看所有的命名空间3.1.2、查看指定的命名空间3.1.3、指定输出格式3.1.4、查看ns详情 3.2、创建3.2.1、命令行创建3.2.2、通过yaml资源清单创建 3.3、删除3.3.1、命令式对象配置删除3.3.2、命令式对象管理删除 3.4、资源限额3.4.1、配置资源含义 二、Pod1、概述2、Pod结构3、Pod的资源清单4、Pod基本操作4.1、查看4.1.1、查看k8s集群中系统运行的pod4.1.2、查看指定命名空间下所有的Pod、Services以及Deployments4.1.3、查看某种资源可以配置的一级属性4.1.4、查看属性的子属性 4.2、创建4.2.1、命令方式启动4.2.2、创建yaml配置文件启动4.2.3、直接创建pod通过yaml资源清单4.2.4、直接创建kubectl run 4.3、查看创建的pod信息4.3.1、查看Pod基本信息4.3.2、查看Pod的详细信息 4.4、访问4.4.1、获取Pod的IP4.4.2、访问Pod 4.5、删除4.5.1、直接删除Pod4.5.2、删除通过控制器创建的pod 4.6、资源限制4.6.1、创建命名空间4.6.2、创建资源配额对象4.6.3、将命名空间和资源配额对象绑定4.6.4、查看命名空间对应的资源配额对象信息4.6.5、编写yaml配置文件创建pod4.6.6、再次查看资源配额对象4.6.7、尝试创建第二个pod 三、Label1、概述1.1、示例 2、设计目的3、常见的标签示例4、标签的语法4.1、前缀4.2、名称4.3、有效的标签值4.3、示例4.3.1、有 environment: production 和 app: nginx 两个标签的Pod资源清单 5、Label selector(标签选择器)5.1、基于等式的Label selector5.1.1、示例 5.2、基于集合的Label selector5.2.1、示例 5.3、注意事项 6、基本操作6.1、使用帮助6.2、为Pod资源打标签6.3、为Pod资源更新标签6.4、查看标签6.5、筛选标签6.6、删除标签6.7、配置6.7.1、创建yaml资源清单6.7.2、删除 四、Deployment1、概述2、基本操作2.1、命令格式2.2、使用帮助2.3、查看deployment信息2.4、查看deployment的详细信息2.5、删除2.6、配置2.6.1、创建yaml资源清单2.6.2、创建2.6.3、删除 2.7、扩缩容增加减少pod副本数2.7.1、通过yaml资源清单修改副本数2.7.2、edit deployment实现在线更新2.7.3、scale deployment实现扩缩容 五、Service1、概述2、基本操作2.1、创建集群内部可以访问的Service2.2、创建集群外部也可以访问的Service2.3、删除Service2.4、配置2.4.1、创建yaml资源清单2.4.2、创建2.4.3、删除 一、Namespace 1、概述 命名空间namespace是Kubernetes中的一种资源对象用于将集群中的资源进行逻辑分组和隔离。它可以看作为一个虚拟集群将物理集群划分为多个逻辑部分每个部分都有自己的一组资源如Pod、Service、ConfigMap等。 每一个添加到Kubernetes集群的工作负载必须放在一个命名空间中。命名空间为集群中的对象名称赋予作用域。虽然在命名空间中名称必须是唯一的但是相同的名称可以在不同的命名空间中使用。 2、预定义的k8s命名空间 2.1、default 当创建资源时如果没有明确指定 Namespace默认就会被创建在这个命名空间中。在创建替代的命名空间之前该命名空间会充当用户新添加资源的主要目的地无法删除。 2.2、kube-public 所有的用户包括未经身份验证的用户都可以读取该命名空间。 该命名空间主要预留为集群使用以便某些资源需要在整个集群中可见可读。 2.3、kube-system kube-system命名空间专门用于托管Kubernetes系统组件DNS如 CoreDNS、网络插件如 Flannel 或 Calico、API 服务器代理、监控系统如 Prometheus operator以及其他管理和运维相关的组件。 一般规则是避免向该命名空间添加普通的工作负载。它一般由系统直接管理因此具有相对宽松的策略。 2.4、kube-node-lease v1.13开始引入 用于存储节点租约Node Lease对象。节点租约是节点用来向控制面证明自身活跃状态的一种机制。节点租约允许 kubelet 发送心跳 由此控制面能够检测到节点故障。 3、命名空间基本操作 3.1、查看 3.1.1、查看所有的命名空间 kubectl get ns3.1.2、查看指定的命名空间 kubectl get ns ns名称3.1.3、指定输出格式 kubectl get ns ns名称 -o 格式参数kubernetes支持的格式有很多比较常见的是wide、json、yaml yaml格式json格式wide格式 3.1.4、查看ns详情 kubectl describe ns ns名称#查看命名空间default详情 [rootk8s-master ~]# kubectl describe ns default Name: default Labels: kubernetes.io/metadata.namedefault Annotations: none Status: Active #Active 命名空间正在使用中 Terminating 正在删除命名空间No resource quota. #ResourceQuota:针对namespace做的资源限制No LimitRange resource. #LimitRange:针对namespace中的每个组件做的资源限制3.2、创建 3.2.1、命令行创建 kubectl create ns dev13.2.2、通过yaml资源清单创建 编写dev2.yaml资源配置文件 cat dev2.yaml— apiVersion: v1 kind: Namespace metadata:name: dev2通过apply进行创建 kubectl apply -f dev2.yaml通过create进行创建 简单修改yaml资源配置文件
cat dev3.yaml— apiVersion: v1 kind: Namespace metadata:name: dev3kubectl create -f dev3.yaml查看命名空间 kubectl get ns dev1 kubectl get ns dev2 kubectl get ns dev33.3、删除 3.3.1、命令式对象配置删除 kubectl delete -f dev3.yaml3.3.2、命令式对象管理删除 kubectl delete ns dev1 dev23.4、资源限额 可以通过Resource Quota来限制Namespace中资源的使用资源配额是一种控制机制可以限制Namespace中资源使用量包括CPU、内存、存储等。 资源限制可以针对Namespace中所有Pod进行限制也可以针对单个Pod进行限制 3.4.1、配置资源含义 资源名称描述limits.cpu所有非终止状态的 Pod其 CPU 限额总量不能超过该值。limits.memory所有非终止状态的 Pod其内存限额总量不能超过该值。requests.cpu所有非终止状态的 Pod其 CPU 需求总量不能超过该值。requests.memory所有非终止状态的 Pod其内存需求总量不能超过该值。hugepages-size对于所有非终止状态的 Pod针对指定尺寸的巨页请求总数不能超过此值。cpu与 requests.cpu 相同。memory与 requests.memory 相同。 关于Namespace的资源限额演示将结合下面的Pod来示例 二、Pod 1、概述 Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod就像在鲸鱼荚或者豌豆荚中是一组一个或多个 容器 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置colocated的并且一同调度在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”其中包含一个或多个应用容器 这些容器相对紧密地耦合在一起。 除了应用容器Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 也可以注入临时性容器来调试正在运行的 Pod。 其他的资源对象都是用来支撑或者扩展Pod 对象功能的比如 控制器对象是用来管控Pod 对象的 Service 或者Ingress 资源对象是用来暴露Pod 引用对象的 PersistentVolume 资源对象是用来为Pod提供存储 2、Pod结构 依据Pod结构可以看出pod内部可以包含一个或者多个容器,容器类型分为两部分 用户容器:用户以容器形式运行的程序,数量可以多可以少Pause:Pod根容器,每个pod都会拥有 命名空间共享Pause容器负责初始化并管理Pod级别的Linux命名空间如网络namespace、PID namespace等。这意味着Pod内的所有容器都共享相同的网络接口、IP地址、端口范围、主机名以及进程ID命名空间。这样Pod内部的容器可以通过localhost互相通信对外则表现为一个统一的服务实体。网络栈和存储卷共享Pause容器创建了网络栈其他容器通过加入Pause容器的网络命名空间来共享网络配置包括IP地址和端口。同时它也提供了存储卷挂载点使得Pod内的所有容器可以访问相同的存储卷资源。Pod基础设施容器Pause容器可以被视为Pod的基础设施容器或基础容器它是Pod的第一个被创建的容器作为其他容器的“父容器”。由于 Pause 容器的存在Pod 中的其他容器可以无需直接管理网络和存储资源而将这部分职责委托给Pause容器。资源隔离与管理虽然Pod内的容器共享某些资源但它们在其他资源如CPU、内存上仍然是隔离的。Pause容器帮助实现了这种资源使用的逻辑边界。健康检查代理由于Pause容器通常是Pod中始终存在的部分它的状态可以被用来间接判断Pod的整体运行状况。如果Pause容器终止那么整个Pod会被视为失败。
3、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|Never|IfNotPresent ] #获取镜像的策略 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: string #类型为hostPath的存储卷表示挂载Pod所在宿主机的目录path: string    #Pod所在宿主机的目录将被用于同期中mount的目录secret:    #类型为secret的存储卷挂载集群与定义的secret对象到容器内部scretname: string items: - key: stringpath: stringconfigMap: #类型为configMap的存储卷挂载预定义的configMap对象到容器内部name: stringitems:- key: stringpath: string4、Pod基本操作 4.1、查看 4.1.1、查看k8s集群中系统运行的pod kubectl get pods -n kube-system4.1.2、查看指定命名空间下所有的Pod、Services以及Deployments kubectl get pod,svc,deploy -n namespcae4.1.3、查看某种资源可以配置的一级属性 kubectl explain pod4.1.4、查看属性的子属性 kubectl explain pod.spec.containers4.2、创建 4.2.1、命令方式启动

命令格式 kubectl create deploy (pod控制器名称) [参数] [rootk8s-master ~]# kubectl create deploy nginx –imagenginx –port8081 -n dev1

deployment.apps/nginx created–image 指定Pod的镜像 –port 指定端口 –namespace 指定namespace 4.2.2、创建yaml配置文件启动 cat nginx-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploynamespace: dev2labels:chapter: first-app spec:selector:matchLabels:app: nginxreplicas: 1template:metadata:labels:app: nginxspec:containers:- name : nginximage: nginxports:- containerPort: 8081[rootk8s-master ~]# kubectl apply -f nginx-deployment.yaml deployment.apps/nginx-deploy created4.2.3、直接创建pod通过yaml资源清单 cat pod-nginx.yamlapiVersion: v1 kind: Pod metadata:name: nginxnamespace: dev spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP[rootk8s-master ~]# kubectl create -f pod-nginx.yaml pod/nginx created4.2.4、直接创建kubectl run kubectl run pod-nginx –imagenginx4.3、查看创建的pod信息 4.3.1、查看Pod基本信息 kubectl get pods -n dev1 kubectl get pods -n dev24.3.2、查看Pod的详细信息 [rootk8s-master ~]# kubectl get pods -n dev1 NAME READY STATUS RESTARTS AGE nginx-66b77cb96d-bsxg8 11 Running 0 12m [rootk8s-master ~]# kubectl get pods -n dev2 NAME READY STATUS RESTARTS AGE nginx-deploy-66b77cb96d-v2m9x 11 Running 0 108s [rootk8s-master ~]# kubectl describe pod nginx-66b77cb96d-bsxg8 -n dev1 Name: nginx-66b77cb96d-bsxg8 Namespace: dev1 Priority: 0 Node: k8s-node1/192.168.112.50 Start Time: Mon, 17 Jun 2024 11:38:05 0800 Labels: appnginxpod-template-hash66b77cb96d Annotations: none Status: Running IP: 10.244.1.11 IPs:IP: 10.244.1.11 Controlled By: ReplicaSet/nginx-66b77cb96d Containers:nginx:Container ID: docker://35405e89a4c95504f24dd51fe4e89d6441f80780d3b54ab9b6c8cefba9a7fd04Image: nginxImage ID: docker-pullable://nginxsha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Port: 8081/TCPHost Port: 0/TCPState: RunningStarted: Mon, 17 Jun 2024 11:39:04 0800Ready: TrueRestart Count: 0Environment: noneMounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-vvb7w (ro) Conditions:Type StatusInitialized TrueReady TrueContainersReady TruePodScheduled True Volumes:kube-api-access-vvb7w:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: nilDownwardAPI: true QoS Class: BestEffort Node-Selectors: none Tolerations: node.kubernetes.io/not-ready:NoExecute opExists for 300snode.kubernetes.io/unreachable:NoExecute opExists for 300s Events:Type Reason Age From Message—- —— —- —- ——-Normal Scheduled 13m default-scheduler Successfully assigned dev1/nginx-66b77cb96d-bsxg8 to k8s-node1Normal Pulling 13m kubelet Pulling image nginxNormal Pulled 12m kubelet Successfully pulled image nginx in 57.688637974sNormal Created 12m kubelet Created container nginxNormal Started 12m kubelet Started container nginx[rootk8s-master ~]# kubectl describe pod nginx-deploy-66b77cb96d-v2m9x -n dev2 Name: nginx-deploy-66b77cb96d-v2m9x Namespace: dev2 Priority: 0 Node: k8s-node2/192.168.112.60 Start Time: Mon, 17 Jun 2024 11:48:21 0800 Labels: appnginxpod-template-hash66b77cb96d Annotations: none Status: Running IP: 10.244.2.11 IPs:IP: 10.244.2.11 Controlled By: ReplicaSet/nginx-deploy-66b77cb96d Containers:nginx:Container ID: docker://d08cd3e2d16ab031c7421d7c484342d8f0381309368e1a8c0a34ccbbec5f61b5Image: nginxImage ID: docker-pullable://nginxsha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Port: 8081/TCPHost Port: 0/TCPState: RunningStarted: Mon, 17 Jun 2024 11:48:37 0800Ready: TrueRestart Count: 0Environment: noneMounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2hvg8 (ro) Conditions:Type StatusInitialized TrueReady TrueContainersReady TruePodScheduled True Volumes:kube-api-access-2hvg8:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: nilDownwardAPI: true QoS Class: BestEffort Node-Selectors: none Tolerations: node.kubernetes.io/not-ready:NoExecute opExists for 300snode.kubernetes.io/unreachable:NoExecute opExists for 300s Events:Type Reason Age From Message—- —— —- —- ——-Normal Scheduled 4m1s default-scheduler Successfully assigned dev2/nginx-deploy-66b77cb96d-v2m9x to k8s-node2Normal Pulling 4m1s kubelet Pulling image nginxNormal Pulled 3m46s kubelet Successfully pulled image nginx in 15.384979508sNormal Created 3m46s kubelet Created container nginxNormal Started 3m46s kubelet Started container nginx4.4、访问 4.4.1、获取Pod的IP kubectl get pods -n dev1 -o wide4.4.2、访问Pod [rootk8s-master ~]# curl 10.244.1.11 !DOCTYPE html html head titleWelcome to nginx!/title style html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } /style /head body h1Welcome to nginx!/h1 pIf you see this page, the nginx web server is successfully installed and working. Further configuration is required./ppFor 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./ppemThank you for using nginx./em/p /body /html4.5、删除 4.5.1、直接删除Pod #命令格式 kubectl delete pod pod名称 -n 名称空间[rootk8s-master ~]# kubectl delete pod nginx -n dev3 pod nginx deleted4.5.2、删除通过控制器创建的pod #删除指定Pod [rootk8s-master ~]# kubectl delete pod nginx-66b77cb96d-ggmsm -n dev1 pod nginx-66b77cb96d-ggmsm deleted#虽然显示删除Pod成功但是再次查看时发现又创建了一个 [rootk8s-master ~]# kubectl get pods -n dev1 NAME READY STATUS RESTARTS AGE nginx-66b77cb96d-zpvgn 11 Running 0 48s# 这是因为当前Pod是由Pod控制器创建的控制器会监控Pod状况一旦发现Pod死亡会立即重建。此时要想删除Pod必须删除Pod控制器#先查询dev1命名空间下的Pod控制器 [rootk8s-master ~]# kubectl get deploy -n dev1 NAME READY UP-TO-DATE AVAILABLE AGE nginx 11 1 1 175m#接下来删除对应的Pod控制器 [rootk8s-master ~]# kubectl delete deploy nginx -n dev1 deployment.apps nginx deleted#稍等片刻再次查询Pod发现被删除 [rootk8s-master ~]# kubectl get pods -n dev1 No resources found in dev1 namespace.4.6、资源限制 4.6.1、创建命名空间 [rootk8s-master ~]# kubectl create ns quota-mem-cpu namespace/quota-mem-cpu created#查看命名空间 [rootk8s-master ~]# kubectl get ns4.6.2、创建资源配额对象 cat quota-mem-cpu.yamlapiVersion: v1 kind: ResourceQuota metadata:name: mem-cpu-demo spec:hard:requests.cpu: 1requests.memory: 1Gilimits.cpu: 2limits.memory: 2Giapiversion声明apiserver的版本为v1kind对象创建资源配额对象metadata版本数据指定名称hard硬件限制requests.cpu: “1”申请一个cpulimits.cpu: “2”最大可以使用2个cpu 4.6.3、将命名空间和资源配额对象绑定 kubectl apply -f quota-mem-cpu.yaml –namespacequota-mem-cpu4.6.4、查看命名空间对应的资源配额对象信息 kubectl get resourcequota mem-cpu-demo -n quota-mem-cpu -o yamlResourceQuota 在 quota-mem-cpu-example 命名空间中设置了如下要求 在该命名空间中所有 Pod 的内存请求总和不能超过 1 GiB。在该命名空间中所有 Pod 的内存限制总和不能超过 2 GiB。在该命名空间中所有 Pod 的 CPU 请求总和不能超过 1 cpu。在该命名空间中所有 Pod 的 CPU 限制总和不能超过 2 cpu。 4.6.5、编写yaml配置文件创建pod cat quota-mem-cpu-pod.yamlapiVersion: v1 kind: Pod metadata:name: quota-mem-cpu-demo spec:containers:- name: quota-mem-cpu-demo-testimage: nginxresources:limits:memory: 800Micpu: 800mrequests:memory: 600Micpu: 400mkubectl apply -f quota-mem-cpu-pod.yaml -n quota-mem-cpu查看创建在指定命名空间的pod kubectl get pod -n quota-mem-cpu4.6.6、再次查看资源配额对象 kubectl get resourcequota mem-cpu-demo -n quota-mem-cpu -o yaml4.6.7、尝试创建第二个pod 编写yaml配置文件 cat quota-mem-cpu-pod-2.yamlapiVersion: v1 kind: Pod metadata:name: quota-mem-cpu-demo-2 spec:containers:- name: quota-mem-cpu-demo-test-2image: redisresources:limits:memory: 1Gicpu: 800mrequests:memory: 700Micpu: 400m创建pod kubectl apply -f quota-mem-cpu-pod2.yaml -n quota-mem-cpu在Error信息中requested: requests.memory700Mi, used: requests.memory600Mi, limited: requests.memory1Gi 代表新的内存请求与已经使用的内存请求之和超过了内存请求的配额 600 MiB 700 MiB 1 GiB 三、Label 1、概述 Label是标签的意思一对 key/value 被关联到对象上k8s中的资源对象大都可以打上标签如Node、Pod、Service 等 一个资源可以绑定任意多个labelk8s 通过 Label 可实现多维度的资源分组管理后续可通过 Label Selector 查询和筛选拥有某些 Label 的资源对象。同一个资源对象的labels属性的key必须唯一 1.1、示例 metadata: {labels: {key1 : value1,key2 : value2} }2、设计目的 标签使用户能够以松散耦合的方式将他们自己的组织结构映射到系统对象而无需客户端存储这些映射。 服务部署和批处理流水线通常是多维实体例如多个分区或部署、多个发行序列、多个层每层多个微服务。 管理通常需要交叉操作这打破了严格的层次表示的封装特别是由基础设施而不是用户确定的严格的层次结构。 3、常见的标签示例 release : stable, release : canaryenvironment : dev, environment : qa, environment : productiontier : frontend, tier : backend, tier : cachepartition : customerA, partition : customerBtrack : daily, track : weekly 4、标签的语法 4.1、前缀 前缀是可选的如果指定前缀必须是 DNS 子域由点.分隔的一系列 DNS 标签总共不超过 253 个字符 后跟斜杠/。如果省略前缀则假定标签键对用户是私有的。 向最终用户对象添加标签的自动系统组件例如 kube-scheduler、kube-controller-manager、 kube-apiserver、kubectl 或其他第三方自动化工具必须指定前缀。 4.2、名称 名称段是必需的必须小于等于 63 个字符以字母数字字符[a-z0-9A-Z]开头和结尾 带有破折号-下划线点 .和之间的字母数字。 4.3、有效的标签值 必须为 63 个字符或更少可以为空除非标签值为空必须以字母数字字符[a-z0-9A-Z]开头和结尾包含破折号-、下划线、点.和字母或数字 4.3、示例 4.3.1、有 environment: production 和 app: nginx 两个标签的Pod资源清单 apiVersion: v1 kind: Pod metadata:name: label-demolabels:environment: productionapp: nginx spec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 805、Label selector(标签选择器) 标签定义完毕之后还要考虑到标签的选择这就要使用到Label Selector即 Label用于给某个资源对象定义标识 Label Selector用于查询和筛选拥有某些标签的资源对象 5.1、基于等式的Label selector 允许按标签键和值进行过滤。 匹配对象必须满足所有指定的标签约束尽管它们也可能具有其他标签。 可接受的运算符有 、 和 ! 三种。 前两个表示相等并且是同义词而后者表示不相等。 5.1.1、示例 environment production tier ! frontend选择所有包含Label中keyenvironment且valueproduction的对象 选择所有包括Label中的keytier且value不等于frontend的对象 apiVersion: v1 kind: Pod metadata:name: cuda-test spec:containers:- name: cuda-testimage: registry.k8s.io/cuda-vector-add:v0.1resources:limits:nvidia.com/gpu: 1nodeSelector:accelerator: nvidia-tesla-p100Pod 选择带有标签 “acceleratornvidia-tesla-p100” 5.2、基于集合的Label selector 基于集合的标签需求允许你通过一组值来过滤键。 支持三种操作符in、notin 和 exists只可以用在键标识符上。 5.2.1、示例 environment in (production, qa) tier notin (frontend, backend) partition !partition第一个示例选择了所有键等于 environment 并且值等于 production 或者 qa 的资源。第二个示例选择了所有键等于 tier 并且值不等于 frontend 或者 backend 的资源以及所有没有 tier 键标签的资源。第三个示例选择了所有包含了有 partition 标签的资源没有校验它的值。第四个示例选择了所有没有 partition 标签的资源没有校验它的值。 5.3、注意事项 对于某些 API 类别例如 ReplicaSet而言两个实例的标签选择算符不得在命名空间内重叠 否则它们的控制器将互相冲突无法确定应该存在的副本个数。对于基于等值的和基于集合的条件而言不存在逻辑或||操作符。 你要确保你的过滤语句按合适的方式组织。基于等式的Label selector和基于集合的Label selector可以混合使用partition in (customerA, customerB),environment!qa。 6、基本操作 6.1、使用帮助 kubectl label –help6.2、为Pod资源打标签 kubectl label pod pod-nginx1 version1.0 -n dev16.3、为Pod资源更新标签 kubectl label pod pod-nginx1 version2.0 -n dev1 –overwrite6.4、查看标签 kubectl get pod pod-nginx1 -n dev1 –show-labels6.5、筛选标签 kubectl get pod -n dev1 -l version2.0 –show-labels kubectl get pod -n dev1 -l version!2.0 –show-labels6.6、删除标签 kubectl label pod pod-nginx1 version- -n dev16.7、配置 6.7.1、创建yaml资源清单 cat label-nginx-pod.yamlapiVersion: v1 kind: Pod metadata:name: nginxnamespace: dev1labels:version: 3.0env: test spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCPkubectl create -f label-nginx-pod.yaml6.7.2、删除 kubectl delete -f label-nginx-pod.yaml四、Deployment 1、概述 Deployment 是 Kubernetes 中用于管理 Pod 副本集的控制器Deployment自动管理关联的ReplicaSet从而间接控制Pod的数量和状态。它可以控制一组 Pod 的创建、扩缩容和更新等操作。Deployment 支持滚动更新和回滚等功能可以实现无缝的应用程序版本升级。 2、基本操作 2.1、命令格式 kubectl create deployment NAME –imageimage – [COMMAND] [args…] [options]NAME: 要创建的Deployment名称。–imageimage: 指定容器使用的镜像名称。[COMMAND] [args…]: 可选启动时执行的命令及参数。[options]: 创建部署时可配置的额外选项。 2.2、使用帮助 kubectl create deployment –help2.3、查看deployment信息 kubectl create deploy nginx-deploy –imagenginx –port8082 –replicas3 -n dev1#查看创建的pod [rootk8s-master ~]# kubectl get pods -n dev1 NAME READY STATUS RESTARTS AGE nginx-deploy-794c9c67dc-gf9bf 11 Running 0 37m nginx-deploy-794c9c67dc-m2dq5 11 Running 0 37m nginx-deploy-794c9c67dc-xnbnp 11 Running 0 37m#查看deployment信息 [rootk8s-master ~]# kubectl get deploy -n dev1 NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 33 3 3 43m# UP-TO-DATE成功升级的副本数量

AVAILABLE可用副本的数量[rootk8s-master ~]# kubectl get deploy -n dev1 -o wide

NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deploy 33 3 3 58m nginx nginx appnginx-deploy2.4、查看deployment的详细信息 [rootk8s-master ~]# kubectl describe deploy nginx-deploy -n dev1 Name: nginx-deploy Namespace: dev1 CreationTimestamp: Tue, 18 Jun 2024 15:32:30 0800 Labels: appnginx-deploy Annotations: deployment.kubernetes.io/revision: 1 Selector: appnginx-deploy Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template:Labels: appnginx-deployContainers:nginx:Image: nginxPort: 8082/TCPHost Port: 0/TCPEnvironment: noneMounts: noneVolumes: none Conditions:Type Status Reason—- —— ——Available True MinimumReplicasAvailableProgressing True NewReplicaSetAvailable OldReplicaSets: none NewReplicaSet: nginx-deploy-794c9c67dc (33 replicas created) Events:Type Reason Age From Message—- —— —- —- ——-Normal ScalingReplicaSet 60m deployment-controller Scaled up replica set nginx-deploy-794c9c67dc to 32.5、删除 kubectl delete deploy nginx-deploy -n dev12.6、配置 2.6.1、创建yaml资源清单 cat deploy-nginx.yamlapiVersion: apps/v1 kind: Deployment metadata:name: nginxnamespace: dev1 spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80protocol: TCP2.6.2、创建 kubectl create -f deploy-nginx.yaml2.6.3、删除 kubectl delete -f deploy-nginx.yaml2.7、扩缩容增加减少pod副本数 2.7.1、通过yaml资源清单修改副本数 cat deploy-nginx.yamlapiVersion: apps/v1 kind: Deployment metadata:name: nginxnamespace: dev1 spec:replicas: 5selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80protocol: TCP#apply命令执行yaml文件create执行一次再执行就会报错复 [rootk8s-master ~]# kubectl apply -f deploy-nginx.yaml deployment.apps/nginx created#查看pod个数 [rootk8s-master ~]# kubectl get pods -n dev1#查看deployment控制器详细信息 kubectl describe deploy nginx -n dev1#缩容对应的修改资源清单里的replicas个数然后kubectl apply -f xxx.yaml即可2.7.2、edit deployment实现在线更新 [rootk8s-master ~]# kubectl edit deploy nginx -n dev1 deployment.apps/nginx edited2.7.3、scale deployment实现扩缩容 命令格式 kubectl scale deploy deploy名称 –replicaspod数量 -n 命名空间 #变更pod数量为5个 kubectl scale deploy nginx –replicas5 -n dev1#查看pod数量 kubectl get pods -n dev1五、Service 1、概述 在kubernetes中pod是应用程序的载体我们可以通过pod的ip来访问应用程序。但是却存在以下两个问题 Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP外部无法访问 为了解决这个问题kubernetes提供了Service资源Service会对提供同一个服务的多个pod进行聚合并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。 Service可以看作是一组同类Pod对外的访问接口。借助Service应用可以方便地实现服务发现和负载均衡。 2、基本操作 2.1、创建集群内部可以访问的Service #暴露Service [rootk8s-master ~]# kubectl expose deploy nginx –namesvc-nginx1 –typeClusterIP –port80 –target-port80 -n dev1 service/svc-nginx1 exposed#查看service [rootk8s-master ~]# kubectl get svc svc-nginx1 -n dev1 -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-nginx1 ClusterIP 172.16.32.152 none 80/TCP 72s appnginx# 这里产生了一个CLUSTER-IP这就是service的IP在Service的生命周期中这个地址是不会变动的# 可以通过这个IP访问当前service对应的POD [rootk8s-master ~]# curl 172.16.32.152 !DOCTYPE html html head titleWelcome to nginx!/title style html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } /style /head body h1Welcome to nginx!/h1 pIf you see this page, the nginx web server is successfully installed and working. Further configuration is required./ppFor 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./ppemThank you for using nginx./em/p /body /html2.2、创建集群外部也可以访问的Service

上面创建的Service的type类型为ClusterIP这个ip地址只用集群内部可访问

如果需要创建外部也可以访问的Service需要修改type为NodePort

[rootk8s-master ~]# kubectl expose deploy nginx –namesvc-nginx2 –typeNodePort –port80 -n dev1 service/svc-nginx2 exposed# 此时查看会发现出现了NodePort类型的Service而且有一对Port80:30571/TCP [rootk8s-master ~]# kubectl get svc svc-nginx2 -n dev1 -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-nginx2 NodePort 172.16.140.61 none 80:30571/TCP 2m57s appnginx#接下来就可以通过集群外的主机访问 节点ip:30571访问服务了 例http://192.168.112.40:305712.3、删除Service [rootk8s-master ~]# kubectl delete svc svc-nginx1 -n dev1 service svc-nginx1 deleted2.4、配置 2.4.1、创建yaml资源清单 #ClusterIP类型的 apiVersion: v1 kind: Service metadata:name: svc-nginxnamespace: dev1 spec:clusterIP: 172.16.100.100 #固定svc的内网ipports:- port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: ClusterIP#NodePort类型的 apiVersion: v1 kind: Service metadata:name: svc-nginx1namespace: dev1 spec:clusterIP: 172.16.200.200 #固定svc的内网ipports:- port: 8080protocol: TCPtargetPort: 8080selector:app: nginxtype: NodePort2.4.2、创建 kubectl apply -f svc-nginx.yaml kubectl apply -f svc-nginx2.yaml2.4.3、删除 kubectl delete -f svc-nginx.yaml kubectl delete -f svc-nginx2.yaml至此本篇完成仅涉及最常见的k8s资源的基本操作 更加深入的我会继续学习