ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

k8s-实战入门(四)

k8s-实战入门(四) 前言本博文将介绍如何在k8s集群中部署一个nginx服务并且能够对其进行访问。本文对下面五个都是简单的概念介绍目录Namespace介绍操作查看创建删除配置方式Pod介绍操作创建并运行查看pod信息访问Pod删除指定Pod配置操作Label介绍操作命令方式配置方式Deployment介绍操作命令操作配置操作Service介绍操作操作一创建集群内部可访问的Service操作二创建集群外部也可访问的Service删除Service配置方式Namespace介绍Namespace是k8s系统中的一种非常重要资源它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中可能不想让两个Pod之间进行互相的访问那此时就可以将两个Pod划分到不同的namespace下。k8s通过将集群内部的资源分配到不同的Namespace中可以形成逻辑上的“组”以方便不同的组的资源进行隔离使用和管理。可以通过k8s的授权机制将不同的namespace交给不同租户进行管理这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制限定不同租户能占用的资源例如CPU使用量、内存使用量等等来实现租户可用资源的管理。k8s在集群启动之后会默认创建几个namespace[rootmaster k8sYamlForCSDN]# kubectl get namespaces NAME STATUS AGE default Active 8h # 所有未指定Namespace的对象都会被分配在default命名空间 kube-node-lease Active 8h # 集群节点之间的心跳维护v1.13开始引入 kube-public Active 8h # 此命名空间下的资源可以被所有人访问包括未认证用户 kube-system Active 8h # 所有由Kubernetes系统创建的资源都处于这个命名空间操作查看# 1 查看所有的ns 命令kubectl get ns [rootmaster k8sYamlForCSDN]# kubectl get ns NAME STATUS AGE default Active 8h kube-node-lease Active 8h kube-public Active 8h kube-system Active 8h # 2 查看指定的ns 命令kubectl get ns ns名称 [rootmaster k8sYamlForCSDN]# kubectl get ns default NAME STATUS AGE default Active 8h # 3 指定输出格式 命令kubectl get ns ns名称 -o 格式参数 # kubernetes支持的格式有很多比较常见的是wide、json、yaml [rootmaster k8sYamlForCSDN]# kubectl get ns default -o yaml apiVersion: v1 kind: Namespace metadata: creationTimestamp: 2022-02-28T03:07:56Z labels: kubernetes.io/metadata.name: default name: default resourceVersion: 205 uid: 0ba523b8-7614-4681-9260-bf15f85c0524 spec: finalizers: - kubernetes status: phase: Active # 4 查看ns详情 命令kubectl describe ns ns名称 [rootmaster k8sYamlForCSDN]# kubectl describe ns default Name: default Labels: kubernetes.io/metadata.namedefault Annotations: none Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间 # 删除命名空间将会删除其中所有的pod所以需要时间那么在这段时间内就是Terminating创建# 创建namespace [rootmaster k8sYamlForCSDN]# kubectl create ns dev namespace/dev created删除# 删除namespace [rootmaster k8sYamlForCSDN]# kubectl delete ns dev namespace dev deleted配置方式# 首先准备一个yaml文件ns-dev.yaml vi ns-dev.yamlapiVersion: v1 kind: Namespace metadata: name: dev# 然后就可以执行对应的创建和删除命令了 ​# 创建kubectl create -f ns-dev.yaml [rootmaster k8sYamlForCSDN]# kubectl create -f ns-dev.yaml namespace/dev created # 删除kubectl delete -f ns-dev.yaml [rootmaster k8sYamlForCSDN]# kubectl delete -f ns-dev.yaml namespace dev deletedPod介绍Pod是k8s集群进行管理的最小单元程序要运行必须部署在容器中而容器必须存在于Pod中Pod可以认为是容器的封装一个Pod中可以存在一个或者多个容器。k8s在集群启动之后集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看[rootmaster k8sYamlForCSDN]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-64897985d-4w7gt 0/1 ImagePullBackOff 0 8h coredns-64897985d-5jpxz 0/1 ImagePullBackOff 0 8h etcd-master 1/1 Running 0 8h kube-apiserver-master 1/1 Running 0 8h kube-controller-manager-master 1/1 Running 0 8h kube-flannel-ds-78vrj 1/1 Running 0 8h kube-flannel-ds-84dvq 1/1 Running 0 8h kube-flannel-ds-lv5jf 1/1 Running 0 8h kube-proxy-vxflz 1/1 Running 0 8h kube-proxy-w886d 1/1 Running 0 8h kube-proxy-xb7kp 1/1 Running 0 8h kube-scheduler-master 1/1 Running 0 8h操作创建并运行# kubernetes提供单独运行Pod的命令别的都是通过Pod控制器来实现的 # 如果是Pod控制器来创建的话指定pod删除则会自动创建 # 而run是单独运行pod的命令不会自动创建 # 命令格式 kubectl run (pod控制器名称) [参数] # --image 指定Pod的镜像 # --port 指定端口 # --namespace 指定namespace [rootmaster k8sYamlForCSDN]# kubectl run pod-nginx --imagenginx --port80 --namespacedev pod/pod-nginx created查看pod信息# 查看Pod基本信息 [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pod-nginx 1/1 Running 0 18s [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev -o wide # 查看Pod的详细信息 [rootmaster k8sYamlForCSDN]# kubectl describe pods pod-nginx -n dev访问Pod获取pod后从左到右参数依次是pod名、pod运行容器个数/pod容器个数、pod状态、重启次数、启动时间、pod的IP、pod调度的节点IP【注意】可通过kubectl decribe pod xxx -n dev查看pod的日志pod每次重启后IP地址都会改变# # 获取podIP [rootmaster k8sYamlForCSDN]# kubectl get pods pod-nginx -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-nginx 1/1 Running 0 77s 10.244.2.7 node2 none none # #访问POD [rootmaster k8sYamlForCSDN]# curl 10.244.2.7:80 !DOCTYPE html ... /html删除指定Pod# 删除指定Pod [rootmaster k8sYamlForCSDN]# kubectl delete pods pod-nginx -n dev pod pod-nginx deleted [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev No resources found in dev namespace. # 如果当前Pod是由Pod控制器创建的控制器会监控Pod状况一旦发现Pod死亡会立即重建 # 此时要想删除Pod必须删除Pod控制器删除pod控制器则其对应的pod会自动被删除 # 1. 先查询当前namespace下的Pod控制器 [rootmaster ~]# kubectl get deploy -n dev [rootmaster k8sYamlForCSDN]# kubectl get deployments -n dev # No resources found in dev namespace.目前没有控制器因为是run命令下面是假设 NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 9m7s # 接下来删除此PodPod控制器 [rootmaster k8sYamlForCSDN]# kubectl delete deploy nginx -n dev deployment.apps nginx deleted # 稍等片刻再查询Pod发现Pod被删除了 [rootmaster k8sYamlForCSDN]#kubectl get pods -n dev No resources found in dev namespace.配置操作【配置操作不涉及pod控制器命令行是通过pod控制器创建的pod】创建一个pod-nginx.yaml内容如下然后就可以创建和删除pod了apiVersion: v1 kind: Pod metadata: name: pod-nginx namespace: dev spec: containers: - name: pod image: nginx ports: - containerPort: 80 name: nginx-port protocol: TCP# 编写yaml文件 [rootmaster k8sYamlForCSDN]# vi pod-nginx.yaml # 创建 [rootmaster k8sYamlForCSDN]# kubectl apply -f pod-nginx.yaml pod/pod-nginx created # 查询 [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pod-nginx 1/1 Running 0 11s # 删除 [rootmaster k8sYamlForCSDN]# kubectl delete -f pod-nginx.yaml pod pod-nginx deletedLabel介绍Label是k8s系统中的一个重要概念。它的作用就是在资源上添加标识用来对它们进行区分和选择。Label和namespace的区别比如一个网站的前台和后台程序需要互相访问加namespace不现实这时候就需要设置LabelLabel的特点一个Label会以key/value键值对的形式附加到各种对象上如Node、Pod、Service等等一个资源对象可以定义任意数量的Label 同一个Label也可以被添加到任意数量的资源对象上去Label通常在资源对象定义时确定当然也可以在对象创建后动态添加或者删除可以通过Label实现资源的多维度分组以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。一些常用的Label 示例如下版本标签“version”:“release”, “version”:“stable”…环境标签“environment”:“dev”“environment”:“test”“environment”:“pro”架构标签“tier”:“frontend”“tier”:“backend”标签定义完毕之后还要考虑到标签的选择这就要使用到Label Selector即Label用于给某个资源对象定义标识Label Selector用于查询和筛选拥有某些标签的资源对象当前有两种Label Selector基于等式的Label Selectorname slave: 选择所有包含Label中keyname且valueslave的对象env ! production: 选择所有包括Label中的keyenv且value不等于production的对象基于集合的Label Selectorname in (master, slave): 选择所有包含Label中的keyname且valuemaster或slave的对象name not in (frontend): 选择所有包含Label中的keyname且value不等于frontend的对象标签的选择条件可以使用多个此时将多个Label Selector进行组合使用逗号,进行分隔即可。例如​nameslaveenv!production ​name not in (frontend)env!production操作命令方式# 创建一个pod [rootmaster k8sYamlForCSDN]# kubectl create -f pod-nginx.yaml pod/pod-nginx created # 查看pod的label [rootmaster k8sYamlForCSDN]# kubectl get pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-nginx 1/1 Running 0 17s none # 为pod资源打标签 [rootmaster k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version2.0 pod/pod-nginx labeled # 查看pod的label [rootmaster k8sYamlForCSDN]# kubectl get pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-nginx 1/1 Running 0 59s version2.0 # 为pod更新标签【失败】 [rootmaster k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version3.0 error: version already has a value (2.0), and --overwrite is false # 为pod更新标签【成功】overwrite [rootmaster k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version3.0 --overwrite pod/pod-nginx labeled # 查看pod的label [rootmaster k8sYamlForCSDN]# kubectl get pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-nginx 1/1 Running 0 90s version3.0 # 筛选标签 [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev -l version1.0 --show-labels No resources found in dev namespace. # 筛选标签 [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev -l version!1.0 --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-nginx 1/1 Running 0 2m52s version3.0 # 删除标签删除就是在key后面跟个减号即“-” [rootmaster k8sYamlForCSDN]# kubectl label pods pod-nginx -n dev version- pod/pod-nginx unlabeled # 查看pod的label [rootmaster k8sYamlForCSDN]# kubectl get pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-nginx 1/1 Running 0 3m27s none配置方式apiVersion: v1 kind: Pod metadata: name: pod-nginx namespace: dev labels: version: 4.0 env: test created: wxf spec: containers: - name: pod image: nginx ports: - containerPort: 80 name: nginx-port protocol: TCP# 创建 [rootmaster k8sYamlForCSDN]# kubectl apply -f pod-nginx.yaml pod/pod-nginx created # 查看pod信息 [rootmaster k8sYamlForCSDN]# kubectl get pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-nginx 0/1 ContainerCreating 0 4s createdwxf,envtest,version4.0Deployment介绍在kubernetes中Pod是最小的控制单元但是kubernetes很少直接控制Pod一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理确保pod资源符合预期的状态当pod的资源出现故障时会尝试进行重启或重建pod。在kubernetes中Pod控制器的种类 有很多本章节只介绍一种Deployment.Deployment和pod关系的建立是通过标签label进行建立的如下图操作命令操作# 创建deployment # 命令格式: kubectl create deployment 名称 [参数] # --image 指定pod的镜像 # --port 指定端口 # --replicas 指定创建pod数量 # --namespace 指定namespace [rootmaster k8sYamlForCSDN]# kubectl create deployment deploy-nginx --imagenginx --port80 --replicas3 --namespacedev deployment.apps/deploy-nginx created # 查看创建的Pod bash [rootmaster k8sYamlForCSDN]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE deploy-nginx-fb669cc4f-5xd5j 1/1 Running 0 3m32s deploy-nginx-fb669cc4f-69pln 1/1 Running 0 3m32s deploy-nginx-fb669cc4f-tpfhp 1/1 Running 0 3m32s # 查看deployment的信息 [rootmaster k8sYamlForCSDN]# kubectl get deployment -n dev NAME READY UP-TO-DATE AVAILABLE AGE deploy-nginx 3/3 3 3 4m21s # UP-TO-DATE成功升级的副本数量 # AVAILABLE可用副本的数量 # 查看deployment和pod的详细信息 [rootmaster k8sYamlForCSDN]# kubectl get deployment,pods -n dev --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS deployment.apps/deploy-nginx 3/3 3 3 5m42s appdeploy-nginx NAME READY STATUS RESTARTS AGE LABELS pod/deploy-nginx-fb669cc4f-5xd5j 1/1 Running 0 5m42s appdeploy-nginx,pod-template-hashfb669cc4f pod/deploy-nginx-fb669cc4f-69pln 1/1 Running 0 5m42s appdeploy-nginx,pod-template-hashfb669cc4f pod/deploy-nginx-fb669cc4f-tpfhp 1/1 Running 0 5m42s appdeploy-nginx,pod-template-hashfb669cc4f [rootmaster k8sYamlForCSDN]# kubectl get deployment -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deploy-nginx 3/3 3 3 5m58s nginx nginx appdeploy-nginx# 查看deployment的详细信息 [rootmaster k8sYamlForCSDN]# kubectl describe deployment -n dev Name: deploy-nginx Namespace: dev CreationTimestamp: Mon, 28 Feb 2022 21:10:32 0800 Labels: appdeploy-nginx Annotations: deployment.kubernetes.io/revision: 1 Selector: appdeploy-nginx 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: appdeploy-nginx Containers: nginx: Image: nginx Port: 80/TCP Host Port: 0/TCP Environment: none Mounts: none Volumes: none Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: none NewReplicaSet: deploy-nginx-fb669cc4f (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 6m29s deployment-controller Scaled up replica set deploy-nginx-fb669cc4f to 3# # 删除deployment Pod控制器,删除了pod对应的deployment则pod也会被删除 [rootmaster k8sYamlForCSDN]# kubectl delete deployments.apps deploy-nginx -n dev deployment.apps deploy-nginx deleted [rootmaster k8sYamlForCSDN]# kubectl get deployment,pods -n dev No resources found in dev namespace.配置操作[yaml文件解析]template部分是pod模板spec:replicas说明副本数也就是pod创建的数量通过selector里边的选择器名称和template里边的labels做对应# 创建一个deploy-nginx.yaml vi deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx namespace: dev spec: replicas: 3 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - name: pod image: nginx ports: - containerPort: 80 protocol: TCP# 创建 [rootmaster k8sYamlForCSDN]# kubectl apply -f deploy-nginx.yaml deployment.apps/deploy-nginx created # 查看 [rootmaster k8sYamlForCSDN]# kubectl get deployments.apps -n dev NAME READY UP-TO-DATE AVAILABLE AGE deploy-nginx 0/3 3 0 11s [rootmaster k8sYamlForCSDN]# kubectl get deployments.apps,pods -n dev NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/deploy-nginx 0/3 3 0 15s NAME READY STATUS RESTARTS AGE pod/deploy-nginx-579f68df74-pn2c8 0/1 ContainerCreating 0 15s pod/deploy-nginx-579f68df74-sv9nz 0/1 ContainerCreating 0 15s pod/deploy-nginx-579f68df74-wpndc 0/1 ContainerCreating 0 15s # 删除 [rootmaster k8sYamlForCSDN]# kubectl delete -f deploy-nginx.yaml deployment.apps deploy-nginx deletedService介绍目前已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。虽然每个Pod都会分配一个单独的Pod IP然而却存在如下两问题Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP外部无法访问这样对于访问这个服务带来了难度。因此kubernetes设计了Service来解决这个问题。Service可以看作是一组同类Pod对外的访问接口。借助Service应用可以方便地实现服务发现和负载均衡。外部访问serviceservice访问pod操作操作一创建集群内部可访问的Service这里先简单介绍一下–typeClusterIP意思是只有集群内部ip可以访问这个service【注意】这里的target端口是pod的端口port是service对外暴露的端口# 暴露Service [rootmaster k8sYamlForCSDN]# kubectl expose deployment deploy-nginx -n dev \ --namesvc-deploy-nginx --typeClusterIP --port80 --target-port80 service/svc-deploy-nginx exposed # 查看service [rootmaster k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-deploy-nginx ClusterIP 10.99.101.216 none 80/TCP 47s runnginx # 这里产生了一个CLUSTER-IP这就是service的IP在Service的生命周期中这个地址是不会变动的 # 可以通过这个IP访问当前service对应的POD [rootmaster k8sYamlForCSDN]# curl 10.99.101.216:80 !DOCTYPE html ... ... /html操作二创建集群外部也可访问的Service# 上面创建的Service的type类型为ClusterIP这个ip地址只用集群内部可访问 # 如果需要创建外部也可以访问的Service需要修改type为NodePort [rootmaster k8sYamlForCSDN]# kubectl expose deployment deploy-nginx -n dev \ --namesvc-deploy-nginx --typeNodePort --port80 --target-port80 service/svc-deploy-nginx exposed # # 此时查看会发现出现了NodePort类型的Service而且有一对Port80:31928/TC [rootmaster k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-deploy-nginx NodePort 10.99.149.210 none 80:30945/TCP 10s runnginx # 接下来就可以通过集群外的主机访问 节点IP:30945访问服务了 # 例如在的电脑主机上通过浏览器访问下面的地址 http://192.168.109.100:30945/删除Service[rootmaster k8sYamlForCSDN]# kubectl delete svc svc-deploy-nginx -n dev service svc-deploy-nginx deleted配置方式不论是ClusterIP还是NodePortyaml文件中的clusterIP: 10.109.68.72可以不配不配置就是自动分配# 创建一个svc-nginx.yaml vi svc-deploy-nginx.yamlapiVersion: v1 kind: Service metadata: name: svc-deploy-nginx namespace: dev spec: type: ClusterIP clusterIP: 10.109.68.72 selector: run: nginx ports: - port: 80 targetPort: 80 protocol: TCP[rootmaster k8sYamlForCSDN]# kubectl apply -f svc-deploy-nginx.yaml service/svc-deploy-nginx created [rootmaster k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-deploy-nginx ClusterIP 10.109.68.72 none 80/TCP 10s runnginx [rootmaster k8sYamlForCSDN]# kubectl delete -f svc-deploy-nginx.yaml service svc-deploy-nginx deletedapiVersion: v1 kind: Service metadata: name: svc-deploy-nginx namespace: dev spec: type: NodePort clusterIP: 10.109.68.72 selector: run: nginx ports: - port: 6872 targetPort: 80 protocol: TCP[rootmaster k8sYamlForCSDN]# kubectl apply -f svc-deploy-nginx.yaml service/svc-deploy-nginx created [rootmaster k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-deploy-nginx NodePort 10.105.26.121 none 6872:31758/TCP 4s runnginx [rootmaster k8sYamlForCSDN]# kubectl delete -f svc-deploy-nginx.yaml service svc-deploy-nginx deleted
返回列表