【K8s】【笔记】----第四章:Kubernetes 实战入门

张开发
2026/4/11 22:00:05 15 分钟阅读

分享文章

【K8s】【笔记】----第四章:Kubernetes 实战入门
文章目录4. 实战入门 4.1 Namespace ️4.2 Pod 4.3 Label ️4.4 Deployment 4.5 Service 4. 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务并且能够对其进行访问。4.1 Namespace ️Namespace是kubernetes系统中的一种非常重要资源它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中可能不想让两个Pod之间进行互相的访问那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中可以形成逻辑上的组以方便不同的组的资源进行隔离使用和管理。可以通过kubernetes的授权机制将不同的namespace交给不同租户进行管理这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制限定不同租户能占用的资源例如CPU使用量、内存使用量等等来实现租户可用资源的管理。kubernetes在集群启动之后会默认创建几个namespace[rootmaster ~]# kubectl get namespaceNAME STATUS AGE default Active 45h# 所有未指定Namespace的对象都会被分配在default命名空间kube-node-lease Active 45h# 集群节点之间的心跳维护v1.13开始引入kube-public Active 45h# 此命名空间下的资源可以被所有人访问包括未认证用户kube-system Active 45h# 所有由Kubernetes系统创建的资源都处于这个命名空间下面来看namespace资源的具体操作查看# 1 查看所有的ns 命令kubectl get ns[rootmaster ~]# kubectl get nsNAME STATUS AGE default Active 45h kube-node-lease Active 45h kube-public Active 45h kube-system Active 45h# 2 查看指定的ns 命令kubectl get ns ns名称[rootmaster ~]# kubectl get ns defaultNAME STATUS AGE default Active 45h# 3 指定输出格式 命令kubectl get ns ns名称 -o 格式参数# kubernetes支持的格式有很多比较常见的是wide、json、yaml[rootmaster ~]# kubectl get ns default -o yamlapiVersion: v1 kind: Namespace metadata: creationTimestamp:2021-05-08T04:44:16Zname: default resourceVersion:151selfLink: /api/v1/namespaces/default uid: 7405f73a-e486-43d4-9db6-145f1409f090 spec: finalizers: - kubernetes status: phase: Active# 4 查看ns详情 命令kubectl describe ns ns名称[rootmaster ~]# kubectl describe ns defaultName: default Labels:noneAnnotations:noneStatus: Active# Active 命名空间正在使用中 Terminating 正在删除命名空间# ResourceQuota 针对namespace做的资源限制# LimitRange针对namespace中的每个组件做的资源限制No resource quota. No LimitRange resource.创建✨# 创建namespace[rootmaster ~]# kubectl create ns devnamespace/dev created删除️# 删除namespace[rootmaster ~]# kubectl delete ns devnamespacedevdeleted配置方式首先准备一个yaml文件ns-dev.yamlapiVersion: v1 kind: Namespace metadata: name: dev然后就可以执行对应的创建和删除命令了创建kubectl create -f ns-dev.yaml删除kubectl delete -f ns-dev.yaml4.2 Pod Pod是kubernetes集群进行管理的最小单元程序要运行必须部署在容器中而容器必须存在于Pod中。Pod可以认为是容器的封装一个Pod中可以存在一个或者多个容器。kubernetes在集群启动之后集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看[rootmaster ~]# kubectl get pod -n kube-systemNAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6955765f44-68g6v1/1 Running02d1h kube-system coredns-6955765f44-cs5r81/1 Running02d1h kube-system etcd-master1/1 Running02d1h kube-system kube-apiserver-master1/1 Running02d1h kube-system kube-controller-manager-master1/1 Running02d1h kube-system kube-flannel-ds-amd64-47r251/1 Running02d1h kube-system kube-flannel-ds-amd64-ls5lh1/1 Running02d1h kube-system kube-proxy-685tk1/1 Running02d1h kube-system kube-proxy-87spt1/1 Running02d1h kube-system kube-scheduler-master1/1 Running02d1h创建并运行▶️kubernetes没有提供单独运行Pod的命令都是通过Pod控制器来实现的# 命令格式 kubectl run (pod控制器名称) [参数]# --image 指定Pod的镜像# --port 指定端口# --namespace 指定namespace[rootmaster ~]# kubectl run nginx --imagenginx:latest --port80 --namespace devdeployment.apps/nginx created查看pod信息# 查看Pod基本信息[rootmaster ~]# kubectl get pods -n devNAME READY STATUS RESTARTS AGE nginx1/1 Running043s# 查看Pod的详细信息[rootmaster ~]# kubectl describe pod nginx -n devName: nginx Namespace: dev Priority:0Node: node1/192.168.5.4 Start Time: Wed, 08 May202109:29:24 0800 Labels: pod-template-hash5ff7956ff6runnginx Annotations:noneStatus: Running IP:10.244.1.23 IPs: IP:10.244.1.23 Controlled By: ReplicaSet/nginx Containers: nginx: Container ID: docker://4c62b8c0648d2512380f4ffa5da2c99d16e056349c9973449c98e9b829f6253c Image: nginx:latest Image ID: docker-pullable://nginxsha256:485b610fefec7ff6c463ced9623314a04ed67e945b9c08d7e53a47f6d108dc7 Port:80/TCP Host Port:0/TCP State: Running Started: Wed, 08 May202109:30:01 0800 Ready: True Restart Count:0Environment:noneMounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-hwvvw(ro)Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-hwvvw: Type: Secret(a volume populated by a Secret)SecretName: default-token-hwvvw Optional:falseQoS Class: BestEffort Node-Selectors:noneTolerations: node.kubernetes.io/not-ready:NoExecutefor300s node.kubernetes.io/unreachable:NoExecutefor300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduledunknowndefault-scheduler Successfully assigned dev/nginx-5ff7956ff6-fg2db to node1 Normal Pulling 4m11s kubelet, node1 Pulling imagenginx:latestNormal Pulled 3m36s kubelet, node1 Successfully pulled imagenginx:latestNormal Created 3m36s kubelet, node1 Created container nginx Normal Started 3m36s kubelet, node1 Started container nginx访问Pod# 获取podIP[rootmaster ~]# kubectl get pods -n dev -o wideNAME READY STATUS RESTARTS AGE IP NODE... nginx1/1 Running0190s10.244.1.23 node1...#访问POD[rootmaster ~]# curl http://10.244.1.23:80!DOCTYPE htmlhtmlheadtitleWelcome to nginx!/title/headbodypemThank youforusing nginx./em/p/body/html删除指定Pod️# 删除指定Pod[rootmaster ~]# kubectl delete pod nginx -n devpodnginxdeleted# 此时显示删除Pod成功但是再查询发现又新产生了一个[rootmaster ~]# kubectl get pods -n devNAME READY STATUS RESTARTS AGE nginx1/1 Running021s# 这是因为当前Pod是由Pod控制器创建的控制器会监控Pod状况一旦发现Pod死亡会立即重建# 此时要想删除Pod必须删除Pod控制器# 先来查询一下当前namespace下的Pod控制器[rootmaster ~]# kubectl get deploy -n devNAME READY UP-TO-DATE AVAILABLE AGE nginx1/1119m7s# 接下来删除此PodPod控制器[rootmaster ~]# kubectl delete deploy nginx -n devdeployment.appsnginxdeleted# 稍等片刻再查询Pod发现Pod被删除了[rootmaster ~]# kubectl get pods -n devNo resources foundindev namespace.配置操作创建一个pod-nginx.yaml内容如下apiVersion: v1 kind: Pod metadata: name: nginx namespace: dev spec: containers: - image: nginx:latest name: pod ports: - name: nginx-port containerPort:80protocol: TCP然后就可以执行对应的创建和删除命令了创建kubectl create -f pod-nginx.yaml删除kubectl delete -f pod-nginx.yaml4.3 Label ️Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识用来对它们进行区分和选择。Label的特点一个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!productionname not in (frontend)env!production命令方式# 为pod资源打标签[rootmaster ~]# kubectl label pod nginx-pod version1.0 -n devpod/nginx-pod labeled# 为pod资源更新标签[rootmaster ~]# kubectl label pod nginx-pod version2.0 -n dev --overwritepod/nginx-pod labeled# 查看标签[rootmaster ~]# kubectl get pod nginx-pod -n dev --show-labelsNAME READY STATUS RESTARTS AGE LABELS nginx-pod1/1 Running010mversion2.0# 筛选标签[rootmaster ~]# kubectl get pod -n dev -l version2.0 --show-labelsNAME READY STATUS RESTARTS AGE LABELS nginx-pod1/1 Running017mversion2.0[rootmaster ~]# kubectl get pod -n dev -l version!2.0 --show-labelsNo resources foundindev namespace.#删除标签[rootmaster ~]# kubectl label pod nginx-pod version- -n devpod/nginx-pod labeled配置方式apiVersion:v1kind:Podmetadata:name:nginxnamespace:devlabels:version:3.0env:testspec:containers:-image:nginx:latestname:podports:-name:nginx-portcontainerPort:80protocol:TCP然后就可以执行对应的更新命令了kubectl apply -f pod-nginx.yaml4.4 Deployment 在kubernetes中Pod是最小的控制单元但是kubernetes很少直接控制Pod一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理确保pod资源符合预期的状态当pod的资源出现故障时会尝试进行重启或重建pod。在kubernetes中Pod控制器的种类有很多本章节只介绍一种Deployment。命令操作# 命令格式: kubectl create deployment 名称 [参数]# --image 指定pod的镜像# --port 指定端口# --replicas 指定创建pod数量# --namespace 指定namespace[rootmaster ~]# kubectl create deploy nginx --imagenginx:latest --port80 --replicas3 -n devdeployment.apps/nginx created# 查看创建的Pod[rootmaster ~]# kubectl get pods -n devNAME READY STATUS RESTARTS AGE nginx-5ff7956ff6-6k8cb1/1 Running019s nginx-5ff7956ff6-jxfjt1/1 Running019s nginx-5ff7956ff6-v6jqw1/1 Running019s# 查看deployment的信息[rootmaster ~]# kubectl get deploy -n devNAME READY UP-TO-DATE AVAILABLE AGE nginx3/3332m42s# UP-TO-DATE成功升级的副本数量# AVAILABLE可用副本的数量[rootmaster ~]# kubectl get deploy -n dev -o wideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx3/3332m51s nginx nginx:latestrunnginx# 查看deployment的详细信息[rootmaster ~]# kubectl describe deploy nginx -n devName: nginx Namespace: dev CreationTimestamp: Wed, 08 May202111:14:14 0800 Labels:runnginx Annotations: deployment.kubernetes.io/revision:1Selector:runnginx Replicas:3desired|3updated|3total|3available|0unavailable StrategyType: RollingUpdate MinReadySeconds:0RollingUpdateStrategy:25% max unavailable,25% max surge Pod Template: Labels:runnginx Containers: nginx: Image: nginx:latest Port:80/TCP Host Port:0/TCP Environment:noneMounts:noneVolumes:noneConditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets:noneNewReplicaSet: nginx-5ff7956ff6(3/3 replicas created)Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 5m43s deployment-controller Scaled up replicaset nginx-5ff7956ff6 to3# 删除[rootmaster ~]# kubectl delete deploy nginx -n devdeployment.appsnginxdeleted配置操作创建一个deploy-nginx.yaml内容如下apiVersion:apps/v1kind:Deploymentmetadata:name:nginxnamespace:devspec:replicas:3selector:matchLabels:run:nginxtemplate:metadata:labels:run:nginxspec:containers:-image:nginx:latestname:nginxports:-containerPort:80protocol:TCP然后就可以执行对应的创建和删除命令了创建kubectl create -f deploy-nginx.yaml删除kubectl delete -f deploy-nginx.yaml4.5 Service 通过上节课的学习已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。虽然每个Pod都会分配一个单独的Pod IP然而却存在如下两问题Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP外部无法访问这样对于访问这个服务带来了难度。因此kubernetes设计了Service来解决这个问题。Service可以看作是一组同类Pod对外的访问接口。借助Service应用可以方便地实现服务发现和负载均衡。操作一创建集群内部可访问的Service# 暴露Service[rootmaster ~]# kubectl expose deploy nginx --namesvc-nginx1 --typeClusterIP --port80 --target-port80 -n devservice/svc-nginx1 exposed# 查看service[rootmaster ~]# kubectl get svc svc-nginx1 -n dev -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE SELECTOR svc-nginx1 ClusterIP10.109.179.231none80/TCP 3m51srunnginx# 这里产生了一个CLUSTER-IP这就是service的IP在Service的生命周期中这个地址是不会变动的# 可以通过这个IP访问当前service对应的POD[rootmaster ~]# curl 10.109.179.231:80!DOCTYPE htmlhtmlheadtitleWelcome to nginx!/title/headbodyh1Welcome to nginx!/h1......./body/html操作二创建集群外部也可访问的Service# 上面创建的Service的type类型为ClusterIP这个ip地址只用集群内部可访问# 如果需要创建外部也可以访问的Service需要修改type为NodePort[rootmaster ~]# kubectl expose deploy nginx --namesvc-nginx2 --typeNodePort --port80 --target-port80 -n devservice/svc-nginx2 exposed# 此时查看会发现出现了NodePort类型的Service而且有一对Port80:31928/TC[rootmaster ~]# kubectl get svc svc-nginx2 -n dev -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE SELECTOR svc-nginx2 NodePort10.100.94.0none80:31928/TCP 9srunnginx# 接下来就可以通过集群外的主机访问 节点IP:31928访问服务了# 例如在的电脑主机上通过浏览器访问下面的地址http://192.168.5.4:31928/删除Service️[rootmaster ~]# kubectl delete svc svc-nginx-1 -n dev service svc-nginx-1 deleted配置方式创建一个svc-nginx.yaml内容如下apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: dev spec: clusterIP:10.109.179.231#固定svc的内网ipports: - port:80protocol: TCP targetPort:80selector: run: nginx type: ClusterIP然后就可以执行对应的创建和删除命令了创建kubectl create -f svc-nginx.yaml删除kubectl delete -f svc-nginx.yaml小结至此已经掌握了Namespace、Pod、Deployment、Service资源的基本操作有了这些操作就可以在kubernetes集群中实现一个服务的简单部署和访问了但是如果想要更好的使用kubernetes就需要深入学习这几种资源的细节和原理。

更多文章