一.namespace
命名空间用来做资源隔离,常运用于环境的区分,如dev,test,prod
创建命名空间
kubectl create ns hello
删除命名空间
kubectl delete ns hello
查询所有命名空间:kubectl get namespace
还有另外一种方式是通过yaml来创建
ymal文件内容:
apiVersion: v1
kind: Namespace
metadata:
name: hello
通过kubectl apply -f xxxx.yaml 运行ymal文件来创建命名空间
二.Pod
pod是k8s运行的最小单元,里面可以包含多个容器。
1.通过命令行创建:
创建一个nginx镜像
kubectl run mynginx --image=nginx
查看运行日志
kubectl logs pod mynginx
# 删除pod
kubectl delete pod mynginx
查看nginx启动描述
kubectl describe pod mynginx
查看默认命名空间下pod的ip
kubectl get pod -owide
2.通过命令创建
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
# namespace: default
spec:
containers:
- image: nginx
name: mynginx
三.Deployment
控制pod,使pod拥有自愈与故障转移,多副本,扩缩容,滚动更新,版本回退的能力。
1.自愈与故障转移
#创建镜像的deployment
kubectl create deployment mynginx --image=nginx
#获取deployment
kubectl get deployment
#删除deployment
kubectl delete deployment mynginx
它与pod的最大的不同是当我们删除pod的时候k8s还会再次启动一个pod,这就是deployment的自愈能力。
2.多副本
#创建3个副本
kubectl create deployment mynginx --image=nginx --replicas=3
3.扩缩容
kubectl scale --replicas=5 deployment/mynginx
4.滚动更新
滚动更新相当于就是先启动新版本,当新版本启动成功后再停止旧版本。
更新前:
kubectl set image deployment/mynginx nginx=nginx:1.16.1 --record
更新后:
5. 版本回退
#历史记录
kubectl rollout history deployment/mynginx
#查看某个历史详情
kubectl rollout history deployment/mynginx --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/mynginx
#回滚(回到指定版本)
kubectl rollout undo deployment/mynginx --to-revision=2
四.Service
一组相同的pod暴露统一的端口和ip,供其它应用访问。
1.ClusterIp
这种服务只能在集群内访问
流程图如下:
# 等同于没有--type的
kubectl expose deployment mynginx --port=8000 --target-port=80 --type=ClusterIP
# 删除service
kubectl delete service mynginx
运行效果:
2.NodePort
使节点端口暴露在公网上能被外部访问,节点开放的端口范围在 30000-32767 之间
kubectl expose deployment mynginx --port=8000 --target-port=80 --type=NodePort
运行效果:
可以看到暴露到公网的端口号为32602,在浏览器中输入公网ip+端口即可访问到nginx
五.Ingress
可以理解为网关,所有请求都先请求ingress,然后再路由到service,以nginx实现。
#下载yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
vi deploy.yaml
#将containers:- name: controller的image的值改为如下值:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0
查看创建结果:
上面暴露了两个端口32678为http端口,30065为https端口
六.抽象存储
抽象存储,可以理解为k8s为pod容器中的配置或持久化数据所做的一层共享存储,它相当于是把容器内部的配置或者数据文件映射到外部的虚拟机上,这样当一个节点挂了,k8s的故障转移特性,会在另外一个节点上启动pod,这时候这个pod的配置就会从这个共享的文件目录中去加载启动。
下面会列出nfs(网络文件系统)的安装:
1.安装nfs
#所有node安装
yum install -y nfs-utils
2.主节点
#暴露目录
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
查看暴露目录:
3.从节点
#让从节点同步主节点的目录
showmount -e 172.31.0.4
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径
mkdir -p /nfs/data
#挂载目录
mount -t nfs 172.31.0.4:/nfs/data /nfs/data
主节点执行:
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt
从节点查看:
4.数据存储挂载
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 # 拉取一个nginx镜像
name: nginx
volumeMounts: # 定义要挂载的目录
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html #这个对应上面要挂载的目录的名称
nfs: #使用nfs方式
server: 172.31.0.4 #nfs主节点的ip地址
path: /nfs/data/nginx-pv #挂载到主机的这个目录下
下面可以创建测试文件
直接进入容器查看:
但是以上方式并不能设置挂载的空间大小,下面介绍另外一种方式pv和pvc
pv:持久卷(persistent volume),将应用需要持久化的数据保存到指定位置
pvc:持久卷申明(persistent volume claim),申明需要使用持久卷的大小
1.创建静态pv池
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
2.创建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
3.创建pvc与pv绑定
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
4.创建pvc与pod绑定
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