056kubernetes常用命令
kubenetes常用命令
基础命令
语法
YAML语法YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等,YAML的配置文件后缀为 .yml,如:runoob.yml 。
基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只能使用空格
- 空格的数量没关系,只要同层元素左对齐就可以
#
表示注释
数据类型
- 对象: 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
- 纯量(scalars):单个的、不可再分的值
对象
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
也可以使用 key:{key1: value1, key2: value2, ...}
也可以使用缩进表示:【注意:缩进必须是两个空格】
key: key1: value1 key2: value2
数组
以 - 开头的行表示构成一个数组:
containers: - name: A age: 20 - name: B
纯量
纯量是最基本的,不可再分的值,包括:字符串、布尔值、整数、浮点数、Null、时间、日期
boolean: - TRUE #true,True都可以 - FALSE #false,False都可以 float: - 3.14 - 6.8523015e+5 #可以使用科学计数法 int: - 123 - 0b1010_0111_0100_1010_1110 #二进制表示 null: nodeName: 'node' parent: ~ #使用~表示null string: - 'Hello world' #可以使用双引号或者单引号包裹特殊字符 - newline newline2 #字符串可以拆成多行,每一行会被转化成一个空格 date: - 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd datetime: - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
引用
& 锚点和 ***** 别名,可以用来引用:
person: &person hand: true leg: true tom: <<: *person
上述相当于如下:
person: &person hand: true leg: true tom: hand: true leg: true
简单应用
namepace操作
namespace命名规范
Namespace的名字遵循如下正则:
[a-z0-9]([-a-z0-9]*[a-z0-9])?
创建namespace
kubectl get ns 或者 kubectl get namespace
查看集群中创建的namespace
[root@k8s-master1 ~]# kubectl get ns -A NAME STATUS AGE default Active 47h kube-node-lease Active 47h kube-public Active 47h kube-system Active 47h kubernetes-dashboard Active 28h tigera-operator Active 46h zhangtq01 Active 21s
通过yaml
文件创建
vi zhangtq02.yaml
apiVersion: v1 kind: Namespace metadata: name: zhangtq02
通过如下命令创建
kubectl create -f zhangtq02.yaml 或 kubectl apply -f zhangtq02.yaml
image-20230922180516757
删除namespace
使用纯命令删除
kubectl delete ns/zhangtq01 或者 kubectl delete namespace zhangtq01
如果Namespace是使用yaml文件创建的,也可以使用yaml文件进行删除
kubectl delete -f zhangtq02.yaml
pod操作
创建pod
vi test_pod.yaml
apiVersion: v1 kind: Pod metadata: name: pod-test namespace: zhangtq #指定命名空间 labels: name: pod-test spec: containers: - name: pod-test image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80
kubectl create -f test_pod.yaml
查看pod
如果Pod指定了在某个命名空间的话,需要指定命名空间,否则无法查看
[root@k8s-master1 ~]# kubectl get pods -n zhangtq NAME READY STATUS RESTARTS AGE pod-test 0/1 ContainerCreating 0 80s
查看默认命名空间的Pod
kubectl get pods
查看特定命名空间的Pod,比如Namespace为zhangtq下的Pod
kubectl get pods -n zhangtq 或 kubectl get pods --namespace zhangtq
查看所有Pod:
kubectl get pods -A
kubectl支持多种查看方式:
img 例如:
显示Pod更多信息,状态、IP、运行在那个节点等
kubectl get pods pod-name -o=wide
[root@k8s-master1 ~]# kubectl get pods -A -o=wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES default busybox 1/1 Running 0 2d 10.244.36.65 k8s-node1 <none> <none> kube-system calico-kube-controllers-6744f6b6d5-xtslf 1/1 Running 0 2d 10.244.36.66 k8s-node1 <none> <none> kube-system calico-node-chlpw 1/1 Running 0 2d 192.168.0.10 k8s-node1 <none> <none> kube-system calico-node-hk68v 1/1 Running 0 2d 192.168.0.30 k8s-master1 <none>
以yaml格式显示pod的详细信息
[root@k8s-master1 ~]# kubectl get pods pod-test -n zhangtq -o=yaml apiVersion: v1 kind: Pod metadata: annotations: cni.projectcalico.org/podIP: 10.244.159.156/32 cni.projectcalico.org/podIPs: 10.244.159.156/32 creationTimestamp: "2023-09-22T10:16:03Z" labels: name: pod-test name: pod-test namespace: zhangtq resourceVersion: "255387" uid: bbe90147-349c-42b5-b268-f008fcff3ede spec: containers: - image: nginx:latest imagePullPolicy: IfNotPresent name: pod-test ports: - containerPort: 80 protocol: TCP
以自定义列名显示Pod的信息
kubectl get pods podname -o=custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
基于文件的自定义列名输出
kubectl get pods podname -o=custom-columns-file=template.txt vim template.txt NAME RSRC .metadata.name .metadata.resourceVersion
删除pod
纯命令删除
[root@k8s-master1 ~]# kubectl delete pods/pod-test -n zhangtq pod "pod-test" deleted
使用yaml文件删除
kubectl delete -f test_pod.yaml
删除所有Pod
kubectl delete pods --all
执行容器命令
执行pod的某个命令,默认使用pod的第一个容器执行
kubectl exec <pod-name> -- command
[root@k8s-master1 ~]# kubectl exec pod-test -n zhangtq -- ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
指定pod的某个容器执行命令
kubectl exec <pod-name> -c <container-name> date
进入容器
kubectl exec -it <pod-name> -c <container-name> /bin/bash
Deployment操作
- 概述
一般情况下,我们并不直接创建 Pod,而是通过 Deployment 来创建 Pod,由 Deployment 来负责创建、更新、维护其所管理的所有 Pods。
- ReplicationSet(RS)和ReplicationController(RC)区别
这里就需要说一下ReplicationSet(RS)和ReplicationController(RC),RS是在RC基础上发展来的,在新版的Kubernetes中,已经将RC替换为RS 了,它们两者没有本质的区别,都是用于Pod副本数量的维护与更新的,使得副本数量始终维持在用户定义范围内,即如果存在容器异常退出,此时会自动创建新的Pod进行替代;而且异常多出来的容器也会自动回收。
- 不同点在于:RS在RC的基础上支持集合化的selector
一般情况下RS也是可以单独使用的,但是一般推荐和Deployment一起使用,这样会使得的Deployment提供的一些回滚更新操作同样用于RS上,因为RS不支持回滚更新操作,Deployment支持
Deployment工作原理
img RS负责控制副本数量,由Deployment来创建具体的Pod。
RS负责控制副本数量,由Deployment来创建具体的Pod。
Deployment资源清单详解
apiVersion: apps/v1 #版本号
kind: Deployment #类型
metadata: #元数据
name: #rs名称
namespace: #所属命名空间
labels: #标签
controller: deploy
spec: #详情描述
replicas: #副本数量
revisionHistoryLimit: #保留历史版本,默认是10
paused: #暂停部署,默认是false
progressDeadlineSeconds: #部署超时时间(s),默认是600
strategy: #策略
type: RollingUpdates #滚动更新策略
rollingUpdate: #滚动更新
maxSurge: #最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavaliable: #最大不可用状态的pod的最大值,可以为百分比,也可以为整数
selector: #选择器,通过它指定该控制器管理哪些pod
matchLabels: #Labels匹配规则
app: nginx-pod
matchExpressions: #Expression匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
deployment应用
实例一
创建pc-deplpyment.yaml文件
apiVersion: apps/v1 kind: Deployment metadata: name: pc-deployment namespace: dev spec: replicas: 3 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1
执行下面的命令
kubectl create namespace dev kubectl create -f pc-deployment.yaml kubectl get deploy -n dev -o wide
[root@k8s-master1 ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR pc-deployment 0/3 3 0 7s nginx nginx:1.17.1 app=nginx-pod
[root@k8s-master1 ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pc-deployment-6f6bc8fc5f-9djrw 0/1 ContainerCreating 0 6m2s pc-deployment-6f6bc8fc5f-g44j7 1/1 Running 0 6m2s pc-deployment-6f6bc8fc5f-xx4j9 1/1 Running 0 6m2s
查看deployment控制的rs和pod,发现rs是在deployment之后加了一段字符串,而pod是在rs之后加了一段字符串。
删除
kubectl delete deploy pc-deployment -n de 或者 kubectl delete -f pc-deplpoyment.yaml
Service操作
- 简述
简介:将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pod 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡
- 为什么需要Service
我们在创建deployment无状态服务集的时候分享过,无状态服务内的多个Pod的名称是随机的.pod被重新启动调度后,它的名称与IP都会发生变化,无状态服务的Pod副本集中的每一个Pod都是相同的,他们提供相同的服务,但介于此(名称与IP会发生变化)外部该如何做到访问到他们呢,这就需要Service的服务发现,让外部统一去访问Service,让Service起到一个类似于网关的作用。
创建
之前创建deployment的时候我们创建了一个个数为三的nginx副本集,使用以下命令,将该deployment(包含三个nginx)的80端口对外暴露为80
方式一:命令行创建
kubectl expose deployment pc-deployment --port=80 --target-port=80 --type=ClusterIP -n dev
# pc-deployment为控制器的名称
- 查看控制器里设定的pod标签
[root@k8s-master1 ~]# kubectl get pod --show-labels -n dev
NAME READY STATUS RESTARTS AGE LABELS
pc-deployment-6f6bc8fc5f-4srdl 1/1 Running 0 9m26s app=nginx-pod,pod-template-hash=6f6bc8fc5f
pc-deployment-6f6bc8fc5f-fml7z 0/1 ImagePullBackOff 0 9m26s app=nginx-pod,pod-template-hash=6f6bc8fc5f
pc-deployment-6f6bc8fc5f-rfnq8 1/1 Running 0 9m26s app=nginx-pod,pod-template-hash=6f6bc8fc5f
方式二:使用yaml文件创建
vi nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
name: nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 30002
selector:
name: nginx
kubectl create -f nginx-service.yaml
查看service
使用以下命令来查看当前K8S集群中的service
如果指定了命名空间,则需要加上-n或--namespace参数指定Namespace
kubectl get svc 或 kubectl get service
获取命名空间下的service
[root@k8s-master1 ~]# kubectl get service -n dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE pc-deployment ClusterIP 10.109.74.60 <none> 80/TCP 5m12s
获取指定标签的pod
[root@k8s-master1 ~]# kubectl get pod -l app=nginx-pod -n dev
NAME READY STATUS RESTARTS AGE
pc-deployment-6f6bc8fc5f-4srdl 1/1 Running 0 21m
pc-deployment-6f6bc8fc5f-fml7z 0/1 ErrImagePull 0 21m
pc-deployment-6f6bc8fc5f-rfnq8 1/1 Running 0 21m
[root@k8s-master1 ~]#
删除
命令删除
kubectl delete svc/nginx
如果使用yaml文件创建,也可以使用yaml文件删除
kubectl delete -f nginx-service.yaml
通用操作
查看某个资源的详细信息
kubectl describe 资源类型 资源名称
或
kubectl describe 资源类型/资源名称
查看某个资源的日志
kubectl logs 资源类型 资源名称
或
kubectl logs 资源类型/资源名称
跟踪查看容器的日志,相当于tail -f命令
kubectl logs -f <pod-name> -c <container-name>