一、资源创建方式

  • 使用命令行
  • 使用yum

二、NameSpace

名称空间,用来对集群资源进行隔离划分。默认只隔离资源,不隔离网络。例如创建开发、测试、生产等命令空间,可以保证一个应用引用配置只能读取自己名称空间内的资源,但是可以访问不同名称空间的网络。所有资源在没指定的时候都是默认在default下。

k8s yaml支持dockerfile吗 k8s yaml namespace_容器


可以使用命令行操作名称空间,也可以使用配置文件或者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中最小的基本单位。

k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_02

  • 命令行方式使用:
#根据镜像创建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
  • 可视化方式

k8s yaml支持dockerfile吗 k8s yaml namespace_kubernetes_03

  • 每个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 yaml支持dockerfile吗 k8s yaml namespace_docker_04


容器启动成功后,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加端口号就可以访问。

k8s yaml支持dockerfile吗 k8s yaml namespace_nginx_05

k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_06


同一个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转移到其他机器上运行。
  • k8s yaml支持dockerfile吗 k8s yaml namespace_容器_07

  • 如果一个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

k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_08

  • 使用配置文件方式创建
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

k8s yaml支持dockerfile吗 k8s yaml namespace_kubernetes_09

5、工作负载总结

k8s yaml支持dockerfile吗 k8s yaml namespace_nginx_10

  • Deployment:更新无状态应用部署,比如微服务,提供多副本等功能;
  • StatefulSet:更新有状态应用部署,例如redis,使得每次部署使用挂载技术保证数据一致,提供稳定的网络和内存,ip不会改变,在KubeSphere中提供可视化部署方式;
  • DaemonSet:守护型应用部署,例如日志收集组件,保证个机器中有且只有一个;
  • Job/CronJob:定时任务部署,比如定时清理垃圾,可以在指定时间内部署。
  • 官网文档关于除了Deployment工作负载外其他负载使用的具体规则:

五、Service

1、ClusterIP方式访问

只有集群内可以访问。

k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_11

  • 服务发现

假设前端项目想要访问后台管理服务,需要一个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加该端口号进行外网访问。

k8s yaml支持dockerfile吗 k8s yaml namespace_容器_12

3、Ingress

Service的统一网关入口。

相当于集群的网关,流量进来之后可以通过负载均衡处理LB进行服务的分发,将流量进入该机器的Ingress里,然后Ingress进行域名解析,然后通过Ingress进行service的分发,service再次通过负载均衡进行相应的pod匹配,ingress底层原理就是nginx,拥有域名解析和负载均衡的能力。k8s网络分为两层,pod层和service层,当我们安装k8s进行初始化时就已经指定了两个网络层的ip范围。

k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_13

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暴露的端口要放行

k8s yaml支持dockerfile吗 k8s yaml namespace_kubernetes_14

2、实战

k8s yaml支持dockerfile吗 k8s yaml namespace_kubernetes_15


如何根据域名访问使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 yaml支持dockerfile吗 k8s yaml namespace_kubernetes_16


k8s将整个数据挂载层统一管理生成存储层,可以使用的技术有很多,例如Glusterfs,NFS,CephFS。

2、NFS 网络文件系统

  1. NFS:网络文件系统,相当于共享文件,使用一个机器上的文件作为主要的挂载文件,其他机器上的文件作为备份文件,只要有改变的就会更新到该主文件目录上。

2.1 NFS环境部署:

  1. 所有节点:
#所有机器安装
yum install -y nfs-utils
  1. 主节点
#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
  1. 从节点
#查看主节点暴露的挂载目录
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
  1. 原生配置文件方式挂载
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

k8s yaml支持dockerfile吗 k8s yaml namespace_容器_17

2.2 NFS问题

  1. 挂载的目录需要实现创建;
  2. 系统量大的时候,pod删除时文件不会删除;
  3. 对于Pod默认使用的空间是没有限制的,对内存造成压力。

2.3 PV与PVC的使用

  1. 基本概念
    PV:持久卷,需要挂载保存的数据,指定的位置;
    PVC:持久卷声明,规定持久卷的容量大小,类似申请,在pod想要挂载的时候需要进行申请,PVC去创建空间,pod如果想要删除,PVC也会将空间一起删除。
  2. 创建PV池
#nfs主节点
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
  1. 创建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

k8s yaml支持dockerfile吗 k8s yaml namespace_容器_18

  1. 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

k8s yaml支持dockerfile吗 k8s yaml namespace_nginx_19


k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_20

  1. 创建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 #申请书名称空间

k8s yaml支持dockerfile吗 k8s yaml namespace_tomcat_21


k8s yaml支持dockerfile吗 k8s yaml namespace_容器_22

3、ConfigMap

配置集合,挂载所有配置集。

  1. 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

k8s yaml支持dockerfile吗 k8s yaml namespace_docker_23


以后需要更改容器配置,直接更改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