目录
kubectl的基本命令
k8s常用操作命令
k8s常用命令操作示例
资源管理
命令式对象管理 kubectl命令
资源类型
查看k8s对象状态
k8s对象配置
k8s容器编排配置文件模板
1. deployment
相关使用
创建deployment
更新deployment
回退deployment
暂停和恢复deployment
2 namespace
3 pod
4 label
5 service
kubectl的基本命令
kubectl annotate – 更新资源的注解。
kubectl api-versions – 以“组/版本”的格式输出服务端支持的API版本。
kubectl apply – 通过文件名或控制台输入,对资源进行配置。
kubectl attach – 连接到一个正在运行的容器。
kubectl autoscale – 对replication controller进行自动伸缩。
kubectl cluster-info – 输出集群信息。
kubectl config – 修改kubeconfig配置文件。
kubectl create – 通过文件名或控制台输入,创建资源。
kubectl delete – 通过文件名、控制台输入、资源名或者label selector删除资源。
kubectl describe – 输出指定的一个/多个资源的详细信息。
kubectl edit – 编辑服务端的资源。
kubectl exec – 在容器内部执行命令。
kubectl expose – 输入replication controller,service或者pod,并将其暴露为新的kubernetes service。
kubectl get – 输出一个/多个资源。
kubectl label – 更新资源的label。
kubectl logs – 输出pod中一个容器的日志。
kubectl namespace -(已停用)设置或查看当前使用的namespace。
kubectl patch – 通过控制台输入更新资源中的字段。
kubectl port-forward – 将本地端口转发到Pod。
kubectl proxy – 为Kubernetes API server启动代理服务器。
kubectl replace – 通过文件名或控制台输入替换资源。
kubectl rolling-update – 对指定的replication controller执行滚动升级。
kubectl run – 在集群中使用指定镜像启动容器。
kubectl scale – 为replication controller设置新的副本数。
kubectl stop – (已停用)通过资源名或控制台输入安全删除资源。
kubectl version – 输出服务端和客户端的版本信息。
kubectl cordon 设定node不可使用
kubectl uncordon 设定node可以使用
kubectl drain 设定node进入维护模式
#查看所有命名空间的pod:
kubectl get po -o wide --all-namespaces
#查看所有命名空间的rc(其他资源类似,把rc换成其他资源即可):
kubectl get rc -o wide --all-namespaces
#查看kube-system命名空间的pod:
kubectl get po -o wide -n kube-system
#查看defalut命名空间的pod(default命名空间的可以省略 -n default,其他资源也一样):
kubectl get po -o wide
#根据yaml文件创建资源:
kubectl apply -f aaa.yaml # 可重复使用,不报错
或
kubectl create -f aaa.yaml # 重复使用会报错
#根据yaml文件删除创建资源:
kubectl delete -f aaa.yaml
#获取pod(这里以kube-proxy-7gkfk为例,kube-proxy-7gkfk是pod名字)详细信息:
kubectl describe po kube-proxy-7gkfk -n kube-system
#获取某rc(这里以mysql为例,mysql是rc名字)详细信息:
kubectl describe rc mysql
#查看某pod(这里以etcd-see-k8s-master1为例,etcd-see-k8s-master1为pod名字)日志:
kubectl logs etcd-see-k8s-master1 -n kube-system
#查看帮助
kubectl help
k8s常用操作命令
[root@k8s-master opt]# kubectl --help
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
# 基本命令初级
Basic Commands (Beginner):
create Create a resource from a file or from stdin.
expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes
Service
run 在集群中运行一个指定的镜像
set 为 objects 设置一个指定的特征
# 基本命令中级
Basic Commands (Intermediate):
explain 查看资源的文档
get 显示一个或更多 resources
edit 在服务器上编辑一个资源
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
# 控制器部署命令
Deploy Commands:
rollout Manage the rollout of a resource
scale Set a new size for a Deployment, ReplicaSet or Replication Controller
autoscale Auto-scale a Deployment, ReplicaSet, StatefulSet, or ReplicationController
# 集群管理
Cluster Management Commands:
certificate 修改 certificate 资源.
cluster-info 显示集群信息
top 显示 Resource (CPU/Memory) 使用.
cordon 标记 node 为 unschedulable
uncordon 标记 node 为 schedulable
drain Drain node in preparation for maintenance
taint 更新一个或者多个 node 上的 taints
# 故障排除和调试命令
Troubleshooting and Debugging Commands:
describe 显示一个指定 resource 或者 group 的 resources 详情
logs 输出容器在 pod 中的日志
attach Attach 到一个运行中的 container
exec 在一个 container 中执行一个命令
port-forward Forward one or more local ports to a pod
proxy 运行一个 proxy 到 Kubernetes API server
cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
auth Inspect authorization
debug Create debugging sessions for troubleshooting workloads and nodes
#高级命令
Advanced Commands:
diff Diff live version against would-be applied version
apply 通过文件名或标准输入流(stdin)对资源进行配置
patch Update field(s) of a resource
replace 通过 filename 或者 stdin替换一个资源
wait Experimental: Wait for a specific condition on one or many resources.
kustomize Build a kustomization target from a directory or URL.
# 设置
Settings Commands:
label 更新在这个资源上的 labels
annotate 更新一个资源的注解
completion Output shell completion code for the specified shell (bash or zsh)
# 其他命令
Other Commands:
api-resources Print the supported API resources on the server
api-versions Print the supported API versions on the server, in the form of "group/version"
config 修改 kubeconfig 文件
plugin Provides utilities for interacting with plugins.
version 输出 client 和 server 的版本信息
Usage:
kubectl [flags] [options]
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
k8s常用命令操作示例
kubectl create deployment nginx111 --image=nginx:latest # 创建应用
kubectl create deployment nginx111 --image=nginx:latest --replicas=6 # 创建应用并指定副本数量,默认副本数量为1
kubectl expose deployment nginx111 --port=80 --type=NodePort # 暴露端口发布应用
kubectl get service # 获取服务状态
资源管理
# 命令式对象管理:
kubectl run nginx111 --image=nginx:latest --port=80 # 运行一个pod
# 通过配置文件创建应用
# 命令式对象配置: 不能重复使用,该命令重复使用会报错
kubectl create -f nginx-pod.yml
# 声明式对象配置: 用于创建和更新资源,命令可以重复使用,支持目录操作--推荐
kubectl apply -f nginx111.yml
命令式对象管理 kubectl命令
kubectl [command] [type] [name] [flag]
command: 指定操作,create,get,delete
type: 指定资源类型,deployment,pod,service
name: 指定资源的名称,名称大小写敏感
flags:指定额外可选的参数
# 示例:
# 查看所有pods,nodes
kubectl get pods --all-namespaces # 查看所有名称空间所有的pod
kubectl get pods -A # -A是--all-namespaces的简写
kubeclt get po -A
kubectl get pods -A -o wide # 长格式显示信息
kubectl get nodes # 获取所有节点信息
# 查看某个pod
kubectl get pod pod_name # 默认查看default名称空间的pod
kubectl get pod pod_name -n namespace_name # 查看指定名称空的pod
kubectl get pod pod_name -o wide -n mamespace_name
kubectl get pods -o wide -n namespace_name
# 查看某个pod,以yml格式展示结果
kubectl get pod pod_name -n namespace_name -o yaml # 只展示结果不导出
kubectl get pod pod_name -n namespace_name -o yaml > project_name.yaml # 将结果已yaml文件导出
资源类型
kubectl --help # 查看帮助
kubectl api-resources # 查看api
kubectl get ns # 获取名称空间
kubectl get cs # 获取集群健康状态
kubectl create namespace devlop # 创建一个名称空间
kubectl create ns devlop # ns为namespace简写
kubectl create deployment nginx112 --image=nginx:latest -n devlop # 在指定名称空间创建deployment
kubectl get pods -n devlop
kubectl describe pod nginx112-9d4fbf6bc-7twh5 -n devlop # 描述某个pod的信息
kubectl run pod --image=nginx:latest -n devlop # 在指定名称空间运行一个pod
kubectl get pods -n devlop # 获取指定名称空间的pods
kubectl get svc -n devlop -o wide # 获取一个名称空间的service
kubectl delete pod pod_name -n namespace # 删除一个pod
kubectl delete pod/pod1_name pod/pod2_name -n namespace # 删除多个pod
kubectl delete deployment deployment_name -n namespace # 删除一个deployment
kubectl delete deploy/deployment_name1 deploy/deployment_name2 # 删除多个deployment
kubectl delete namespace ns_name # 删除一个名称空间
kubectl delete namespace/ns_name1 namespace/ns_name2 # 删除多个名称空间
kubectl delete ns/ns_name1 ns/ns_name2 # 删除多个名称空间
查看k8s对象状态
# 选项
-n namespace 名称空间
-A ALL
kubectl get pod -A -o wide
# 描述资源信息
# 语法格式
kubectl describe 资源类型 资源名名称
# 示例: kubectl describe pod nginx-dev
# 查看资源日志
kubectl logs 显示pod中容器中的运行过程中产生的信息
# 示例:kubectl logs nginx-dev -n dev
# 进入容器内部
kubectl exec -it 容器名称 /bin/bash(shell类型)
# 示例: kubectl exec -it nginx-dev1 -n dev -- /bin/bash # 默认进入pod的第一个容器
# 更多操作查看kubectl exec --help 如下
[root@k8s-master opt]# kubectl exec --help
Execute a command in a container.
Examples:
# Get output from running 'date' command from pod mypod, using the first container by default
kubectl exec mypod -- date
# Get output from running 'date' command in ruby-container from pod mypod
kubectl exec mypod -c ruby-container -- date
# Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod mypod
# and sends stdout/stderr from 'bash' back to the client
kubectl exec mypod -c ruby-container -i -t -- bash -il
# List contents of /usr from the first container of pod mypod and sort by modification time.
# If the command you want to execute in the pod has any flags in common (e.g. -i),
# you must use two dashes (--) to separate your command's flags/arguments.
# Also note, do not surround your command and its flags/arguments with quotes
# unless that is how you would execute it normally (i.e., do ls -t /usr, not "ls -t /usr").
kubectl exec mypod -i -t -- ls -t /usr
# Get output from running 'date' command from the first pod of the deployment mydeployment, using the first container
by default
kubectl exec deploy/mydeployment -- date
# Get output from running 'date' command from the first pod of the service myservice, using the first container by
default
kubectl exec svc/myservice -- date
Usage:
kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]
k8s对象配置
方法一 命令行 kubectl run nginx-dep1 --image=nginx:1.19.8 # 创建pod
方法二 网页 Dashboard 浏览器web界面创建pod
# 部署k8s Dashboard通过网页后台操作pod
方法三 通过 yml文件创建pod
# 通过命令 kubectl apply -f ngx.yml 应用配置文件创建pod
# vim ngx.yml
apiVersion: v1 # api版本
kind: Namespace # 资源类型是ns
metadata: # 元数据
name: devp2021 # 名称空间命名
---
apiVersion: v1
kind: Pod # 资源类型是deployment
metadata: # 元数据
name: nginxdep # 指定名称
namespace: devp2021 # 指定名称空间
spec:
containers:
- name: nginx2021 # 创建容器1
image: nginx:latest
- name: nginx2022 # 创建容器2
image: nginx:latest
- name: nginx2023 # 创建容器3
image: nginx:latest
kubectl create -f ngx.yaml # 只能执行一次,重复执行会报错
[root@localhost yaml]# kubectl apply -f ngx.yaml
namespace/devp2021 created
pod/nginxdep created
kubectl apply -f ngx.yaml # 执行yml文件,可以执行多次,无改变的内容不会生效
[root@localhost yaml]# kubectl apply -f ngx.yml
namespace/devp2021 unchanged
pod/nginxdep unchanged
kubectl delete -f ngx.yaml # 删除资源,文件里有的都删除
[root@localhost yaml]# kubectl delete -f ngx.yaml
namespace "devp2021" deleted
pod "nginxdep" deleted
生成yml模板文件 用来启动容器
# 生成yaml配置文件
kubectl create deployment nginx --image=nginx:latest --dry-run -o yaml>nginx.yaml
# nginx.yaml文件如下,可根据需求修改相关参数
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.8
name: nginx
resources: {}
status: {}
# 应用配置文件创建deployment
kubectl create -f nginx.yaml 或者 kubectl apply -f nginx.yaml
生成yml模板文件,用来发布应用
# 生成配置文件
kubectl expose deployment nginx --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml>nginx_svc.yml
# nginx_svc.yml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
# 应用配置文件发布应用
kubectl expose -f nginx_svc.yml
# kubectl expose -h # 用法如下
# 适用对象 pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs)
Examples:
# Create a service for a replicated nginx, which serves on port 80 and connects to the containers on port 8000.
kubectl expose rc nginx --port=80 --target-port=8000
# Create a service for a replication controller identified by type and name specified in "nginx-controller.yaml",
which serves on port 80 and connects to the containers on port 8000.
kubectl expose -f nginx-controller.yaml --port=80 --target-port=8000
# Create a service for a pod valid-pod, which serves on port 444 with the name "frontend"
kubectl expose pod valid-pod --port=444 --name=frontend
# Create a second service based on the above service, exposing the container port 8443 as port 443 with the name"nginx-https"
kubectl expose service nginx --port=443 --target-port=8443 --name=nginx-https
# Create a service for a replicated streaming application on port 4100 balancing UDP traffic and named 'video-stream'.
kubectl expose rc streamer --port=4100 --protocol=UDP --name=video-stream
# Create a service for a replicated nginx using replica set, which serves on port 80 and connects to the containers onport 8000.
kubectl expose rs nginx --port=80 --target-port=8000
# Create a service for an nginx deployment, which serves on port 80 and connects to the containers on port 8000.
kubectl expose deployment nginx --port=80 --target-port=8000
Usage: # 语法格式如下
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]
k8s容器编排配置文件模板
1. deployment
Deployment为Pod和Replica Set下一代Replication Controller)提供声明式更新,示例如下:
apiVersion: apps/v1 # 1.9.0 之前的版本使用 apps/v1beta2,可通过命令 kubectl api-versions 查看
kind: Deployment #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: nginx-deployment #资源的名字,在同一个namespace中必须唯一
namespace: nginx-prod #命名空间
labels: # 这里是定义Deployment的标签
app: demo-prod
spec:
replicas: 6 #副本数量6
strategy:
rollingUpdate: #由于replicas为6,则整个升级,pod个数在8-10个之间
maxSurge: 1 #滚动升级时会先启动1个pod
maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
selector: #定义标签选择器,部署需要管理的pod(带有该标签的的会被管理)需在pod 模板中定义
matchLabels:
app: demo-prod # 选择关联Deployment标签
template: #这里Pod的定义
metadata:
labels: #给Pod定义一个标签,方便其他服务关联这个Pod
app: web-server
spec: # 模板的规范
containers:
- name: nginx #容器的名字
image: nginx:1.19.8 #容器的镜像地址
command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #启动命令
args: #启动参数
- '-storage.local.retention=$(STORAGE_RETENTION)'
- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
- '-config.file=/etc/prometheus/prometheus.yml'
- '-alertmanager.url=http://alertmanager:9093/alertmanager'
- '-web.external-url=$(EXTERNAL_URL)'
#如果command和args均没有写,那么用Docker默认的配置。
#如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。
#如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。
#如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。
imagePullPolicy: IfNotPresent
# IfNotPresent :默认值,本地有则使用本地镜像,不拉取,如果不存在则拉取
# Always: 总是拉取
# Never: 只使用本地镜像,从不拉取
livenessProbe:
#表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;
httpGet:
path: /health #如果没有心跳检测接口就为/
port: 8080
scheme: HTTP
initialDelaySeconds: 60 ##启动后延时多久开始运行检测
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
readinessProbe:
httpGet:
path: /health #如果没有心跳检测接口就为/
port: 8080
scheme: HTTP
initialDelaySeconds: 30 ##启动后延时多久开始运行检测
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
resources: ##CPU内存限制
requests:
cpu: 2
memory: 2048Mi
limits:
cpu: 2
memory: 2048Mi
env: ##通过环境变量的方式,直接传递pod=自定义Linux OS环境变量
- name: LOCAL_KEY #本地Key
value: value
- name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,
valueFrom:
configMapKeyRef:
name: special-config #configmap中找到name为special-config
key: special.type #找到name为special-config里data下的key
ports:
- name: http
containerPort: 8080 #对service暴露端口
volumeMounts: #挂载volumes中定义的磁盘
- name: log-cache
mount: /tmp/log
- name: sdb #普通用法,该卷跟随容器销毁,挂载一个目录
mountPath: /data/media
- name: nfs-client-root #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfs
mountPath: /mnt/nfs
- name: example-volume-config #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。
mountPath: /etc/config
- name: rbd-pvc #高级用法第2中,挂载PVC(PresistentVolumeClaim)
#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,
volumes: # 定义磁盘给上面volumeMounts挂载
- name: log-cache
emptyDir: {}
- name: sdb #挂载宿主机上面的目录
hostPath:
path: /any/path/it/will/be/replaced
- name: example-volume-config # 供ConfigMap文件内容到指定路径使用
configMap:
name: example-volume-config #ConfigMap中名称
items:
- key: log-script #ConfigMap中的Key
path: path/to/log-script #指定目录下的一个相对路径path/to/log-script
- key: backup-script #ConfigMap中的Key
path: path/to/backup-script #指定目录下的一个相对路径path/to/backup-script
- name: nfs-client-root #供挂载NFS存储类型
nfs:
server: 10.42.0.55 #NFS服务器地址
path: /opt/public #showmount -e 看一下路径
- name: rbd-pvc #挂载PVC磁盘
persistentVolumeClaim:
claimName: rbd-pvc1 #挂载已经申请的pvc磁盘
相关使用
一个典型的用例如下: 使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。 然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。 如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。 扩容Deployment以满足更高的负载。 暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。 根据Deployment 的状态判断上线是否hang住了。 清除旧的不必要的ReplicaSet
创建deployment
# 命令格式 kubectl create deployment名称 [参数]
# --image 指定的pod镜像
# --port 指定端口
# --replicas 指定pod数量
# --namespace 指定名称空间
# 命令创建deployment
kubectl create deployment nginx130 --image=nginx:latest --port=80 --replicas=3 --namespace=default
deployment.apps/nginx130 created
# 命令行删除deployment
[root@localhost yml]# kubectl delete deployment nginx111 -n default # 删除deployment
deployment.apps "nginx111" deleted
# 通过yaml创建deployment
# 生成yaml文件
kubectl create deployment nginx132 --image=nginx:latest --port=80 --replicas=3 -n default --dry-run=client -o yaml > nginx-deployment.yml
# 根据yaml文件创建deployment
kubectl create -f nginx-deployment.yaml --record
#--record 为True 在annotation中记录当前命令创建或者升级了该资源,如查看在每个Deployment revision中执行了哪些命令
kubectl apply -f nginx-deployment.yaml --record
# 删除deployment
kubectl delete -f nginx-deployment.yaml
kubectl get deployments
kubectl get rs #Replica Set的名字总是<Deployment的名字>-<pod template的hash值>
kubectl get pods -n xxxx #查看命名空间中的pod
kubectl get pods -n xxx --show-labels #查看标签
更新deployment
注意: Deployment的rollout当且仅当Deployment的pod template(例如.spec.template)中的label更新或者镜像更改时被触发。其他更新,例如扩容Deployment不会触发rollout.
# 使用命令更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1 -n xxx #更新镜像
# 编辑配置文更新镜像
# 或使用edit命令来编辑Deployment,修改 .spec.template.spec.containers[0].image ,将nginx:1.7.9 改写成 nginx:1.9.1
kubectl edit deployment/nginx-deployment -n xxx
kubectl rollout status deployment/nginx-deployment -n xxx # rollout 状态
回退deployment
# ====版本回退====
kubectl rollout # 版本升级相关功能,支持以下选项
status # 显示当前升级状态
history # 显示升级历史记录
pause # 暂停版本升级过程
resume # 继续已经暂停的版本升级过程
restart # 重启版本升级过程
undo # 回滚到上以及版本[可以使用--to-revision回滚到指定版本]
# kubectl rollout history deployment/nginx-deployment -n xxx #检查升级记录
# kubectl rollout history deployment/nginx-deployment --revision=2 -n xxx #查看version信息
[root@k8s-master1 yml]# kubectl apply -f podtest17.yml --record=true # 添加记录
deployment.apps/pc-deployment created
[root@k8s-master1 yml]# kubectl rollout status deploy pc-deployment -n devlop # 显示升级状态
deployment "pc-deployment" successfully rolled out
[root@k8s-master1 yml]# kubectl rollout history deploy pc-deployment -n devlop # 显示历史记录
deployment.apps/pc-deployment
# 版本号 # 改变原因
REVISION CHANGE-CAUSE
1 kubectl apply --filename=podtest17.yml --record=true
2 kubectl apply --filename=podtest17.yml --record=true
[root@k8s-master1 yml]# kubectl rollout undo deploy pc-deployment --to-revision=1 -n devlop # 回滚到版本1
deployment.apps/pc-deployment rolled back
[root@k8s-master1 yml]# kubectl rollout history deploy pc-deployment -n devlop # 回滚后再次查看版本号
deployment.apps/pc-deployment
REVISION CHANGE-CAUSE
2 kubectl apply --filename=podtest17.yml --record=true
3 kubectl apply --filename=podtest17.yml --record=true
暂停和恢复deployment
# 金丝雀发布
# 更新的同时暂停更新,应用场景:测试新的pod,没问题继续更新,有问题直接回滚
[root@k8s-master1 yml]# kubectl set image deploy pc-deployment nginx2040=nginx:1.8 -n devlop && kubectl rollout pause deploy pc-deployment -n devlop
deployment.apps/pc-deployment paused
[root@k8s-master1 yml]# kubectl get rs -n devlop -o wide # 查看rs
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-deployment-7bb84c497b 7 7 7 13m nginx2040 nginx:1.7 app=nginx-pod,pod-template-hash=7bb84c497b
pc-deployment-8b5965d45 5 5 5 14m nginx2040 nginx:1.8 app=nginx-pod,pod-template-hash=8b5965d45
[root@k8s-master1 yml]# kubectl rollout status deploy pc-deployment -n devlop # 查看更新状态
Waiting for deployment "pc-deployment" rollout to finish: 5 out of 9 new replicas have been updated...
[root@k8s-master1 yml]# kubectl set image deploy pc-deployment nginx2040=nginx:1.7 -n devlop && kubectl rollout resume deploy pc-deployment -n devlop # 继续暂停的更新
deployment.apps/pc-deployment image updated
deployment.apps/pc-deployment resumed
2 namespace
# Namespace
# 命令行操作namespace
kubectl get ns # 获取名称空间信息
kubectl get ns/default # 获取指定名称空间信息
kubectl describe ns/default # 描述名称空间信息
kubectl create ns devlop # 创建名称空间
kubectl delete ns devlop # 删除名称空间
# nsc.yml # 使用文件创建和删除名称空间
apiVersion: v1 # api版本
kind: Namespace # 资源类型是ns
metadata: # 元数据
name: devp2022 # 名称空间命名
# 创建名称空间
kubectl create -f nsc.yml / kubectl apply -f nsc.yml
# 删除名称空间
kubectl delete -f nsc.yml
3 pod
# 命令行操作Pod
kubectl get pods -n kube-system # 获取pod信息
# 命令格式: kubectl run (pod控制器名称)[参数]
# --image 指定pod的镜像
# --port 指定端口
# --namespace 指定名称空间
# 通过命令运行pod
kubectl run nginx2023 --image=nginx:latest --port=80 --namespace devlop
kubectl run nginx2023 --image=nginx:latest --port=80 -n devlop
# 使用yml文件创建pod
-------------------------
apiVersion: v1
kind: Pod
metadata:
name: nginxapp # 单独运行pod时必须保持name在名称空间中唯一
namespace: devlop
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent # 拉取镜像策略
name: nginx2030
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
-------------------------
# 创建pod
[root@localhost yml]# kubectl create -f podc.yml
pod/nginxapp created
# 删除pod
[root@localhost yml]# kubectl delete -f podc.yml
pod "nginxapp" deleted
4 label
[root@localhost yml]# kubectl get pods -n default --show-labels # 获取标签信息
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h23m app=nginx111,pod-template-hash=5774488586
# 打标签,如果标签不存在则新增标签
[root@localhost yml]# kubectl label pod nginx111-5774488586-mv68r -n default version=1.0
pod/nginx111-5774488586-mv68r labeled
# 再次获取标签信息
[root@localhost yml]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h26m app=nginx111,pod-template-hash=5774488586,version=1.0
# 更新标签,需要要是用--overwrite关键字
[root@localhost yml]# kubectl label pod nginx111-5774488586-mv68r -n default version=2.0 --overwrite
pod/nginx111-5774488586-mv68r labeled
# 根据版本标签进行筛选1
[root@localhost yml]# kubectl get pods -l "version=2.0" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h32m app=nginx111,version=2.0
# 根据版本标签进行筛选2
[root@localhost yml]# kubectl get pods -l "version!=2.0" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx2021 1/1 Running 0 2m35s run=nginx2021
# 删除version标签
[root@localhost yml]# kubectl label pod nginx202 -n default version-
pod/nginx2021 labeled
# 使用yml文件创建带标签的pod
# podc2.yml
-----------------------------
apiVersion: v1
kind: Pod
metadata:
# 注意labels下的键值对的值必须加引号
labels:
version: "1.8"
env: "test"
name: nginx333
namespace: default
spec:
containers:
- image: nginx:latest
name: nginx333
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
------------------------------
# 创建带标签的pod
[root@localhost yml]# kubectl apply -f podc.yml
pod/nginx333 created
# 查询pod并显示标签
[root@localhost yml]# kubectl get pods -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h46m pod-template-hash=5774488586,version=2.0
nginx111-5774488586-vclkq 1/1 Running 0 11m app=nginx111,pod-template-hash=5774488586
nginx2021 1/1 Running 0 15m run=nginx2021
nginx333 1/1 Running 0 54s env=test,version=1.8
# 根据标签筛选
[root@localhost yml]# kubectl get pods -l "version=1.8" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx333 1/1 Running 0 2m2s env=test,version=1.8
# 根据标签筛选
[root@localhost yml]# kubectl get pods -l "env=test" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx333 1/1 Running 0 2m29s env=test,version=1.8
# 根据标签筛选
[root@localhost yml]# kubectl get pods -l "env!=test" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h48m pod-template-hash=5774488586,version=2.0
nginx111-5774488586-vclkq 1/1 Running 0 13m app=nginx111,pod-template-hash=5774488586
nginx2021 1/1 Running 0 17m run=nginx2021
# 根据标签类型筛选
[root@localhost yml]# kubectl get pods -l "env" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx333 1/1 Running 0 7m23s env=test,version=1.8
# 根据标签类型筛选
[root@localhost yml]# kubectl get pods -l "version" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h53m pod-template-hash=5774488586,version=2.0
nginx333 1/1 Running 0 7m28s env=test,version=1.8
# 根据集合关系筛选
[root@localhost yml]# kubectl get pods -l "version in (1.8,2.0)" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h57m pod-template-hash=5774488586,version=2.0
nginx333 1/1 Running 0 11m env=test,version=1.8
# 根据集合关系筛选
[root@localhost yml]# kubectl get pods -l "version notin (1.8,2.0)" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-vclkq 1/1 Running 0 22m app=nginx111,pod-template-hash=5774488586
nginx2021 1/1 Running 0 26m run=nginx2021
【====扩展====】
# 显示pod中标签为app的pod
$ kubectl get pods -l "app" --show-labels
# 另外一种绝对性查询,key=value
等值关系: =、==、!=
$ kubectl get pods -l app[=|==|!=]myapp --show-labels
# 集合关系: KEY in (VALUE1,VALUE2...)
KEY not in (VALUE1,VALUE2...)
KEY
!KEY
$ kubectl get pods -l "release in (canary,beta,alpha)"
$ kubectl get pods -l "release notin (canary,beta,alpha)"
# ========================给节点增加标签========================
[root@localhost yml]# kubectl label node k8s-node1 disktype=ssd
node/k8s-node1 labeled
[root@localhost yml]# kubectl get nodes -l "disktype"
NAME STATUS ROLES AGE VERSION
k8s-node1 Ready <none> 9h v1.20.2
# 使用yml通过node标签选择器运行容器到某个节点
# vim pod-demo.yml
--------------------------
apiVersion: v1 # 顶格写
kind: Pod # 顶格写
metadata: # 顶格写
name: nginx-demo
namespace: default
# 注意labels下的键值对的值必须加引号
labels:
app: "myapp"
tier: "frontend"
spec: # 顶格写
containers:
- name: nginx115
image: nginx: latest
imagePullPolicy: IfNotPresent
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
nodeSelector:
# 这里的键值必须加引号
disktype: "ssd"
# 这里定义了标签,那么Pod只会运行到k8s-node1节点上,因为只有node1节点有"disktype=ssd"标签
[root@localhost yml]# kubectl apply -f labeltest.yml
pod/nginx-demo created
5 service
# Service服务
# 命令行暴露service,ClusterIP只能集群内部访问
[root@localhost yml]# kubectl expose deployment nginx132 --name=svc-nginx132 --type=ClusterIP --port=80 --target-port=80 -n default
service/svc-nginx132 exposed
[root@localhost yml]# kubectl get svc -n default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10h
svc-nginx132 ClusterIP 10.109.72.203 <none> 80/TCP 11s
# 命令行暴露service,NodePort集群外部可访问
[root@localhost yml]# kubectl expose deployment nginx132 --name=svc133 --type=NodePort --port=80 --target-port=80 -n default
service/svc133 exposed
# 命令行删除service
[root@localhost yml]# kubectl delete svc nginx111 -n default
service "nginx111" deleted
---------------------------
# 通过yml文件创建ClusterIP
# clusterip.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: "nginx132"
name: svc-nginx132
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx132 # Service 的selector 指定标签 app:nginx 来进行对Pod进行关联 ;(这里的app:nginx就是上面Deployment配置里labels定义的标签 )
type: ClusterIP
# 创建Cluster
[root@localhost yml]# kubectl apply -f Clusteript.yml
service/svc-nginx134 created
# 删除Cluster
[root@localhost yml]# kubectl delete -f Clusteript.yml
service "svc-nginx134" deleted
---------------------------
# 通过yml创建NodePort
# nodeport.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: "nginx132"
name: svc133
spec:
ports:
- port: 80 # 需要暴露的集群端口(service暴露的)
targetPort: 80 # 容器的端口(后端容器提供服务的端口)
protocol: TCP
selector:
app: nginx132
type: NodePort
---------------------------
# 创建service
[root@localhost yml]# kubectl apply -f svct.yml
service/svc135 created
# 删除service
[root@localhost yml]# kubectl delete -f svct.yml
service "svc135" deleted