Kubernetes介绍
1、k8s概述和特性
*k8s是谷歌在2014年开源的容器化集群管理系统
*使用k8s进行容器化应用部署
*使用k8s利于应用扩展
*k8s目标实施让部署容器化应用更加简洁和高效
k8s功能特性
*自动装箱
*自我修复(自愈能力)
*水平扩展
*服务发现
*滚动更新
*版本回退
*密钥和配置管理
*存储编排
*批处理
2、k8s架构组件
Master(主控节点)和node(工作节点)
1、master节点组件
*apiserver:集群统一入口,以restful方式提供,交给etcd存储
*scheduler:节点调度,选择node节点应用部署
*controller-manager:处理集群中常规后台任务,一个资源对应一个控制器。
*etcd:存储系统,用于保存集群相关的数据
2、node节点组件
*kubelet:master派到node节点代表,管理本机容器(容器创建、生命周期等)
*kube-proxy:提供网络代理,负载均衡等操作
3、k8s核心概念
*Pod
Pod基本概念
1、最小部署的单元
2、包含多个容器(一组容器的集合)
3、一个Pod中容器共享网络命名空间
4、Pod生命周期是短暂的
*Controller
1、确保预期的Pod副本数量
2、无状态应用部署
3、有状态应用部署(依赖存储、网络ip)
4、确保所有的node运行同一个Pod
5、一次性任务和定时任务
*Service
定义一组Pod的访问规则
service统一入口,由controller管理控制pod
K8s安装,简单介绍
主要内容
1、Pod
2、Controller(Deployment/StatefulSet)
DeamonSet(守护进程)
Job(执行一次)
CronJob(定时任务)
3、Service
Secret(凭证)
ConfigMap(配置文件)
Volume(数据卷)
4、Ingress(弥补NodePort的不足)
5、 Helm
Pod存在的意义
1、创建容器使用docker,一个docker对应是一个容器,一个容器有一个进程,一个容器运行一个应用程序
拓展:守护进程
2、Pod是多进程的设计,运行多个应用程序
*一个Pod有多个容器,一个容器里面运行一个应用程序
3、Pod存在为了亲密性应用
*两个应用之间进行交互
*网络之间的调用,通过127.0.0.1或者socket调用
*两个应用需要频繁调用(如数据库和应用程序之间调用)
Pod实现机制
1、共享网络
2、共享存储
共享网络
容器本身之间相互隔离的
namespace
group
前提条件,容器在同一个namespace里面
Pod实现共享网络机制
首先创建Pause容器,然后创建业务容器,将业务容器加入info容器(Pause容器),通过Pause容器将业务容器加入同一个namespace中,实现网络共享。
共享存储
Pod持久化数据(日志数据、业务数据等)
引入数据卷的概念Volumn,使用数据卷进行持久化存储
Pod镜像拉取策略
imagePullPolicy:Always、IfNotPresent(默认,不存在才拉取)、Never(永远不会主动拉取)
Pod资源限制
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysq1
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
  resources:
    requests:                   #(调度)
      memory: "64Mi"
      cpu: "250m"
    limits:                        #(最大)
      memory: "128Mi ”
      cpu: "500m"
Pod重启机制
apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers :
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -C
    - sleep 36000
  restartPolicy: Never
#Always: 当容器終止退出后,总是重启容器,默认策略。
#onFailure: 当容器异常退出(退出状态码非0)时,才重启容器。
# Never: 当容器终止退出,从不重启容器。
Pod健康检查
1、livenessProbe(存活检查)
如果检查失败,将杀死容器,根据Pod的restartPolicy来操作
2、readnessProbe(就绪检查)
如果检查失败,Kubernetes会把Pod从service endpoints中剔除
Probe支持以下三种检查方法:
1、httpGet,发送HTTP请求,返回200~400范围状态码为成功。
2、exec,执行Shell命令返回状态码是0为成功。
3、tcpSockt,发起TCP Socket建立成功。
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
name: liveness- exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - touch /tmp/healthy; sleep 30; rm -rr /tmp/healthy
    livenessProbe:
      exec:
        comand:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
创建Pod的流程
master节点 
create pod -- apiserver -- etcd
scheduler -- apiserver --etcd -- 调度算法,把pod调度到某个node节点上
node节点 
kubelet -- apiserver -- 读取etcd拿到分配给当前节点node -- docker创建容器
影响调度的属性
1、Pod资源限制对Pod调度产生影响
resources:
  requests:
  memory: "64Mi"
  cpu: "250m"
根据request找到足够node节点进行调度
2、节点选择器标签影响Pod调度
首先对节点创建标签
kubectl label node node01 env_role=dev
查看node标签
kubectl get node node01 --show-labels
NAME     STATUS   ROLES    AGE   VERSION   LABELS
node01   Ready       86d   v1.15.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env_role=dev,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
yaml文件指定配置
apiVersion; v1
kind: Pod
metadata:
  name: pod-example
spec
  nodeSelector:
    env_role: dev
  containers:
  - name: nginx
    image: nginc1.15
3、节点亲和性 nodeAffinity和之前nodeSelector基本一样的,根据节点上标签约束来决定Pod调度到哪个节点上。
apiversion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodoAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:      #硬亲和性
        nodeSelectorTerms:
        - matchExpressions:
          - key: env_role
            operator: In
            values:
            - dev
            - test
      preferredDuringSchedulingIgnoredDuringExecution:    #软亲和性
      - weight: 1  #权重
        preference:
          matchExpressions:
          - key: group
            operator: In
            values:
            otherprod
  containers:
  - name: webdemo
    image: nginx
*硬亲和性
约束条件必须满足
*软亲和性
尝试满足,不保证
支持常用操作符
In 
NotIn 
Exists 
Gt大于 
Lt小于 
DoseNotExists
4、反亲和性
In换成NotIn或者DoseNotExists
5、污点和污点容忍
*基本介绍,nodeSelector和nodeAffinity:Pod调度到某些节点上,Pod属性,调度时候实现; Taint污点:节点不做普通分配调度,是节点属性
*场景
专用节点
配置特定硬件节点
基于Taint驱逐
*具体演示
a、查看节点污点情况
kubectl describe node node01 |grep Taint
污点值有三个
1.NoSchedule::一定不被调度
2.PreferNoSchdule: 尽量不被调度
3.NoExecute:不会调度,并且还会驱逐node已有Pod
b、为节点添加污点
kubectl taint node [node] key=value :污点三个值
如:kubectl taint node node01 env_role=yes:NoSchedule
c、 污点删除
kubectl taint node node01 env_role:NoSchedule-
扩展命令
kubectl create deployment web --image=nginx
kubectl scale deployment web --replicas=5 #复制部署的web5次
污点容忍
spec:
tolerations :
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule”
containers:
- name: webdemo
  image: nginx
Controller控制器
Deployment属于无状态的Controller
什么是Controller
在集群上管理和运行容器的对象
Pod和Controller的关系
1、Pod是通过Controller实现应用的运维,比如伸缩、滚动升级等等
2、Pod和Controller之间通过label、 selector 标签建立关系。
Deployment控制器应用场景
1、部署无状态应用,应用场景:web服务,微服务
2、管理Pod和ReplicaSet
3、部署,滚动升级等功能
使用Deployment部署应用(yaml)
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
vi web.yaml
kubectl apply -f web.yaml
对外发布(暴露端口)
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
kubectl apply -f web1.yaml
应用升级回滚和弹性伸缩
指定nginx版本1.14
kubectl set image deployment web  nginx=nginx:1.15
查看应用是否升级成功
kubectl rollout status deployment web 
查看历史版本
kubectl rollout history deployment web
回滚到上一个版本
kubectl rollout undo deployment web
回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
弹性伸缩
kubectl scale deployment web --replicas=5
Service
定义一组Pod的访问规则
1、service存在的意义
*为了防止Pod失联(服务发现)
*定义一组Pod访问策略(负载均衡)
2、Pod和Service的关系
根据label和selector标签建立关联的,通过service实现Pod的负载均衡
selector:
  app: nginx
labels:
  app: nginx
3、常用Service类型
*ClusterIP:集群内部使用
*NodePort:对外访问应用使用
*LoadBalancer:对外访问应用使用,公有云
node内网部署应用,外网一般不能访问到的
*找到一台可以进行外网访问的机器,安装nginx,反向代理,手动把可以访问节点添加到nginx里面,LoadBalancer:公有云,负载均衡
StatefulSet(有状态部署)
1、无状态和有状态
*无状态
认为Pod都是一样的
没有顺序要求
不用考虑在哪个node上运行
随意进行伸缩和扩展
*有状态
上面因素都需要考虑到
让每个Pod独立的,保持Pod启动顺序和唯一性
  •     唯一的网络标识符,持久存储
  •     有序,比如mysql主从
2、部署有状态应用
*无头service
  ClusterIP:none
StatefulSet部署有状态应用
  kind:StatefulSet
新建一个有状态的应用,yaml如下:
apiVersion: v1
kind: service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
查看Pod,有三个Pod,每个都是唯一名称
查看创建无头的service
deployment和statefulset区别,有身份的(唯一标识的)
*根据主机名+按照一定规则生成域名
  • 每个Pod有唯一主机名
  • 唯一域名:
格式:主机名称.无头service名称.名称空间.svc.cluster.local
那么可以得出以上域名:nginx-statefulset-0.nginx.default.svc.cluster.local
3、部署守护进程DeamonSet
*在每个node上运行一个Pod,新加入的node也同样运行在一个Pod里面
  • 例子:在每个node节点安装数据采集工具
新建ds.yaml文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds-test
  labels:
    app: filebeat
spec:
  selector :
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
    spec:
      containers:
      - name: logs
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: varlog
          mountPath: /tmp/log
      volumes :
      - name: varlog
        hostPath:
          path: /var/log
运行
kubectl apply -f ds.yaml
进入Pod容器
kubectl exec -it ds-test-89mzz bash
4、Job(一次性任务)
创建job.yaml文件
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi (2000) "]
      restartPolloy: Never
  backoffLimit: 4
运行job.yaml
kubectl apply -f job.yaml
查看
kubectl get jobs
查看运行结果
kubectl logs pi-bvrw9
5、cronJob(定时任务)
*列如:数据定时备份
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
同上运行完以后得到如下结果(每分钟执行一次):
Secret(存加密的数据)
作用:加密数据存在etcd里面,让Pod容器以挂载Volume的方式进行访问
场景:凭证
例如:将admin用base64加密并输出
[root@master01 k8s_test]# echo -n 'admin' | base64
YWRtaW4=
1、创建secret加密数据
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data;
  username: YWRtaW4=
  password: c3cxMjM0NQ==
 查看
kubectl get secret
2、以变量形式挂载到Pod容器中
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
3、以Volume形式挂载Pod容器中
创建sv.yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers :
  - name: nginx
    image: nginx
    volumeMounts :
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret :
      secretName: mysecret
创建后进入
kubectl apply -f sv.yaml
kubectl exec -it mypod bash
ls /etc/foo
password username
ConfigMap(存储不加密的数据)
作用:存储不加密数据到etcd,让Pod以变量或者Volume挂载到容器中
场景:配置文件
1、创建配置文件
例子:创建redis.properties配置文件
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
2、创建configMap
kubectl create configmap redis-config --from-file=redis.properties
查看configmap
kubectl get cm
查看内容
kubectl describe cm redis-config
3、以Volume挂载
创建cv.yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: busybox
    image: busybox
    command: [ "/bin/sh", "-c", "cat /etc/config/redis.properties" ]
    volumeMounts :
    - name: config-volume
      mountPath: /etc/config
  volumes :
    - name: config-volune
      configMap:
        name: redis-config
  restartPolicy: Never
创建pod
kubectl apply -f cv.yaml
kubectl logs mypod
4、以变量形式挂载到Pod容器中
(1)创建var-c.yaml,声明变量信息configmap创建
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfig
  namespace: default
data:
  special.level: info
  special.type: hello
创建
kubectl apply -f var-c.yaml
(2)以变量形式挂载
创建config-var.yaml资源文件
apiVersion: v1
kind: Pod
metadata;
  name: mypod
spec:
  containers :
    - name: buaybox
      image: busybox
      comand: [ "/bin/sh", "-c", "echo $ (LEVEL) $ (TYPE)”]
      env:
        - name: LEVEL
          valueFrom :
            configMapKeyRef:
              name: myconfig
              key: special.level
        - name: TYPE
          valueFrom:
            configMapKeyRef:
              name: myconfig
              key: special.type
  restartPolicy: Never
演示同上
k8s集群安全机制
1、概述
*访问k8s集群时,需要经过三个步骤完成具体操作
  • 第一步 认证
  • 第二步 鉴权(授权)
  • 第三步 准入控制
2、进行访问时,过程中需要经过apiserver,apiserver做统一协调,比如门卫。访问过程中需要证书、token、或者用户名+密码,如果访问Pod需要serviceAccount。
第一步认证 传输安全
*传输安全:对外不暴露8080端口,只能内部访问,对外使用端口6443.
*认证(客户端身份认证,基于ca证书)
  • https证书认证,基于ca证书
  • http token认证,通过token识别用户
  • http基本认证,用户名+密码认证
第二步 鉴权(授权)
*基于RBAC进行鉴权操作
  • RBAC,基于角色的访问控制
  • 角色
  • role:特定命名空间访问权限
  • ClusterRole:所有命名空间访问权限
  • 角色绑定
  • roleBinding:角色绑定到主体
  • ClusterRoleBinding:集群角色绑定到主体
  • 主体
  • user:用户
  • group:用户组
  • serviceAccount:服务账号,一般用于Pod访问
  • 举例
1、创建命名空间
kubectl create ns roledemo
2、在新创建的命名空间创建Pod
kubectl run nginx --image=nginx -n roledemo
3、创建角色,rbac-role.yaml
kind: Role
apiVersion: rbac.authorization.k8a.io/v1
metadata:
  namespace: roledemo
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: [ "pods "]
  verbs: ["get", "watch", "list "]
执行
kubectl apply -f rbac-role.yaml
4、角色绑定
创建rbac-rolebinding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: roledemo
subjects:
- kind: User
  name: mary #Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must natch the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io
执行
kubectl apply -f rbac-rolebinding.yaml
5、使用证书识别身份
*基于角色的访问控制
第三步 准入控制
*就是准入控制器的列表,如果列表中有请求内容,通过,没有拒绝。
Ingress(弥补NodePort的不足)
1、把端口号对外暴露,通过ip+端口号进行访问
*使用Service里面的NodePort实现
2、NodePort缺陷
*在每个节点上都会启动端口,在访问的时候通过任何节点,通过节点ip+暴露端口号实现访问
*意味着每个端口只能使用一次,一个端口对应一个应用
*实际访问中都是用域名,根据不同域名跳转到不同端口的服务中
3、Ingress和Pod的关系
*Pod和Ingress通过Service关联的
  • ingress作为统一入口,由service关联一组pod
4、Ingress工作流程
5、使用Ingress
第一步 部署Ingress Controller
第二步 创建Ingress规则
我们这里选择官方维护的nginx控制器,实现部署
6、使用Ingress对外暴露应用
*创建nginx应用,对外暴露端口使用NodePort
kubectl create deployment web --image=nginx
*部署ingress controller
apiVersion: v1
kind: Namespace
metadata:
  name: ingress-nginx
  labels:
    app. kubernetes .io/name: ingress-nginx
    app. kubernetes .io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
查看ingress controller状态
kubectl get pod -n ingress-nginx
*创建ingress规则
apiVersion: networking.k8s.10/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.ingredemo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 80
*在windows系统hosts文件中添加域名访问规则
Helm
1、引入
*之前方式部署应用基本过程
  • 编写yaml文件
Deployment(无状态应用)
Service
Ingress
*说明
  • 如果使用之前方式部署单一应用,少数服务的应用,比较合适。
  • 比如部署微服务项目,可能有几十个服务,每个服务都有一套yaml文件,需要维护大量yaml文件,版本管理特别不方便。
*使用helm可以解决哪些问题?
  • 使用helm可以把这些yaml作为一个整体管理
  • 实现yaml文件高效复用
  • 使用helm应用级别的版本管理
2、helm介绍
Helm是一个Kubernetes的包管理工具,就像Linux 下的包管理器,如 yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上
3、helm三个重要概念
*helm 是一个命令行客户端工具,主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
*Chart 把yaml打包,是yaml集合。一系列用于描述k8s资源相关文件的集合。
*Release 基于chart部署实体,使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。
4、helm在2019年发布V3版本,和之前版本相比有变化
*V3版本删除了Tiller
*Release在V3版本中,可以在不同命名空间中重用
*将Chart推送到docker仓库中,之前版本不支持
5、helm架构的变化
*V3之前版本
*V3版本架构
6、helm安装
第一步 下载helm安装压缩文件,上传到Linux系统中
第二步 解压helm压缩文件,把解压之后helm目录复制到usr/bin目录下
7、配置helm仓库
*添加仓库
helm repo add 仓库名称 仓库地址
微软的镜像:helm repo add stable http://mirror.azure.cn/kubernetes/charts
stable    http://mirror.azure.cn/kubernetes/charts   
阿里云镜像:helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
查看仓库
helm repo list
更新仓库
helm repo update
删除仓库
helm repo remove aliyun
查看版本
helm version
8、使用helm快速部署应用
第一步 使用命令搜索应用
helm search repo 名称(如weave)
第二步 根据搜索到的内容选择安装
helm install 名称(别名) 搜索之后应用名称
查看安装之后的状态
helm list
helm status 别名
9、如何自己创建Chart
*使用命令创建chart
helm create chart名称(如mychart)
*说明
  • Chart.yaml: 当前chart属性配置信息
  • templates:编写yaml文件放到这个目录中
  • values.yaml:yaml文件可以使用的全局变量
*在templates文件夹创建
  • deployment.yaml
  • service.yaml
kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml
kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml
*安装mychart
helm install web1 mychart/
*应用升级
helm upgrade web1 mychart/
10、实现yaml高效复用
*通过传递参数,动态渲染模板,yaml内容动态传入参数生成
*在chart有values.yaml文件,定义yaml文件全局变量
  • 在values.yaml定义变量和值
  • 在具体yaml文件,获取定义变量值
*yaml文件大体有几个地方不同的
  • image
  • tag
  • label
  • port
  • replicas
*在values.yaml定义变量和值
replicas:1
image:nginx
tag:1.16
label:nginx
port:80
*在templates的yaml文件使用values.yaml定义变量
通过表达式形式使用全局变量
{{.Values.变量名称}}
如{{.Release.Name}}
{{.Values.Name}}
NFS(持久化存储,网络存储)
数据卷emptydir,是本次存储,pod重启,数据不存在了,需要对数据持久化存储
1、nfs,网络存储,pod重启,数据还存在
第一步 找一台服务器nfs服务端,
(1)安装nfs
yum install -y nfs-utils
(2)设置挂载路径
vi /etc/exports
添加 :/data/nfs *{rw.no_root_squash}
(3)挂载路径需要创建出来
创建/data/nfs路径
mkdir /data
cd /data
mkdir nfs
第二步 在k8s集群node节点安装nfs
yum install -y nfs-utils
第三步 在nfs服务器启动nfs服务
systemctl start nfs
第四步 在k8s集群部署应用使用nfs持久网络存储
创建nfs-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dep1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
       app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
        - name: wwwroot
          nfs:
            server: 192.168.20.69
            path: /data/nfs
演示略
PV和PVC
1、PV:持久化存储,对存储资源进行抽象,对外提供可以调用的地方(生产者)
2、PVC:用户调用,不需要关心内部实现细节(消费者)
3、实现流程
创建pvc.yaml
apiVersion: apps/v1
kind: Deploynent
metadata:
  name: nginx-dep1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
    volumes:
    - name: wwwroot
      persistentVolumoClaim:
        claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
创建pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs
    server: 192.168.20.61
创建完,自动Bounding
集群资源监控
1、监控指标
2、监控平台
监控指标
*集群监控
  • 节点资源利用率
  • 节点数
  • 运行Pod
*Pod监控
  • 容器指标
  • 应用程序
监控平台搭建方案(promethus+Grafana)
(1)promethus
*开源的
*监控、报警、数据库
*以HTTP协议周期性抓取被监控组件状态
*不需要复杂的集成过程,使用HTTP接口接入即可。
(2)Grafana
*开源的数据分析和可视化工具
*支持多种数据源
(3)搭建监控平台
扩展kubectl命令
生成yaml资源文件
kubectl create deployment web --image=nginx
kubectl create deployment web --image=nginx -o yaml(输出到控制台) --dry-run(不运行,仅生成) > my1.yaml(输出到文件)
kubectl get deploy nginx -o=yaml --export > my2.yaml
参考资料:
https://zhuanlan.zhihu.com/p/149403551
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐