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