(七)k8s---yaml文件,image,node选择器,selector,运行web服务(nginx,tomcat) NFS挂载

四. yaml文件

Pod 资源清单详细解读


apiVersion: v1 #版本号,例如 v1
kind: Pod #资源类型,如 Pod
metadata: #元数据
 name: string # Pod 名字
 namespace: string # Pod 所属的命名空间
 labels: #自定义标签
 - name: string #自定义标签名字
 annotations: #自定义注释列表
 - name: string
spec: # Pod 中容器的详细定义
 containers: # Pod 中容器列表
 - name: string #容器名称
 image: string #容器的镜像名称
 imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys 表示下载镜像 IfnotPresent 表示优先使用本地镜像,否则下载镜像,Nerver 表示仅使用本地镜像
 command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
 args: [string] #容器的启动命令参数列表
 workingDir: string #容器的工作目录
 volumeMounts: #挂载到容器内部的存储卷配置
 - name: string #引用 pod 定义的共享存储卷的名称,需用 volumes[]部分定义的的卷名
 mountPath: string #存储卷在容器内 mount 的绝对路径,应少于 512 字符
 readOnly: boolean #是否为只读模式
 ports: #需要暴露的端口库号
 - name: string #端口号名称
 containerPort: int #容器需要监听的端口号
 hostPort: int #容器所在主机需要监听的端口号,默认与 Container 相同
 protocol: string #端口协议,支持 TCP 和 UDP,默认 TCP
 env: #容器运行前需设置的环境变量列表
 - name: string #环境变量名称
 value: string #环境变量的值
 resources: #资源限制和请求的设置
 limits: #资源限制的设置
 cpu: string #cpu 的限制,单位为 core 数
 memory: string #内存限制,单位可以为 Mib/Gib
 requests: #资源请求的设置
 cpu: string #cpu 请求,容器启动的初始可用数量
 memory: string #内存请求,容器启动的初始可用内存
 livenessProbe: #对 Pod 内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有 exec、httpGet 和 tcpSocket,对一个容器只需设置其中一种方法即可
 exec: #对 Pod 容器内检查方式设置为 exec 方式
 command: [string] #exec 方式需要制定的命令或脚本
 httpGet: #对 Pod 内个容器健康检查方法设置为 HttpGet,需要制定 Path、port
 path: string
 port: number
 host: string
 scheme: string
 HttpHeaders:
 - name: string
 value: string
 tcpSocket: #对 Pod 内个容器健康检查方式设置为 tcpSocket 方式
 port: number
 initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
 timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认 1 秒
 periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认 10 秒一次
 successThreshold: 0
 failureThreshold: 0
 securityContext:
 privileged:false
 restartPolicy: [Always | Never | OnFailure]#Pod 的重启策略,Always 表示一旦不管以何种方式终止运行,kubelet 都将重启,OnFailure 表示只有 Pod 以非 0 退出码退出才重启,Nerver 表示不再重启该 Pod
 nodeSelector: obeject #设置 NodeSelector 表示将该 Pod 调度到包含这个 label 的 node上,以 key:value 的格式指定
 imagePullSecrets: #Pull 镜像时使用的 secret 名称,以 key:secretkey 格式指定
 - name: string
 hostNetwork:false #是否使用主机网络模式,默认为 false,如果设置为 true,表示使用宿主机网络
 volumes: #在该 pod 上定义共享存储卷列表
 - name: string #共享存储卷名称 (volumes 类型有很多种)
 emptyDir: {} #类型为 emtyDir 的存储卷,与 Pod 同生命周期的一个临时目录。为空值
 hostPath: string #类型为 hostPath 的存储卷,表示挂载 Pod 所在宿主机的目录
 path: string #Pod 所在宿主机的目录,将被用于同期中 mount 的目录
 secret: #类型为 secret 的存储卷,挂载集群与定义的 secre 对象到容器内部
 scretname: string 
 items: 
 - key: string
 path: string
 configMap: #类型为 configMap 的存储卷,挂载预定义的 configMap 对象到容器内部
 name: string
 items:
 - key: string
 path: string

镜像下载策略

K8s的镜像下载策略有三种:Always、Never、IFNotPresent;

Always:镜像标签为latest时,总是从指定的仓库中获取镜像;
Never:禁止从仓库中下载镜像,也就是说只能使用本地镜像;
IfNotPresent:仅当本地没有对应镜像时,才从目标仓库中下载。

默认的镜像下载策略是:当镜像标签是latest时,默认策略是Always;当镜像标签是自定义时(也就是标签不是latest),那么默认策略是IfNotPresent。

node节点选择器

在创建 pod 资源的时候,pod 会根据 schduler 进行调度,那么默认会调度到随机的一个工作节点,

1、 想要 pod 调度到指定节点或者调度到一些具有相同特点的 node 节点
2、 可以使用 pod 中的 nodeName 或者 nodeSelector 字段指定要调度到的 node 节点

  1. 使用 nodeName 指定 pod 节点运行在哪个具体 node
    在这里插入图片描述
  2. 使用 nodeSelector 指定 pod 调度到具有哪些标签的 node 节点上
    使用之前打的标签 GF=IT
    在这里插入图片描述
    在这里插入图片描述

需要提前创建好yaml文件,并创建好好pod运行所需要的namespace、yaml文件等资源

  1. apiVersion - 创建该对象所使用的 Kubernetes API 的版本
  2. kind - 想要创建的对象的类型,之后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象
  3. metadata - 帮助识别对象唯一性的数据,包括一个 name 名称
    可选的 namespace
  4. spec 定义容器信息
启动几个pod,用的是控制器,RS,deployment
spec:
 replicas: 1
  1. status(Pod创建完成后k8s自动生成status状态

yaml文件及必需字段
每个API对象都有3大类属性:元数据metadata、规范spec和状态status。

在这里插入图片描述
spec和status的区别:
spec是期望状态
status是实际状态

1. 创建namespace.yaml文件

pwd /opt/k8s-data/yaml/ 

mkdir namespaces linux36

cd namespaces 

cat linux36.yaml 
apiVersion: v1 #API版本 
kind: Namespace #类型为namespac 
metadata: #定义元数据 
	name: linux36 #namespace名称

可以使用kubectl explain namespace 查看版本信息

创建并验证namespace

kubectl apply -f linux36.yaml
namespace/linux36 created 

kubectl get namespaces 
NAME STATUS AGE d
efault Active 21d 
kube-public Active 21d 
kube-system Active 21d 
linuxqcq Active 45s

再web界面查看在etcd中查看到

2. yaml与json:

yaml和json对比
在线yaml与json编辑器:http://www.bejson.com/validators/yaml_editor/

json格式

{ '人员名单': 
	{ '张三': { '年龄': 18, '职业': 'Linux运维工程师', '爱好': [ '看书', '学习', '加班' ] },
	  '李四': { '年龄': 20, '职业': 'Java开发工程师', '爱好': [ '开源技术', '微服务', '分布式存 储' ] } } 
} 

json特点
json 不能注释
json 可读性较差
json 语法很严格
比较适用于API 返回值,也可用于配置文件

yaml格式
在这里插入图片描述

yaml文件主要特性

k8s中的yaml文件以及其他场景的yaml文件,大部分都是以下类型

在这里插入图片描述

3. yaml文件详解

`在这里插入图片描述

-表示列表 ,可以有多个
在这里插入图片描述

分隔符

在这里插入图片描述
在这里插入图片描述

#test-pod 
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中   
kind: Pod #指定创建资源的角色/类型   
metadata: #资源的元数据/属性   
  name: test-pod #资源的名字,在同一个namespace中必须唯一   
  labels: #设定资源的标签 
    k8s-app: apache   
    version: v1   
    kubernetes.io/cluster-service: "true"   
  annotations:            #自定义注解列表   
    - name: String        #自定义注解名字   
spec: #specification of the resource content 指定该资源的内容   
  restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器   
  nodeSelector:     #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1   
    zone: node1   
  containers:   
  - name: test-pod #容器的名字   
    image: 10.192.21.18:5000/test/chat:latest #容器使用的镜像地址   
    imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略, 
                           # Always,每次都检查 
                           # Never,每次都不检查(不管本地是否有) 
                           # IfNotPresent,如果本地有就不检查,如果没有就拉取 
    command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT   
    args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数   
    env: #指定容器中的环境变量   
    - name: str #变量的名字   
      value: "/etc/run.sh" #变量的值   
    resources: #资源管理 
      requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行   
        cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m) 
        memory: 32Mi #内存使用量   
      limits: #资源限制   
        cpu: 0.5   
        memory: 1000Mi   
    ports:   
    - containerPort: 80 #容器开发对外的端口 
      name: httpd  #名称 
      protocol: TCP   
    livenessProbe: #pod内容器健康检查的设置 
      httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常   
        path: / #URI地址   
        port: 80   
        #host: 127.0.0.1 #主机地址   
        scheme: HTTP   
      initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始   
      timeoutSeconds: 5 #检测的超时时间   
      periodSeconds: 15  #检查间隔时间   
      #也可以用这种方法   
      #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常   
      #  command:   
      #    - cat   
      #    - /tmp/health   
      #也可以用这种方法   
      #tcpSocket: //通过tcpSocket检查健康    
      #  port: number    
    lifecycle: #生命周期管理   
      postStart: #容器运行之前运行的任务   
        exec:   
          command:   
            - 'sh'   
            - 'yum upgrade -y'   
      preStop:#容器关闭之前运行的任务   
        exec:   
          command: ['service httpd stop']   
    volumeMounts:  #挂载持久存储卷 
    - name: volume #挂载设备的名字,与volumes[*].name 需要对应     
      mountPath: /data #挂载到容器的某个路径下   
      readOnly: True   
  volumes: #定义一组挂载设备   
  - name: volume #定义一个挂载设备的名字   
    #meptyDir: {}   
    hostPath:   
      path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种 
    #nfs

实例

1.k8s中创建Nginx pod

创建Nginx pod 并测试通过node port访问

Nginx yaml文件:

root@k8s-master1:/opt/k8s-data/yaml/linux36/nginx# cat nginx.yaml 
kind: Deployment 
apiVersion: extensions/v1beta1 
metadata: 
	labels: 
		app: linux36-nginx-deployment-label 
	name: linux36-nginx-deployment 
	namespace: linux36 
spec: 
	replicas: 1 
	selector: 
		matchLabels: 
			app: linux36-nginx-selector 
	template: 
		metadata: 
			labels: 
				app: linux36-nginx-selector 
		spec: 
			containers: 
			- name: linux36-nginx-container 
			  image: harbor.magedu.net/linux36/nginx-web1:v1 
			  #command: ["/apps/tomcat/bin/run_tomcat.sh"] 
			  #imagePullPolicy: IfNotPresent 
			  imagePullPolicy: Always 
			  ports: 
			  - containerPort: 80 
			    protocol: TCP 
			    name: http
			  - containerPort: 443 
			    protocol: TCP 
			    name: https 
			  env: 
			  - name: "password" 
			    value: "123456" 
			  - name: "age" 
			    value: "18" 
			    resources: 
			    	limits:
			    		 cpu: 2
			    		 memory: 2Gi 
			    	requests: 
			    		 cpu: 500m 
			    		 memory: 1Gi


---
kind: Service
apiVersion: v1
metadata:
	labels:
		app: linux36-nginx-service-label
	name: linux36-nginx-service
	namespace: linux36
spec: 
	type: NodePort
	ports:
	- name: http
	  port: 80
	  protocol: TCP
	  targetPort: 80
	  nodePort: 30002
	- name: https
	  port: 443
	  protocol: TCP 
	  targetPort: 443 
	  nodePort: 30443 
	selector:
	  app: linux36-nginx-selector

创建Nginx pod

kubectl apply -f nginx.yaml 

deployment.extensions/linux36-nginx-deployment created 
service/linux36-nginx-spec created

测试访问Nginx web界面

在这里插入图片描述

2.运行tomcat

基于基础的centos镜像,制作公司内部基础镜像–jdk镜像–tomcat基础镜像–tomcat业务镜像:

JDK基础镜像制作

参考
在这里插入图片描述

Dockerfile文件
在这里插入图片描述
打镜像脚本
在这里插入图片描述

验证JDK镜像启动为容器后的java环境
在这里插入图片描述

tomcat基础镜像制作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试访问tomcat基础镜像启动为容器

在这里插入图片描述
在这里插入图片描述

3. 在k8s环境运行tomcat

创建tomcat业务pod

pwd 
/opt/k8s-data/yaml/linux36/tomcat-app1 

kubectl apply -f tomcat-app1.yaml

验证pod启动成功
在这里插入图片描述

在这里插入图片描述

4. k8s中nginx+tomcat实现动静分离

实现一个通用的nginx+tomcat动静分离web架构,即用户访问的静态页面和图片在由nginx直接响应,而动态请求则基于location转发至tomcat

Nginx基于tomcat的service name转发用户请求到tomcat业务app

在这里插入图片描述
nginx配置文件

在这里插入图片描述
重新构建nginx业务镜像

bash build-command.sh

在这里插入图片描述
镜像启动为容容器并验证配置文件
在这里插入图片描述
重新创建业务nginx pod

删除并重新创建nginx业务镜像

在这里插入图片描述
更新nginx业务镜像版本号

重新构建新版本镜像,然后打一个新的tag号,然后通过指定镜像的方式对pod进行更新

准备新版本nginx业务镜像
在这里插入图片描述
获取当前deployment

在这里插入图片描述
执行更新nginx业务镜像版本
在这里插入图片描述

web访问测试------通过nginx访问到tomcat的app项目
在这里插入图片描述

五. 基于NFS实现动静分离

环境
在这里插入图片描述

NFS客户端挂载并测试写入文件
在这里插入图片描述

nginx 业务容器yaml

cat nginx.yaml 
kind: Deployment 
apiVersion: extensions/v1beta1 
metadata: 
  labels: 
    app: linux36-nginx-deployment-label 
  name: linux36-nginx-deployment 
  namespace: linux36 
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: linux36-nginx-selector 
  template: 
    metadata:
      labels: 
        app: linux36-nginx-selector 
      spec: 
        containers: 
        - name: linux36-nginx-container 
          image: harbor.magedu.net/linux36/nginx-web1:v1 
          #command: ["/apps/tomcat/bin/run_tomcat.sh"] 
          #imagePullPolicy: IfNotPresent 
          imagePullPolicy: Always 
          ports: 
          - containerPort: 80 
            protocol: TCP 
            name: http
          - containerPort: 443 
            protocol: TCP 
            name: https 
          env: 
          - name: "password" 
            value: "123456" 
          - name: "age" 
            value: "18" 
          resources: 
            limits: 
              cpu: 2 
              memory: 2Gi 
            requests: 
              cpu: 500m 
              memory: 1Gi 
          volumeMounts: 
          - name: linux36-images 
            mountPath: /usr/local/nginx/html/webapp/images 
            readOnly: false 
          - name: linux36-static 
            mountPath: /usr/local/nginx/html/webapp/static 
            readOnly: false 
        volumes: #kubectl explain Deployment.spec.template.spec.volumes 
        - name: linux36-images
          nfs:
            server: 192.168.7.108 
            path: /data/linux36/images 
        - name: linux36-static 
          nfs:
            server: 192.168.7.108 
            path: /data/linux36/static -

-- 
kind: Service 
apiVersion: v1 
metadata: 
  labels: 
    app: linux36-nginx-service-label 
  name: linux36-nginx-service 
  namespace: linux36 
spec: 
  type: NodePort 
  ports: 
  - name: http 
    port: 80 
    protocol: TCP 
    targetPort: 80 
    nodePort: 30002 
  - name: https 
    port: 443 
    protocol: TCP 
    targetPort: 443 
    nodePort: 30443
  selector: 
    app: linux36-nginx-selector

执行更新yaml文件
在这里插入图片描述
pod中验证NFS挂载

在这里插入图片描述

tomcat业务pod更新挂载

pwd 
/opt/k8s-data/yaml/linux36/tomcat-app1 

cat tomcat-app1.yaml 
kind: Deployment 
apiVersion: extensions/v1beta1 
metadata: 
  labels: 
    app: linux36-tomcat-app1-deployment-label 
  name: linux36-tomcat-app1-deployment 
  namespace: linux36 
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: linux36-tomcat-app1-selector 
  template: 
    metadata: 
      labels: 
        app: linux36-tomcat-app1-selector 
    spec: 
      containers:
      - name: linux36-tomcat-app1-container 
        image: harbor.magedu.net/linux36/tomcat-app1:2019-08-02_11_02_30 
        #command: ["/apps/tomcat/bin/run_tomcat.sh"] 
        #imagePullPolicy: IfNotPresent 
        imagePullPolicy: Always
        ports: 
        - containerPort: 8080 
          protocol: TCP 
          name: http 
        #env: 
        #- name: "password" 
        #  value: "123456" 
        #- name: "age" 
        #  value: "18" 
        #resources: 
        #  limits: 
        # cpu: 4 
        # memory: 4Gi 
        # requests: 
        # cpu: 2 
        # memory: 4Gi 

        volumeMounts: 
        - name: linux36-images 
          mountPath: /data/tomcat/webapps/myapp/images 
          readOnly: false 
        - name: linux36-static 
          mountPath: /data/tomcat/webapps/myapp/static 
          readOnly: false 
      volumes: 
      - name: linux36-images 
        nfs:
          server: 192.168.7.108 
          path: /data/linux36/images 
      - name: linux36-static 
        nfs:
          server: 192.168.7.108 
          path: /data/linux36/static

 --- 
kind: Service 
apiVersion: v1 
metadata: 
  labels: 
    app: linux36-tomcat-app1-service-label 
  name: linux36-tomcat-app1-service 
  namespace: linux36 
spec: 
  type: NodePort 
  ports: 
  - name: http 
    port: 80 
    protocol: TCP
    targetPort: 8080 
    nodePort: 30003 
  selector: 
    app: linux36-tomcat-app1-selector

执行更新tomcat app1业务容器yaml

在这里插入图片描述
在这里插入图片描述
访问nginx 业务pod

上传数据
在这里插入图片描述

http://192.168.7.110:30002/myapp/images/1.jpg
在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值