k8s学习笔记

常用命令

获取所有节点

kubectl get nodes

获取所有的pod

kubectl get pods -A

每隔1秒钟执行kubectl get pod

watch -n -1 kubectl get pod

监控所有的应用

kubectl get pods -A -w

创建节点新令牌

kubeadm token create --print-join-command master

创建命名空间

kubectl create ns hello

删除命令空间

kubectl delete ns hello

安装pod

kubectl apply -f *.yaml

卸载pod

kubectl delete -f *.yaml

创建pod

kubectl run mynginx --image=nginx 创建一个pod,默认在defaukt中

查看pod 描述信息

kubectl describe pod mynginx

删除pod

kubectl delete pod **

查看pod运行日志

kubectl logs ***

查看所有pod的ip

kubectl get pods -owide

进入pod

kubectl exec -it *** --bin/bash

部署deployment

kubectl create deployment tomcat--image tomcat 部署一个depolyment,如果宕机会自动重启

获取所有的部署

kubectl get deployment

删除部署

kubectl delete deploy tomcat

创建多副本的部署

kubectl create deployment tomcat --image tomcat --replicas=3

应用的扩缩容

kubectl scale deployment/部署名称 --replicas=3

修改部署

kubectl edit deploy 部署名称

滚动更新&版本回退

kubectl set image deploy/my-dev nginx=nginx:16.0.1--record 滚动更新,替换镜像

查看版本更新记录

kubectl rollout history deployment/my-dev 查看版本更新记录

版本回退

kubectl rollout undo deploy/my-dev --to -revision=1

k8s有五种控制器:deployment,statefulSet,daemonset,job,CronJob
deployment:无状态应用部署,比如微服务,提供多副本等功能
用途:用于管理无状态的部署和更新
特点:
支持声明式的更新策略,例如滚动更新,重新创建等
支持自动管理Pod的副本数量,确保满足希望的副本数
适合部署可以随时替换且不依赖于特定顺序和唯一性的应用,如web服务
StatefulSet:有状态应用部署,比如redis,mysql,提供稳定的存储,网络,分部署存储系统等功能
用途:适用于管理有状态的应用,例如数据库,分布式存储系统
特点:
为每一个pod分配唯一的稳定标识和持久化存储
保证Pod的启动和暂停顺序
当pod发生故障或者删除时,其替换的Pod会保留相同的名称和标识符
DaemonSet:守护型应用部署,比如日志收集组件,在每一个机器运行一份
用途:确保在集群的每一个节点上运行一个Pod的副本
特点:
常用于部署监控代理,日志收集等需要在每一个节点上运行的服务
当新节点加入集群时,会自动在新节点上面创建Pod的副本
Job
用途:用于执行一次性任务,任务完成后Pod就会结束
特点:
确保任务按照指定的并行度和完成次数执行
适用于批量任务,数据处理等一次性工作
CronJob:定时任务,比如垃圾清理组件,可以在指定时间运行
用途:基于时间调度来运行job
特点:
按照Cron表达式定义的时间计划周期性的执行任务
常用于定时备份,定时数据处理等周期性的一次性任务

service

pod的服务发现与负载均衡

ClusterIp:集群内部的访问
创建一个service ,暴露8000端口,对应pod的80端口,集群内部可访问
kubectl expose deployment my-dep --port=8000 --target-port=80 相当于kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIp也可以采用域名访问:service名称.所在名称空间.svc
NodePort:集群外部的访问
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort

Ingress

域名访问

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: ingress-host-bar
spec:
  ingressClassName: nginx
  rules:
  - host: "hello.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: hello-server
            port:
              number: 8000
  - host: "demo.atguigu.com"
    http:
      paths:
      - pathType: Prefix
        path: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
        backend:
          service:
            name: nginx-demo  ## java,比如使用路径重写,去掉前缀nginx
            port:
              number: 8000

存储抽象

#所有机器安装
`yum install -y nfs-utils`

nfs主节点

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
#配置生效
exportfs -r
# 查看
exportfs

从节点

# 查看远程服务器那些目录可以挂载
showmount -e 172.31.0.4
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data

mount -t nfs 172.31.0.4:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt

原生方式挂载

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 172.31.0.4
            path: /nfs/data/nginx-pv

pv与pvc
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

创建pv池

#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

创建pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 172.31.0.4
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 172.31.0.4

PVC创建与绑定
创建

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

创建Pod绑定PVC

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc

ConfigMap

redis示例
1、把之前的配置文件创建为配置集

# 创建配置,redis保存到k8s的etcd;
kubectl create cm redis-conf --from-file=redis.conf


apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    command:
      - redis-server
      - "/redis-master/redis.conf"  #指的是redis容器内部的位置
    ports:
    - containerPort: 6379
    volumeMounts:
    - mountPath: /data
      name: data
    - mountPath: /redis-master
      name: config
  volumes:
    - name: data
      emptyDir: {}
    - name: config
      configMap:
        name: redis-conf
        items:
        - key: redis.conf
          path: redis.conf

Secret

Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活

##命令格式
kubectl create secret docker-registry regcred \
  --docker-server=<你的镜像仓库服务器> \
  --docker-username=<你的用户名> \
  --docker-password=<你的密码> \
  --docker-email=<你的邮箱地址>
apiVersion: v1
kind: Pod
metadata:
  name: private-nginx
spec:
  containers:
  - name: private-nginx
    image: leifengyang/guignginx:v1.0
  imagePullSecrets:
  - name: leifengyang-docker #指定下载镜像使用的Secret 
posted @ 2024-06-24 21:56  9912  阅读(1)  评论(0编辑  收藏  举报