一、资源创建方式
- 使用命令行
- 使用yum
二、NameSpace
名称空间,用来对集群资源进行隔离划分。默认只隔离资源,不隔离网络。例如创建开发、测试、生产等命令空间,可以保证一个应用引用配置只能读取自己名称空间内的资源,但是可以访问不同名称空间的网络。所有资源在没指定的时候都是默认在default下。
可以使用命令行操作名称空间,也可以使用配置文件或者dashboard可视化平台操作。
- 命令行方式:
#查看名称空间
kubectl get ns
#创建名称空间
kubectl create ns ***
#删除名称空间
kubectl delete ns ***
- 配置文件方式:
#创建配置文件
vi create_namespace.yaml
#复制内容
apiVersion: v1
kind: Namespace
metadata:
name: hello #名称空间名称
#应用文件
kubectl apply -f create_namespace.yaml
#删除
kubectl delete -f create_namespace.yaml
三、Pod
docker中运行的应用称为容器,在k8s中称为Pod。Pod是k8s中应用的最小单位,运行中的一组容器,虽然是封装了容器,但仍然是k8s中最小的基本单位。
- 命令行方式使用:
#根据镜像创建pod并运行
kubectl run mynginx --image=nginx
#查看pod状态
kubectl describe pod mynginx
#查看default名称空间的Pod
kubectl get pod
#删除
kubectl delete pod ***
#删除指定命令空间的pod
kubectl delete pod -n 命名空间
- 配置文件方式:
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
# namespace: default
spec:
containers:
- image: nginx
name: mynginx
- 可视化方式
- 每个pod都有一个ip,可以根据ip+端口访问容器
#获取ip
kubectl get pod -owide
#使用Pod的ip+pod里面运行容器的端口
curl ip:端口
#进入容器
kubectl exec -it *** -- /bin/bash
1、一个pod内运行多个容器
- 创建配置文件
#创建配置文件
vi testmorecontains.yaml
#复制文件内容
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
- image: nginx
name: nginx
- image: tomcat:8.5.68
name: tomcat
#应用配置文件
kubectl apply -f testmorecontains.yaml
容器启动成功后,k8s会给该pod分配一个ip地址,nginx默认端口为80,Tomcat默认端口为8080,所以通过curl访问可以访问到。
#获取pod的ip
kubectl get pod -owide
#访问nginx
curl 10.244.1.5:80
#访问Tomcat[root@k8s-master ~]# curl 10.244.1.5:8080
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/8.5.68</h3></body></html>
如果想让nginx访问tomcat,因为他俩本身已经在同一个pod内,所以不需要使用ip,只用127.0.0.0ip加端口号就可以访问。
同一个pod共享内存和同一个网络空间,所以同一个pod内端口不能重复!
四、Deployment
控制pod,使pod有多个副本,自愈、扩缩容能力。
1、自愈&故障修复
- 自愈能力:运行过程中pod突然挂机,k8s会尝试重启该pod
#如果一个pod被删除,k8s会重新生成一个pod
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.
#新建一个普通pod
[root@k8s-master ~]# kubectl run mynginx --image=nginx
pod/mynginx created
#使用deployment创建一个pod
[root@k8s-master ~]# kubectl create deployment mytomcat --image=tomcat:8.5.68
deployment.apps/mytomcat created
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mynginx 1/1 Running 0 29s
mytomcat-6f5f895f4f-p9khg 1/1 Running 0 4s
#将普通pod手动删除
[root@k8s-master ~]# kubectl delete pod mynginx
pod "mynginx" deleted
#该pod已删除
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mytomcat-6f5f895f4f-p9khg 1/1 Running 0 45s
#将deployment创建的pod删除
[root@k8s-master ~]# kubectl delete pod mytomcat-6f5f895f4f-p9khg
pod "mytomcat-6f5f895f4f-p9khg" deleted
#发现又重新生成一个新的pod
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mytomcat-6f5f895f4f-qv4p6 1/1 Running 0 10s
#如果一个pod被停掉,k8s会将它重启
- 故障修复能力:
如果一个pod所在的机器突然挂机或者无法提供服务,这时k8s感知会将该pod转移到其他机器上运行。 - 如果一个pod挂掉或者删除,k8s每次都会分配不同ip给它们
#查看此pod的ip
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mytomcat-6f5f895f4f-qv4p6 1/1 Running 0 18s 10.244.1.8 k8s-node1 <none> <none>
#删除此pod
[root@k8s-master ~]# kubectl delete pod mytomcat-6f5f895f4f-qv4p6
pod "mytomcat-6f5f895f4f-qv4p6" deleted
#查看新生成的pod的ip
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mytomcat-6f5f895f4f-77w4f 1/1 Running 0 6s 10.244.1.9 k8s-node1 <none> <none>
- 真正删除deployment创建的pod
#获取deployment创建的所有pod
[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
mytomcat 1/1 1 1 8m21s
#真正删除该pod
[root@k8s-master ~]# kubectl delete deploy mytomcat
deployment.apps "mytomcat" deleted
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.
2、多副本
- 使用命令行方式创建
#使用deploy创建指定的个数的pod副本 --replicas=创建个数
[root@k8s-master ~]# kubectl create deploy my-deploy-nginx --image=nginx --replicas=3
deployment.apps/my-deploy-nginx created
#查看所有的deploy创建的pod
[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
my-deploy-nginx 2/3 3 2 11s
#获取pod,此时已经创建了三个不同ip的nginx
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-deploy-nginx-67cfd466f7-9g5bf 1/1 Running 0 2m58s 10.244.1.11 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-svkkp 1/1 Running 0 2m58s 10.244.1.12 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-z9czl 1/1 Running 0 2m58s 10.244.1.10 k8s-node1 <none> <none>
- 使用可视化创建指定个数的pod
- 使用配置文件方式创建
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-dep
name: my-dep
spec:
replicas: 3
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep
spec:
containers:
- image: nginx
name: nginx
3、扩缩容能力 kubectl scale
- 使用命令行形式
#查看当前pod数为3个
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-deploy-nginx-67cfd466f7-64z25 1/1 Running 0 51s 10.244.1.14 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-7zf4k 1/1 Running 0 51s 10.244.1.15 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-s576x 1/1 Running 0 51s 10.244.1.13 k8s-node1 <none> <none>
#使用kubectl scale deploy/depoly名字 --replicas=扩容后的总pod数实现扩容
[root@k8s-master ~]# kubectl scale deploy/my-deploy-nginx --replicas=5
deployment.apps/my-deploy-nginx scaled
#此时pod总数从3个变为5个
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-deploy-nginx-67cfd466f7-5lpzm 0/1 ContainerCreating 0 9s <none> k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-64z25 1/1 Running 0 97s 10.244.1.14 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-7zf4k 1/1 Running 0 97s 10.244.1.15 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-ntk8v 0/1 ContainerCreating 0 9s <none> k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-s576x 1/1 Running 0 97s 10.244.1.13 k8s-node1 <none> <none>
#将--replicas设置为2则会缩容
[root@k8s-master ~]# kubectl scale deploy/my-deploy-nginx --replicas=2
deployment.apps/my-deploy-nginx scaled
#此时pod个数从5个又变回了2个
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-deploy-nginx-67cfd466f7-64z25 1/1 Running 0 5m4s 10.244.1.14 k8s-node1 <none> <none>
my-deploy-nginx-67cfd466f7-s576x 1/1 Running 0 5m4s 10.244.1.13 k8s-node1 <none> <none>
- 使用配置文件形式:直接修改配置文件中的–replicas后面的个数,然后:wq保存,k8s会自动按照个数进行扩缩容操作。
- 使用可视化界面方式:
4、滚动更新能力
当容器的版本想要更新到一个新的版本时,但是此时仍然有流量不断进行请求,如何在不间断流量请求的情况下更新到新的版本?
先启动v2版本的pod,然后停掉一个v1版本的pod,此时v1和v2版本是共存的,直到所有v2版本替换成v1版本则更新成功。如果当一个新版本有问题时,只会一个pod有问题,不会导致所有pod都存在问题。
- 版本更新
#kubectl set image deployment/deploy名字 上一个版本镜像名=镜像名:准备更新的版本号 --record
#--record#记录此次更新的日志信息
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
#查看所有pod运行和替换的过程
kubectl get pod -w
- 版本回退
#历史记录
kubectl rollout history deployment/my-dep
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2
5、工作负载总结
- Deployment:更新无状态应用部署,比如微服务,提供多副本等功能;
- StatefulSet:更新有状态应用部署,例如redis,使得每次部署使用挂载技术保证数据一致,提供稳定的网络和内存,ip不会改变,在KubeSphere中提供可视化部署方式;
- DaemonSet:守护型应用部署,例如日志收集组件,保证个机器中有且只有一个;
- Job/CronJob:定时任务部署,比如定时清理垃圾,可以在指定时间内部署。
- 官网文档关于除了Deployment工作负载外其他负载使用的具体规则:
五、Service
1、ClusterIP方式访问
只有集群内可以访问。
- 服务发现
假设前端项目想要访问后台管理服务,需要一个ip地址,但是k8s会给每个pod分配不同的ip,如果在前端写死一个ip,当这个pod挂掉之后,无法去访问其它pod,就无法实现负载均衡,所以,k8s使用service管理pod,并将所有pod暴露统一的ip地址,提供给其他服务进行调用。当有pod挂掉时它会进行重启。
- 负载均衡
service会根据流量的请求分配不同的pod进行流量的处理。 - 使用命令行方式设置service端口号:
#修改两个pod的Nginx访问页面,一个是111,一个是2222,用于区分两个pod
root@my-deploy-nginx-67cfd466f7-s576x:/# cd /usr/share/nginx/html/
root@my-deploy-nginx-67cfd466f7-s576x:/usr/share/nginx/html# ls
50x.html index.html
root@my-deploy-nginx-67cfd466f7-s576x:/usr/share/nginx/html# echo 2222 > index.html
#设置service暴露的公共端口号
#my-deploy-nginx:deploy名称
#--port:对外暴露的端口号,设置为service端口,通过此端口号可以访问deploy的所有pod(此端口号是设置的)
# --target-port:指定访问服务内部的pod端口号(此端口号是真实的)
[root@k8s-master ~]# kubectl expose deploy my-deploy-nginx --port 8000 --target-port=80
service/my-deploy-nginx exposed
#获取所有service的端口号和ip地址
[root@k8s-master ~]# kubectl get service -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d23h <none>
my-deploy-nginx ClusterIP 10.96.139.241 <none> 8000/TCP 3m19s app=my-deploy-nginx
[root@k8s-master ~]# curl 10.96.139.241:8000
111
[root@k8s-master ~]# curl 10.96.139.241:8000
111
[root@k8s-master ~]# curl 10.96.139.241:8000
111
[root@k8s-master ~]# curl 10.96.139.241:8000
2222
- 使用配置文件方式:
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
selector:
app: my-dep
ports:
- port: 8000
protocol: TCP
targetPort: 80
- 注意:service的地址也只是在集群内有效, 同一个集群下的服务不仅可以使用ip访问,同时也可以访问域名(默认service名)service域名.命名空间.svc:service端口号。
2、NodePort
集群外也可以访问。
[root@k8s-master ~]# kubectl expose deploy my-deploy-nginx --port=8000 --target-port=80 --type=NodePort
service/my-deploy-nginx exposed
[root@k8s-master ~]# kubectl get svc -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d4h <none>
my-deploy-nginx NodePort 10.98.68.170 <none> 8000:31860/TCP 17s app=my-deploy-nginx
[root@k8s-master ~]# curl 10.98.68.170:8000
2222
[root@k8s-master ~]# curl 10.98.68.170:8000
2222
[root@k8s-master ~]# curl 10.98.68.170:8000
2222
[root@k8s-master ~]# curl 10.98.68.170:8000
111
k8s会分配两个端口,一个是8000,自己在创建的时候指定的端口,还有一个是随机指定的(30000-32767)之间,将每个pod都分配一个这个端口,可以根据pod的公网ip加该端口号进行外网访问。
3、Ingress
Service的统一网关入口。
相当于集群的网关,流量进来之后可以通过负载均衡处理LB进行服务的分发,将流量进入该机器的Ingress里,然后Ingress进行域名解析,然后通过Ingress进行service的分发,service再次通过负载均衡进行相应的pod匹配,ingress底层原理就是nginx,拥有域名解析和负载均衡的能力。k8s网络分为两层,pod层和service层,当我们安装k8s进行初始化时就已经指定了两个网络层的ip范围。
1、安装
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
#修改镜像
vi deploy.yaml
#将image的值改为如下值:
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0
#应用配置文件
kubectl apply -f deploy.yaml
# 检查安装的结果
kubectl get pod,svc -n ingress-nginx
# 最后别忘记把svc暴露的端口要放行
2、实战
如何根据域名访问使Ingress进行流量分发给不同的service?
- 构建基础配置,创建一个hello-server和nginx-demo
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-server
spec:
replicas: 2
selector:
matchLabels:
app: hello-server
template:
metadata:
labels:
app: hello-server
spec:
containers:
- name: hello-server
image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
ports:
- containerPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-demo
name: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- image: nginx
name: nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-demo
name: nginx-demo
spec:
selector:
app: nginx-demo
ports:
- port: 8000
protocol: TCP
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello-server
name: hello-server
spec:
selector:
app: hello-server
ports:
- port: 8000
protocol: TCP
targetPort: 9000
- 应用该配置文件
kubectl apply -f ***.yaml
- 设置访问使域名的解析规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-host-bar
spec:
ingressClassName: nginx
rules:
- host: "hello.kanlina.com" #请求拦截的域名
http:
paths:
- pathType: Prefix
path: "/" #该域名下的所有请求
backend:
service:
name: hello-server #分发到的service
port:
number: 8000 #service暴露的端口号
- host: "demo.kanlina.com"
http:
paths:
- pathType: Prefix
path: "/nginx" # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404
backend:
service:
name: nginx-demo ## java,比如使用路径重写,去掉前缀nginx
port:
number: 8000
- 设置hosts文件映射规则
这里的ip一定得是ingress部署节点的ip地址! - 修改Ingress匹配规则
在这里插入代码片
[root@k8s-master ~]# kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-host-bar nginx hello.kanlina.com,demo.kanlina.com 182.92.128.93 80 41m
[root@k8s-master ~]# kubectl edit ing ingress-host-bar
3、路径重写
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 #添加规则
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
4、流量限制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-limit-rate
annotations:
nginx.ingress.kubernetes.io/limit-rps: "1" #添加注解
spec:
ingressClassName: nginx
rules:
- host: "haha.atguigu.com"
http:
paths:
- pathType: Exact #精确匹配
path: "/"
backend:
service:
name: nginx-demo
port:
number: 8000
当你访问过快的时候会返回503状态码。
4、总结
k8s内的网络通信有三种方式,一种是通过Pod的ip地址,但是该种方式只能在集群内部访问,外部无法直接使用Pod的ip地址访问到集群内部服务,pod之间的服务可以互相通信;第二种方式是service方式进行访问,但是也仅局限于集群内部访问,service可以对流量进行负载均衡分发pod,而且pod可以和service层进行通信;第三种方式是Ingress,服务请求的总入口,相当于整个service的网关,可以对请求进行路径重写、流量限制、根据域名匹配服务等高级功能,底层原理是使用Nginx实现的。
六、存储抽象
1、基本概念
k8s挂载存在的问题:原pod在3号机器上运行,想要将文件挂载到本地一个目录,但是由于该pod出现故障,k8s故障转移策略将其转移到2号机器上,原挂载文件不会携带,导致原数据丢失。
k8s将整个数据挂载层统一管理生成存储层,可以使用的技术有很多,例如Glusterfs,NFS,CephFS。
2、NFS 网络文件系统
- NFS:网络文件系统,相当于共享文件,使用一个机器上的文件作为主要的挂载文件,其他机器上的文件作为备份文件,只要有改变的就会更新到该主文件目录上。
2.1 NFS环境部署:
- 所有节点:
#所有机器安装
yum install -y nfs-utils
- 主节点
#nfs主节点
# *:所有人都可以读到此文件
# insecure:非安全模式
# rw:读写方式
echo "/nfs/data/ *(insecure,rw,sy nc,no_root_squash)" > /etc/exports
#创建挂载目录
mkdir -p /nfs/data
systemctl enable rpcbind --now
# 开机启动
systemctl enable nfs-server --now
#配置生效
exportfs -r
#查看是否挂载成功
exportfs
- 从节点
#查看主节点暴露的挂载目录
showmount -e master内网ip
#执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount
mkdir -p /nfs/data
# 使用nfs共享文件
mount -t nfs master内网ip:/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 #pod内部文件
volumes:
- name: html
nfs:
server: 172.31.0.4
path: /nfs/data/nginx-pv #挂载到的文件,需要先保证有这个文件夹!!!
#应用配置文件部署
kubectl apply -f depoly.yaml
2.2 NFS问题
- 挂载的目录需要实现创建;
- 系统量大的时候,pod删除时文件不会删除;
- 对于Pod默认使用的空间是没有限制的,对内存造成压力。
2.3 PV与PVC的使用
- 基本概念
PV:持久卷,需要挂载保存的数据,指定的位置;
PVC:持久卷声明,规定持久卷的容量大小,类似申请,在pod想要挂载的时候需要进行申请,PVC去创建空间,pod如果想要删除,PVC也会将空间一起删除。 - 创建PV池
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
- 创建PV service统一更改为自己的内网ip
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
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
#获取所有pv
kubectl get pv
#删除pv
kubectl delete -f ***.yaml
#获取pvc
kubectl get pvc
- 创建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 #申请书名称空间
3、ConfigMap
配置集合,挂载所有配置集。
- redis实例:
把之前的配置文件创建为配置集:
# 创建配置,redis保存到k8s的etcd;
kubectl create cm redis-conf --from-file=redis.conf
apiVersion: v1
data: #data是所有真正的数据,key:默认是文件名 value:配置文件的内容
redis.conf: |
appendonly yes
kind: ConfigMap
metadata:
name: redis-conf
namespace: default
创建pod:
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
检查默认配置
kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET appendonly
127.0.0.1:6379> CONFIG GET requirepass
以后需要更改容器配置,直接更改ConfigMap就可以,k8s有热更新功能。
配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。
原因:我们的Pod部署的中间件自己本身没有热更新能力
4、Secret
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod
的定义或者 容器镜像 中来说更加安全和灵活
kubectl create secret docker-registry leifengyang-docker \
--docker-username=leifengyang \
--docker-password=Lfy123456 \
--docker-email=534096094@qq.com
##命令格式
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