Kubernetes进阶
文章目录Kubernetes分类、核心组件、网络模型、kubectl常用命令1 k8s的pod分类1.1 常见的pod控制器2 kubernetes的核心组件2.1HPA2.2 service2.2.1 Kubernetes Service核心概念2.2.2 Kubernetes Service实现方式2 kubernetes网络模型3 kubectl常用命令3.1 显示Node的详细信息3.2
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之间通信的网络
单个pod的网络模型是容器网络模型的扩展,但是pod与pod之间的是怎么相互通信的呢?这其实与容器之间相互通信非常类似,也分为同一个主机上的pod之间与跨主机的pod之间两种。
如容器网络模型一样,对于统一主机上的pod之间,通过docker0
网桥设备直接二层(数据链路层)网络上通过MAC地址直接通信:
而跨主机的pod之间的相互通信也主要有以下两个思路:
-
- 修改底层网络设备配置,加入容器网络IP地址的管理,修改路由器网关等,该方式主要和SDN(Software define networking)结合。
-
- 完全不修改底层网络设备配置,复用原有的underlay平面网络,解决容器跨主机通信,主要有如下两种方式:
- 1 隧道传输(Overlay): 将容器的数据包封装到原主机网络的三层或者四层数据包中,然后使用主机网络的IP或者TCP/UDP传输到目标主机,目标主机拆包后再转发给目标容器。Overlay隧道传输常见方案包括Vxlan、ipip等,目前使用Overlay隧道传输技术的主流容器网络有Flannel等;
- 2 修改主机路由:把容器网络加到主机路由表中,把主机网络设备当作容器网关,通过路由规则转发到指定的主机,实现容器的三层互通。目前通过路由技术实现容器跨主机通信的网络如Flannel host-gw、Calico等;
下面简单介绍几种主流的方案:
- 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常用命令
命令 | 语法 | 描述 |
---|---|---|
create | kubectl create -f FILENAME [options] | 通过文件名或标准输入创建资源; |
expose | kubectl 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 |
run | kubectl run NAME --image=image [ --env=“key=value”] [ --port=port] [ --replicas=replicas] [ --dry-run=bool] [ --overrides=inline-json] [ --command] --[COMMAND] [args…] [options] | 在集群中运行一个特定的镜像; |
set | kubectl set SUBCOMMAND [options] | 更改现有的应用程序资源,在对象上设置特定的功能; |
explain | kubectl explain RESOURCE [options] | 文档参考资料; |
get | kubectl 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] | 查询一个或多个资源; |
edit | kubectl edit (RESOURCE/NAME |-f FILENAME) [options] | 使用系统编辑器编辑一个资源; |
delete | kubectl delete ([-f FILENAME] |[-k DIRECTORY] |TYPE [(NAME |-l label |–all)]) [options] | 通过文件名,标准输入,资源名称或标签选择器来删除资源 |
部署命令
命令 | 语法 | 描述 |
---|---|---|
rollout | kubectl rollout SUBCOMMAND [options] | 管理资源的部署,SUBCOMMAND包括history、pause、restart、resume、status、undo |
rolling-update | kubectl rolling-update OLD_CONTROLLER_NAME([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE |-f NEW_CONTROLLER_SPEC) [options] | 通过逐步替换指定的副本控制器和Pod来执行滚动更新 |
scale | kubectl scale [ --resource-version=version] [ --current-replicas=count] --replicas=COUNT (-f FILENAME |TYPE NAME)[options] | 扩宿容副本集的数量 |
autoscale | kubectl autoscale (-f FILENAME |TYPE NAME |TYPE/NAME) [ --min=MINPODS] --max=MAXPODS [ --cpu-percent=CPU] [options] | 自动扩宿容由副本控制器管理的Pod |
集群命令
命令 | 语法 | 描述 |
---|---|---|
certificate | kubectl certificate SUBCOMMAND [options] | 修改证书资源,SUBCOMMAND包括approve、deny |
cluster-info | kubectl cluster-info [flags] [options] | 显示群集中的主节点和服务的的端点信息 |
top | kubectl top [flags] [options] | 显示node或pod资源(CPU/内存/存储)使用情况 |
cordon | kubectl cordon NODE [options] | 将node标记为不可调度 |
uncordon | kubectl uncordon NODE [options] | 将node标记为可调度 |
drain | kubectl drain NODE [options] | 驱逐节点,准备维护 |
taint | kubectl 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.
更多推荐
所有评论(0)