Kubernetes分类、核心组件、网络模型、kubectl常用命令

1 k8s的pod分类

pod分为两种类型:一种为自主式pod,一种为控制器管理的pod

  • 自我管理的pod

    • 这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。,

    • 直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。

    • 如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐那么此pod将会消失。其无法实现全局调度。所以不推荐使用此种pod。

  • 控制器管理的Pod

    • Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可 以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的

每个Pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器

1.1 常见的pod控制器

replicationController:当启动一个pod时,这个pod如果不够用可以再启一个副本,而后由控制器来管理同一类pod的各种副本与对象。一旦副本少了就会自动增加。采取多退少补的规则,精确符合我们所定义的期望;支持滚动更新。(比较原始的pod控制器,已经被废弃,由ReplicaSet替代)

  • replicaset:由一个名叫Deployment的声明式更新的控制器来管理

  • Deployment:Deployment只能管理无状态的应用

  • StateFulSet:有状态副本集,可以管理有状态的应用

  • DaemonSet:如果需要在每个node上运行一个副本的时候可以用DaemonSet

  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务

  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行

2 kubernetes的核心组件

2.1HPA

HPA(Horizontal Pod Autoscaler,水平pod自动伸缩控制器),K8S通过对Pod中运行的容器各项指标(CPU占用、内存占用、网络请求量)的检测,实现对Pod实例个数的动态新增和减少。

HPA的实现是一个控制循环,由controller manager的–horizontal-pod-autoscaler-sync-period参数指定周期(默认值为15秒)。每个周期内,controller manager根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。controller manager可以从resource metrics API(pod 资源指标)和custom metrics API(自定义指标)获取指标。

  • 1 对于每个pod的资源指标(如CPU),控制器从资源指标API中获取每一个 HorizontalPodAutoscaler指定的pod的指标,然后,如果设置了目标使用率,控制器获取每个pod中的容器资源使用情况,并计算资源使用率。如果使用原始值,将直接使用原始数据(不再计算百分比)。然后,控制器根据平均的资源使用率或原始值计算出缩放的比例,进而计算出目标副本数。需要注意的是,如果pod某些容器不支持资源采集,那么控制器将不会使用该pod的CPU使用率

  • 2 如果 pod 使用自定义指标,控制器机制与资源指标类似,区别在于自定义指标只使用原始值,而不是使用率。

  • 3 如果pod 使用对象指标和外部指标(每个指标描述一个对象信息)。这个指标将直接跟据目标设定值相比较,并生成一个上面提到的缩放比例。在autoscaling/v2beta2版本API中,这个指标也可以根据pod数量平分后再计算。通常情况下,控制器将从一系列的聚合API(metrics.k8s.io、custom.metrics.k8s.io和external.metrics.k8s.io)中获取指标数据。metrics.k8s.io API通常由 metrics-server(需要额外启动)提供。

原理:
通过集群内的资源监控系统(metrics-server),来获取集群中资源的使用状态。
根据CPU、内存、以及用户自定义的资源指标数据的使用量或连接数为参考依据,来制定一个临界点,一旦超出这个点,HPA就会自动创建出pod副本,如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ejjURNNJ-1639924854526)(https://tse1-mm.cn.bing.net/th/id/R-C.2571f249ef9868d068054fb359aa3924?rik=vA8lNrlggE4OAQ&riu=http%3a%2f%2francher2.docs.rancher.cn%2fimg%2francher%2fhorizontal-pod-autoscaler.jpg&ehk=wqWYMQflEt4d4shDt3%2b00KMweVsDWLVWX6tRAb%2fx%2bKk%3d&risl=&pid=ImgRaw&r=0)]

流程

  • 1、创建HPA资源,设定目标CPU使用率限额,以及最大、最小实例数
  • 2、收集一组中(PodSelector)每个Pod最近一分钟内的CPU使用率,并计算平均值
  • 3、读取HPA中设定的CPU使用限额
  • 4、计算:平均值之和/限额,求出目标调整的实例个数
  • 5、目标调整的实例数不能超过1中设定的最大、最小实例数,如果没有超过,则扩容;超过,则扩容至最大的实例个数
  • 6、回到2,不断循环

2.2 service

2.2.1 Kubernetes Service核心概念
  • Service是kubernetes最核心的概念,通过创建Service,可以为一组具有相同功能的POD应用提供统一的访问入口,并且将请求进行负载分发到后端的各个容器应用上。

  • 在Kubernetes中,在受到RC调控的时候,Pod副本是变化的,对于的虚拟IP也是变化的,比如发生迁移或者伸缩的时候。这对于Pod的访问者来说是不可接受的。

  • Kubernetes中的Service是一种抽象概念,它定义了一个Pod逻辑集合以及访问它们的策略,Service同Pod的关联同样是居于Label来完成的。Service的目标是提供一种桥梁, 它会为访问者提供一个固定访问地址,用于在访问时重定向到相应的后端,这使得非 Kubernetes原生应用程序,在无须为Kubemces编写特定代码的前提下,轻松访问后端。

  • Service同RC一样,都是通过Label来关联Pod的。当你在Service的yaml文件中定义了该Service的selector中的label为app:my-web,那么这个Service会将Pod–>metadata–>labeks中label为app:my-web的Pod作为分发请求的后端。

  • 当Pod发生变化时(增加、减少、重建等),Service会及时更新。这样一来,Service就可以作为Pod的访问入口,起到代理服务器的作用,而对于访问者来说,通过Service进行访问,无需直接感知Pod。

2.2.2 Kubernetes Service实现方式
  • Kubernetes分配给Service的固定IP是一个虚拟IP,并不是一个真实的IP,在外部是无法寻址的。在真实的系统实现上,Kubernetes是通过Kube-proxy组件来实现的虚拟IP路由及转发。所以在之前集群部署的环节上,我们在每个Node上均部署了Proxy这个组件,从而实现了Kubernetes层级的虚拟转发网络。

  • Kubernetes通过为每个service分配一个唯一的ClusterIP,所以当使用ClusterIP:port的组合访问一个service的时候,不管port是什么,这个组合是一定不会发生重复的。另一方面,kube-proxy为每个service真正打开的是一个绝对不会重复的随机端口,用户在service描述文件中指定的访问端口会被映射到这个随机端口上。这就是为什么用户可以在创建service时随意指定访问端口。

  • K8S集群中,Pod的IP是在docker0网段动态分配的,当发生重启,扩容等操作时,IP地址会随之变化。当某个Pod(frontend)需要去访问其依赖的另外一组Pod(backend)时,如果backend的IP发生变化时,如何保证fronted到backend的正常通信变的非常重要,此时需要借助Service实现统一访问。

  • Service的Virtual VIP是由Kubernetes虚拟出来的内部网络,外部是无法寻址到的。但是有些服务又需要被外部访问到,例如web前段。这时候就需要加一层网络转发,即外网到内网的转发。Kubernetes提供了NodePort、LoadBalancer、Ingress三种方式:

    • NodePort,原理是Kubernetes会在每一个Node上暴露出一个端口:nodePort,外部网络可以通过(任一Node)[NodeIP]:[NodePort]访问到后端的Service。
    • LoadBalancer,在NodePort基础上,Kubernetes可以请求底层云平台创建一个负载均衡器,将每个Node作为后端,进行服务分发。该模式需要底层云平台(例如GCE)支持。
    • Ingress,是一种HTTP方式的路由转发机制,由Ingress Controller和HTTP代理服务器组合而成。Ingress Controller实时监控Kubernetes API,实时更新HTTP代理服务器的转发规则。HTTP代理服务器有GCE Load-Balancer、HaProxy、Nginx等开源方案。

2 kubernetes网络模型

Kubernetes的网络模型从内至外由四个部分组成:

  • Pod内部容器所在的网络
  • Pod所在的网络
  • Pod和Service之间通信的网络
  • 外界与Service之间通信的网络

img

单个pod的网络模型是容器网络模型的扩展,但是pod与pod之间的是怎么相互通信的呢?这其实与容器之间相互通信非常类似,也分为同一个主机上的pod之间与跨主机的pod之间两种。

如容器网络模型一样,对于统一主机上的pod之间,通过docker0网桥设备直接二层(数据链路层)网络上通过MAC地址直接通信:

img

而跨主机的pod之间的相互通信也主要有以下两个思路:

    1. 修改底层网络设备配置,加入容器网络IP地址的管理,修改路由器网关等,该方式主要和SDN(Software define networking)结合。
    1. 完全不修改底层网络设备配置,复用原有的underlay平面网络,解决容器跨主机通信,主要有如下两种方式:
    • 1 隧道传输(Overlay): 将容器的数据包封装到原主机网络的三层或者四层数据包中,然后使用主机网络的IP或者TCP/UDP传输到目标主机,目标主机拆包后再转发给目标容器。Overlay隧道传输常见方案包括Vxlan、ipip等,目前使用Overlay隧道传输技术的主流容器网络有Flannel等;

    img

    • 2 修改主机路由:把容器网络加到主机路由表中,把主机网络设备当作容器网关,通过路由规则转发到指定的主机,实现容器的三层互通。目前通过路由技术实现容器跨主机通信的网络如Flannel host-gw、Calico等;

img

下面简单介绍几种主流的方案:

  • Flannel是目前使用最为普遍的方案,提供了多种网络backend,它支持多种数据路径,也适合于overlay/underlay等多种场景。对于overlay的数据包封装,可以使用用户态的UDP,内核态的Vxlan(性能相对较好),甚至在集群规模不大,且处于同一个二层域时可以采用host-gw的方式修改主机路由表;
  • Weave工作模式与Flannel很相似的,它最早只提供了UDP(称为sleeve模式)的网络方式,后来又加上了fastpass方式(基于VxLAN),不过Weave消除了Flannel中用来存储网络地址的额外组件,自己集成了高可用的数据存储功能;
  • Calico主要是采用了修改主机路由,节点之间采用BGP的协议去进行路由的同步。但是现实中的网络并不总是支持BGP路由的,因此Calico也支持内核中的IPIP模式,使用overlay的方式来传输数据;

3 kubectl常用命令

命令语法描述
createkubectl create -f FILENAME [options]通过文件名或标准输入创建资源;
exposekubectl expose (-f FILENAME |TYPE NAME) [ --port=port] [ --protocol=TCP |UDP|SCTP] [ --target-port=number-or-name][ --name=name] [ --external-ip=external-ip-of-service] [ --type=type] [options]将rc,svc,deploy,pod暴露为一个新的svc
runkubectl run NAME --image=image [ --env=“key=value”] [ --port=port] [ --replicas=replicas] [ --dry-run=bool] [ --overrides=inline-json] [ --command] --[COMMAND] [args…] [options]在集群中运行一个特定的镜像;
setkubectl set SUBCOMMAND [options]更改现有的应用程序资源,在对象上设置特定的功能;
explainkubectl explain RESOURCE [options]文档参考资料;
getkubectl get [(-o|–output=)json|yaml|wide|custom-columns=…|custom-columns-file=…|go-template=…|go-template-file=…|jsonpath=…|jsonpath-file=…](TYPE[.VERSION][.GROUP] [NAME |-l label] |TYPE[.VERSION][.GROUP]/NAME …) [flags] [options]查询一个或多个资源;
editkubectl edit (RESOURCE/NAME |-f FILENAME) [options]使用系统编辑器编辑一个资源;
deletekubectl delete ([-f FILENAME] |[-k DIRECTORY] |TYPE [(NAME |-l label |–all)]) [options]通过文件名,标准输入,资源名称或标签选择器来删除资源


部署命令

命令语法描述
rolloutkubectl rollout SUBCOMMAND [options]管理资源的部署,SUBCOMMAND包括history、pause、restart、resume、status、undo
rolling-updatekubectl rolling-update OLD_CONTROLLER_NAME([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE |-f NEW_CONTROLLER_SPEC) [options]通过逐步替换指定的副本控制器和Pod来执行滚动更新
scalekubectl scale [ --resource-version=version] [ --current-replicas=count] --replicas=COUNT (-f FILENAME |TYPE NAME)[options]扩宿容副本集的数量
autoscalekubectl autoscale (-f FILENAME |TYPE NAME |TYPE/NAME) [ --min=MINPODS] --max=MAXPODS [ --cpu-percent=CPU] [options]自动扩宿容由副本控制器管理的Pod


​集群命令

命令语法描述
certificatekubectl certificate SUBCOMMAND [options]修改证书资源,SUBCOMMAND包括approve、deny
cluster-infokubectl cluster-info [flags] [options]显示群集中的主节点和服务的的端点信息
topkubectl top [flags] [options]显示node或pod资源(CPU/内存/存储)使用情况
cordonkubectl cordon NODE [options]将node标记为不可调度
uncordonkubectl uncordon NODE [options]将node标记为可调度
drainkubectl drain NODE [options]驱逐节点,准备维护
taintkubectl taint NODE NAME KEY_1=VAL_1:TAINT_EFFECT_1 … KEY_N=VAL_N:TAINT_EFFECT_N [options]更新一个或多个节点上的污点

3.1 显示Node的详细信息

[root@master ~]# kubectl describe nodes node1
Name:               node1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=node1
                    kubernetes.io/os=linux
Annotations:        flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"8a:60:25:cf:7d:5c"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 192.168.200.144
                    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Sun, 19 Dec 2021 00:25:34 +0800
Taints:             <none>
Unschedulable:      false
Lease:
  HolderIdentity:  node1
  AcquireTime:     <unset>
  RenewTime:       Sun, 19 Dec 2021 21:52:11 +0800
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message

----                 ------  -----------------                 ------------------                ------                       -------

  NetworkUnavailable   False   Sun, 19 Dec 2021 20:25:02 +0800   Sun, 19 Dec 2021 20:25:02 +0800   FlannelIsUp                  Flannel is running on this node
  MemoryPressure       False   Sun, 19 Dec 2021 21:50:10 +0800   Sun, 19 Dec 2021 00:25:34 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Sun, 19 Dec 2021 21:50:10 +0800   Sun, 19 Dec 2021 00:25:34 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Sun, 19 Dec 2021 21:50:10 +0800   Sun, 19 Dec 2021 00:25:34 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Sun, 19 Dec 2021 21:50:10 +0800   Sun, 19 Dec 2021 00:37:20 +0800   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:  192.168.200.144
  Hostname:    node1
Capacity:
  cpu:                4
  ephemeral-storage:  64169356Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             7926636Ki
  pods:               110
Allocatable:
  cpu:                4
  ephemeral-storage:  59138478392
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             7824236Ki
  pods:               110
System Info:
  Machine ID:                 15ba92159ac148348460ace7eba7aeac
  System UUID:                69264d56-1673-87fa-ac53-9b8c4c3eb607
  Boot ID:                    a8b02d9e-4a20-45c0-937d-fced69b72713
  Kernel Version:             4.18.0-257.el8.x86_64
  OS Image:                   CentOS Stream 8
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://20.10.12
  Kubelet Version:            v1.20.0
  Kube-Proxy Version:         v1.20.0
PodCIDR:                      10.244.1.0/24
PodCIDRs:                     10.244.1.0/24
Non-terminated Pods:          (3 in total)
  Namespace                   Name                      CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE

---------                   ----                      ------------  ----------  ---------------  -------------  ---

  default                     nginx-6799fc88d8-mhp5g    0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
  kube-system                 kube-flannel-ds-xsf44     100m (2%)     100m (2%)   50Mi (0%)        50Mi (0%)      21h
  kube-system                 kube-proxy-7d54c          0 (0%)        0 (0%)      0 (0%)           0 (0%)         21h
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests   Limits

--------           --------   ------

  cpu                100m (2%)  100m (2%)
  memory             50Mi (0%)  50Mi (0%)
  ephemeral-storage  0 (0%)     0 (0%)
  hugepages-1Gi      0 (0%)     0 (0%)
  hugepages-2Mi      0 (0%)     0 (0%)
Events:              <none>
[root@master ~]# 

3.2 显示Pod的详细信息

[root@master ~]# kubectl describe pods
Name:         nginx-6799fc88d8-mhp5g
Namespace:    default
Priority:     0
Node:         node1/192.168.200.144
Start Time:   Sun, 19 Dec 2021 00:39:08 +0800
Labels:       app=nginx
              pod-template-hash=6799fc88d8
Annotations:  <none>
Status:       Running
IP:           10.244.1.3
IPs:
  IP:           10.244.1.3
Controlled By:  ReplicaSet/nginx-6799fc88d8
Containers:
  nginx:
    Container ID:   docker://9c71970024b58f8d1eb13d0cf67d863c448a1d4317bdd409f4267e5377aca34a
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Sun, 19 Dec 2021 20:25:18 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    255
      Started:      Sun, 19 Dec 2021 00:39:50 +0800
      Finished:     Sun, 19 Dec 2021 20:24:41 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-bk45x (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-bk45x:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-bk45x
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
[root@master ~]# 

3.3 查看pods所在的运行节点

[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-mhp5g   1/1     Running   1          21h   10.244.1.3   node1   <none>           <none>
[root@master ~]# 

3.4 查看pods定义的详细信息

[root@master ~]# kubectl get pods -o yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: Pod
  metadata:
    creationTimestamp: "2021-12-18T16:39:08Z"
    generateName: nginx-6799fc88d8-
    labels:
      app: nginx
      pod-template-hash: 6799fc88d8
    managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
......

3.5 查看rc和servers

[root@master ~]# kubectl get rc,svc
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        21h
service/nginx        NodePort    10.109.48.237   <none>        80:31253/TCP   21h
[root@master ~]# 

3.5 获取所有deployment

[root@master ~]# kubectl get deployment --all-namespaces
NAMESPACE     NAME      READY   UP-TO-DATE   AVAILABLE   AGE
default       nginx     1/1     1            1           21h
kube-system   coredns   2/2     2            2           21h
[root@master ~]# 

3.6 获取全部节点信息

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   21h   v1.20.0
node1    Ready    <none>                 21h   v1.20.0
node2    Ready    <none>                 21h   v1.20.0

3.7 kubectl create创建

#创建一个deployment类型叫web的pod
[root@master ~]# kubectl create deployment web --image nginx
deployment.apps/web created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-mhp5g   1/1     Running             1          21h
web-96d5df5c8-mpgx9      0/1     ContainerCreating   0          12s
[root@master ~]# 

#创建一个deployment类型叫test的pod并执行sleep 800
[root@master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-mhp5g   1/1     Running             1          21h
test-7bd66d986d-sd6xx    0/1     ContainerCreating   0          7s
web-96d5df5c8-mpgx9      1/1     Running             0          2m11s
[root@master ~]# 

#创建5个叫myapp的pod
[root@master ~]# kubectl create deployment myapp --image nginx --replicas 5
deployment.apps/myapp created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
myapp-6d8d776547-l8lzz   0/1     ContainerCreating   0          8s
myapp-6d8d776547-sb898   0/1     ContainerCreating   0          8s
myapp-6d8d776547-smxkq   0/1     ContainerCreating   0          8s
myapp-6d8d776547-tgdq4   0/1     ContainerCreating   0          8s
myapp-6d8d776547-z2lv2   0/1     ContainerCreating   0          8s
nginx-6799fc88d8-mhp5g   1/1     Running             1          21h
test-7bd66d986d-sd6xx    1/1     Running             0          71s
web-96d5df5c8-mpgx9      1/1     Running             0          3m15s
[root@master ~]# 

3.8 kubectl run 运行

#运行一个nginx的pod(默认创建pod类型)
[root@master ~]# kubectl run nginx --image nginx
pod/nginx created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx                    0/1     Running  0          8s

#运行一个标签为"app=nginx"的pod
[root@master ~]# kubectl run nginx --image nginx --labels "app=nginx" --replicas 3
Flag --replicas has been deprecated, has no effect and will be removed in the future.
Error from server (AlreadyExists): pods "nginx" already exists
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx                    1/1     Running   0          3m43s
[root@master ~]# 
[root@master ~]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         node2/192.168.200.153
Start Time:   Sun, 19 Dec 2021 22:13:20 +0800
Labels:       run=nginx
Annotations:  <none>
Status:       Running
IP:           10.244.2.4


# 试运行;打印相应的 API 对象而不创建它们
[root@master ~]# kubectl run nginx --image nginx --dry-run=client
pod/nginx created (dry run)
[root@master ~]#
[root@master ~]# kubectl get pods
No resources found in default namespace.

#启动一个busybox pod并保持在前台,如果退出不要重启
[root@master ~]# kubectl run -it busybox --image busybox --restart=Never
If you don't see a command prompt, try pressing enter.
/ # exit
[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
busybox                  0/1     Completed   0          42s

3.9 kubectl expose 给指定pod暴露端口

#myapp的80映射到本机的8080
[root@master ~]# kubectl expose deployment myapp --port 8080 --target-port 80
service/myapp exposed
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        22h
myapp        ClusterIP   10.108.162.12   <none>        8080/TCP       11s
nginx        NodePort    10.109.48.237   <none>        80:31253/TCP   21h
[root@master ~]# 
[root@master ~]# curl 10.108.162.12:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome 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>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<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>

3.10 kubectl delete 删除

#删除具有相同名称myapp的 Pod 和服务
[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
busybox                  0/1     Completed   0          7m12s
myapp-6d8d776547-l8lzz   1/1     Running     0          16m
myapp-6d8d776547-sb898   1/1     Running     0          16m
myapp-6d8d776547-smxkq   1/1     Running     0          16m
myapp-6d8d776547-tgdq4   1/1     Running     0          16m
myapp-6d8d776547-z2lv2   1/1     Running     0          16m
nginx                    1/1     Running     0          14m
nginx-6799fc88d8-mhp5g   1/1     Running     1          21h
test-7bd66d986d-sd6xx    1/1     Running     1          17m
web-96d5df5c8-mpgx9      1/1     Running     0          19m

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        22h
myapp        ClusterIP   10.108.162.12   <none>        8080/TCP       11s
nginx        NodePort    10.109.48.237   <none>        80:31253/TCP   21h
[root@master ~]# kubectl delete deployment,svc myapp
deployment.apps "myapp" deleted
service "myapp" deleted
[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
busybox                  0/1     Completed   0          8m21s
nginx                    1/1     Running     0          16m
nginx-6799fc88d8-mhp5g   1/1     Running     1          21h
test-7bd66d986d-sd6xx    1/1     Running     1          18m
web-96d5df5c8-mpgx9      1/1     Running     0          20m
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        22h
nginx        NodePort    10.109.48.237   <none>        80:31253/TCP   21h
[root@master ~]# 

# 删除标签 app=nginx 的 Pod 和服务
[root@master ~]# kubectl run test --image nginx --labels "web=nginx"
pod/test created
[root@master ~]# kubectl run test1 --image nginx --labels "web=nginx"
pod/test1 created
[root@master ~]# kubectl run test2 --image nginx --labels "web=nginx"
pod/test2 created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
busybox                  0/1     Completed           0          10m
nginx                    1/1     Running             0          17m
nginx-6799fc88d8-mhp5g   1/1     Running             1          21h
test                     0/1     ContainerCreating   0          16s
test-7bd66d986d-sd6xx    1/1     Running             1          20m
test1                    0/1     ContainerCreating   0          10s
test2                    0/1     ContainerCreating   0          6s
web-96d5df5c8-mpgx9      1/1     Running             0          22m
[root@master ~]# 


[root@master ~]# kubectl delete pod -l "web=nginx"
pod "test" deleted
pod "test1" deleted
pod "test2" deleted
[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
busybox                  0/1     Completed   0          11m
nginx                    1/1     Running     0          18m
nginx-6799fc88d8-mhp5g   1/1     Running     1          21h
test-7bd66d986d-sd6xx    1/1     Running     1          21m
web-96d5df5c8-mpgx9      1/1     Running     0          23m
[root@master ~]# 


#删除所以pod
[root@master ~]# kubectl delete deployment --all
deployment.apps "nginx" deleted
deployment.apps "test" deleted
deployment.apps "web" deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.
Logo

开源、云原生的融合云平台

更多推荐