k8s 常用命令

资源类型资源简称
nodeno
namespacesns
deploymentdeploy
ReplicaSetrs
podpo
servicesvc
ingressing
DaemonSetsds
StatefulSetssts
ConfigMapcm
PersistentVolumepv
PersistentVolumeClaimpvc
HorizontalPodAutoscalerhpa
ComponentStatuscs

创建资源

# 创建一个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