k8s 常用命令
资源类型 | 资源简称 |
---|---|
node | no |
namespaces | ns |
deployment | deploy |
ReplicaSet | rs |
pod | po |
service | svc |
ingress | ing |
DaemonSets | ds |
StatefulSets | sts |
ConfigMap | cm |
PersistentVolume | pv |
PersistentVolumeClaim | pvc |
HorizontalPodAutoscaler | hpa |
ComponentStatus | cs |
创建资源
# 创建一个deployment
cat >> nginx-deploy-test.yaml < EOF
apiVersion: apps/v1 #版本信息
kind: Deployment #资源信息
metadata: #元数据
name: nginx-deploy #资源名称
namespace: default #属于哪个命名空间下
spec:
replicas: 2 #一共有两个副本资源
selector:
matchLabels:
app: nginx
template: #pod创建模板
metadata:
labels:
app: nginx
spec:
containers: #容器名称下边的容器可以有多个
- image: nginx #镜像名称
imagePullPolicy: IfNotPresent #镜像拉取策略
name: nginx-test #容器名称
restartPolicy: Always #重启策略
EOF
部署上边的yaml资源信息
kubectl apply -f nginx-deploy-test.yaml
也可以这样使用命令行方式,直接创建
#创建pod
kubectl create deploy nginx --image=nginx
查看资源信息
1.1 查看k8s版本信息
kubeadm version
kubelet --version
kubectl version
1.2 查看pod信息
kubectl get po -o wide
1.3 查看deployment信息
kubectl get deploy
1.4 查看rs信息
kubectl get rs -o wide
1.5 外部端口暴露 查看 service信息
#暴露service端口
kubectl expose deploy nginx-deploy --type=NodePort --port=80 --target-port=8000 --name=nginx-deploy
#查看service
kubectl get svc
1.6 查看 namespace 命名空间信息
kubectl get ns
1.7 查看资源yaml信息
举例:kubectl get 资源名称 -o yaml -n 命名空间
如果 命名空间不填 默认为 default
kubectl get deploy nginx-deploy -o yaml -n default
1.8 进入k8s容器
#进入k8s运行的容器
kubectl exec demo-deploy-64575b5d97-txb4w -it -- /bin/bash
#退出容器
exit
1.9 查看k8s集群健康状况
kubectl get cs
端口映射
##create 方式基于端口做映射,expose 方式基于服务做映射
##创建无头服务
kubectl create svc clusterip nacos-headless --clusterip=None --tcp=8848:8848
##创建NodePort服务
kubectl create svc nodeport nacos-nodeport --tcp=8848:8848 --node-port=30848
##端口暴露NodePort
kubectl expose deploy nginx-deploy --type=NodePort --port=80 --target-port=8000
##创建ingress
##kubectl create ingress 名称 --rule=访问路径 / 匹配方式=svc的名称:端口(集群内部端口)
kubectl create ingress nginx-ing --rule=www.digua.com/*=nginx-deploy:80
ingress代理
##创建ing
kubectl create ing nginx-ing --rule="test.digua.com/*=nginx-deploy:80"
修改本地win的hosts文件,增加域名映射
192.168.33.160 test.digua.com
查看日志 查看报错
查看日志
kubectl logs pod名称 -n 命名空间
查看资源信息
kubectl describe deploy deploy名称 -n 命名空间
标签查看,标签制作
标签查看
kubectl get 资源类型 --show-labels
kubectl get no --show-labels
标签制作
kubectl label 资源类型 资源名称 标签key=标签value
kubectl label no slave cpu=8cup32g
修改资源信息
举例: kubectl edit 资源类型 资源名称 -n 命名空间
如果 命名空间不填 默认为 default
kubectl edit pod nginx-deploy-86597ffd87-pz5bn -n default
kubectl edit deploy nginx-deploy
kubectl edit rs nginx-deploy-86597ffd87
修改上述文章中的 nginx-deploy-test.yaml 信息后
#运行apply 也是更新操作
kubectl apply -f nginx-deploy-test.yaml
删除资源
举例: kubectl delete 资源类型 资源名称 -n 命名空间
如果 命名空间不填 默认为 default
1.1 删除单个pod,如果pod是由deploy等创建的是无法完全删除,因为pod停止后,scheduler会重新扫描后再创建
kubectl delete po nginx-deploy-86597ffd87-djkws
#删除默认命名空间下所有的pod,下边的删除也是同样的,只是改一下资源类型
kubectl delete po --all
1.2 删除rs,删除rs后 对应下边的pod也会删除,如果rs是通过deploy创建,会自动重新创建并顺便创建下边的pod
kubectl delete rs nginx-deploy-86597ffd87
1.3 删除deployment,删除deploy后下变得rs和pod都会被删除
kubectl delete deploy nginx-deploy
1.4 删除命名空间,删除命名空间后下边所有的pod、deploy、svc、rs都会删除
kubectl delete ns default
1.5 强制删除pod
kubectl delete po nginx-deploy-86597ffd87-djkws --force --grace-period=0
查看资源使用(cpu、内存使用)
##kubectl top (no/po)
kubectl top no
滚动发布与回滚
滚动发布 滚动发布会保留deploy,会重新制作一个rs取代之前的rs
##kubectl set image 资源类型/资源名 容器名称=镜像
kubectl set image deploy/test-deploy test=192.168.34.8:85/public/test:2
版本回滚
##查看历史版本信息 kubectl rollout history 资源类型/资源名
kubectl rollout history deploy/test-deploy
##根据历史版本信息,指定版本进行回滚 kubectl rollout undo 资源类型/资源名 --to-revision=版本
kubectl rollout undo deploy/test-deploy --to-revision=4
请注意,正常发版时候查看历史版本其中的CHANGE-CAUSE是none,这个主要是由资源里边的标签 kubernetes.io: “版本信息” 决定的
scale (pod扩容)、autoscale(自动扩容)
kubectl scale --replicas=资源数量 资源类型/资源名称
kubectl scale --replicas=3 deploy/nginx-deploy
扩容之前
扩容之后
##kubectl autoscale 资源类型 资源名称 --min=最小pod数量 --max=最大pod数量 --cpu-percent=CPU达到40%时候
kubectl autoscale deploy nginx-deploy --min=1 --max=3 --cpu-percent=40
##查看自动扩容信息
kubectl get hpa
secret (k8s 拉取harbor镜像配置)
kubectl create secret docker-registry 名称 --docker-server=harbor的ip+端口 --docker-username=用户名 --docker-password=密码 --docker-email=邮箱(非必填)
kubectl create secret docker-registry 34.8harborregistry --docker-server=192.168.34.8:85 --docker-username=admin --docker-password=Harbor@2022 --docker-email=123@qq.com
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: 192.168.34.8:85/hhd/demo:latest
imagePullPolicy: Always
name: demo
restartPolicy: Always
imagePullSecrets: #拉取位置
- name: 34.8harborregistry
configMap (资源管理)
#创建脚本 entrypoint.sh
#!/bin/bash
exec java ${java_opts} -jar demo.jar "$@"
#创建 Dockerfile
FROM java:9
ENV java_opts=""
WORKDIR /home
COPY entrypoint.sh entrypoint.sh
COPY demo.jar demo.jar
RUN chmod 755 entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
docker build -f Dockerfile -t test:1 .
docker login -u admin -p Admin123 192.168.34.8:85
docker tag test:1 192.168.34.8:85/project/test:1
docker push 192.168.34.8:85/project/test:1
cat >> /home/k8s/javaopt < EOF
-Xmx200m -Xmn200m -Xms200m -XX:+UseG1GC
EOF
kubectl create cm javaopt --from-file=javaenv=/home/k8s/javaenv
创建资源
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: 192.168.34.8:85/project/test:1
imagePullPolicy: Always
name: test
env:
- name: java_opts
valueFrom:
configMapKeyRef:
name: javaopt
key: javaenv
restartPolicy: Always
imagePullSecrets:
- name: 34.8harborregistry
查看pod情况
PV PVC挂载
192.168.34.7主节点
192.168.34.8从节点
配置nfs(所有节点都需要配置)
##安装nfs
yum install nfs-utils -y
##启动nfs
systemctl restart nfs && systemctl enable nfs
在文件挂载节点增加配置,这里我是在主节点进行的
##创建目录
mkdir -p /home/nfs
chmod 777 /home/nfs
##修改配置
cat >> /etc/exports < EOF
/home/nfs *(rw,no_root_squash,no_all_squash,sync)
/home/nfs 192.168.34.0/24(rw,no_root_squash,no_all_squash,sync)
EOF
##执行命令生效配置
exportfs -rv
检验nfs挂载,在别的节点测试挂载
##测试ip挂载是否正常
showmount -e 192.168.34.8
mkdir /home/test
chmod 777 /home/test
mount -t nfs 192.168.34.7:/home/nfs /home/test
##查看挂载
mount |grep 192.168.34.7
验证nfs挂载
##从节点输出到aa.txt文件
date >> /home/test/aa.txt
##主节点查看文件
cat /home/nfs/aa.txt
配置PV
vim test-pv.yml
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/bound-by-controller: "yes"
finalizers:
- kubernetes.io/pv-protection
name: test-pv
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 2Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: test-pvc
namespace: default
nfs:
path: /home/nfs
server: 192.168.34.7
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem
status:
phase: Bound
kind: List
metadata:
resourceVersion: ""
selfLink: ""
kubectl create-f test-pv.yml
配置PVC
vim test-pvc.yml
apiVersion: v1
items:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
pv.kubernetes.io/bind-completed: "yes"
finalizers:
- kubernetes.io/pvc-protection
name: test-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
storageClassName: ""
volumeMode: Filesystem
volumeName: test-pv
status:
accessModes:
- ReadWriteMany
capacity:
storage: 2Gi
phase: Bound
kind: List
metadata:
resourceVersion: ""
selfLink: ""
kubectl create-f test-pvc.yml
查看配置的pv和pvc
kubectl get pv
kubectl get pvc
污点管理
污点类型 | 内容 |
---|---|
NoSchedule | 在创建新的pod时候不会调度到该节点 |
PreferNoSchedule | 将尽量避免调度到该节点 |
NoExecute | 不会在该节点创建pod,如果有pod就会剔除 |
增加污点
##kubectl taint no 节点 key:污点类型
kubectl taint no master key:NoSchedule
剔除污点
kubectl taint no master key:NoSchedule-
deploy yaml文件解析
apiVersion: extensions/v1beta1 #版本
kind: Deployment #资源类型
metadata:
labels:
workload.user.cattle.io/workloadselector: deployment-cloud-prd-server #标签,k8s对于资源控制主要是根据labels和selector进行的
name: server #资源名称
namespace: cloud-prd #所属命名空间
spec:
progressDeadlineSeconds: 600
replicas: 1 #一个pod
revisionHistoryLimit: 10
selector:
matchLabels:
workload.user.cattle.io/workloadselector: deployment-cloud-prd-server
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate #发布策略
template: #创建模板
metadata:
labels:
workload.user.cattle.io/workloadselector: deployment-cloud-prd-server
spec:
affinity:
nodeAffinity:
#节点亲和度 nodeAffinity
#容器亲和度 podAntiAffinity
requiredDuringSchedulingIgnoredDuringExecution:
#硬策略(必须调度符合的规则上边) requiredDuringSchedulingIgnoredDuringExecution
#软策略(最好可以调度符合的规则上边) preferredDuringSchedulingRequiredDuringExecution
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 172.26.0.46
containers:
- env:
- name: DB_HOST #对应需要的环境变量
valueFrom: #configmap配置
configMapKeyRef:
key: DB_PORT
name: mysql-env-cm
optional: false
- name: JAVA_OPTS
value: -Xmx3550M -Xms3550M -Xmn2G -Xss256k
image: 192.1.1.1/project/server:stable #镜像
imagePullPolicy: Always #镜像拉取策略
name: server #容器名称
ports:
- containerPort: 8513 #暴露端口
name: 8513tcp02
protocol: TCP
resources:
limits:
memory: 4Gi
stdin: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
tty: true
volumeMounts:
- mountPath: /log #容器内部挂载位置
name: vol1
dnsPolicy: ClusterFirst
restartPolicy: Always #重启策略
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: vol1
persistentVolumeClaim: #挂载的pvc
claimName: log-pvc