K8S 快速入门(九)实战篇:指令部署、yaml方式部署

一、k8s资源指令

1. 常用命令

# 查看k8s帮助文档 ----- 查询所有的指令
kubectl --help

# 查询节点信息(状态)
kubectl get node #查询集群节点的信息
kubectl get node -o wide #查询节点的详细信息
kubectl get nodes
#注意:查询节点信息,Status:Ready 表示集群节点运行ok。

# 查询pod(k8s最小的操作单元)对象指令
kubectl get pod #查询pod信息,没有指定命令空间,默认查询的命名空间是 default,
				#注意:kube-system 系统命名空间,此空间内运行的是k8s系统所需的pod.(scheduler,etcd,apiserver..)
kubectl get pod -o wide #查询pod的详细信息
kubectl get pod -o wide -n kube-system #查询指定命名空间下的pod,pod是通过命名空间进行隔离。
kubectl get pods
kubectl describe pod [pod名称] #查看pod详情
kubectl delete pod [pod名称] # 删除pod: 
kubectl delete pod --all # 删除所有pod: 


# 查询 ReplicaSet -- 副本控制器对象
kubectl get rs
kubectl get rs -o wide
# 查询 Deployment -- 查询部署对象
kubectl get deployment
kubectl get deployment -o wide
kubectl get deployments
kubectl delete deployment [Deployment名称]
# 查询service
kubectl get svc
kubectl get svc -o wide

# 创建且运行一个pod,my-nginx是deployment的name
kubectl run my-nginx --image=nginx --port=80 #deployment、rs、pod被自动创建
# 增加创建副本数量
kubectl scale deployment/my-nginx --replicas=3 #设置副本数量为3
# 另一种写法:
kubectl scale deployment my-nginx --replicas=3
#添加service
kubectl expose deployment my-nginx --port=3000 --target-port=80 
kubectl edit svc my-nginx  #编辑service服务的yaml配置文件
kubectl delete service [service名称]

# 查询某个容器的日志
kubectl log deploymentName -c containName

2. 命令手册

kubenetes命令手册,详情请查询下表:

类型 命令 描述
基础命令 create 通过文件名或标准输入创建资源
ecpose 将一个资源公开为一个新的Service
run 在集群中运行一个特定的镜像
set 在对象上设置特定的功能
get 显示一个或多个资源
explain 文档参考资料
edit 使用默认的编辑器编辑一个资源
delete 通过文件名,标准输入,资源名称或者标签选择器来删除资源
部署命令 rollout 管理资源的发布
rolling-update 对给定的复制控制器滚动更新
scale 扩容会缩容Pod数量,Deployment,ReplicaSet,RC或Job
autoscale 创建一个自动选择扩容或缩容并设置Pod数量
集群管理命令 certificate 修改证书资源
cluster-info 显示集群信息
top 显示资源(CPU/Memory/Storage)使用,需要Heapster运行
cordon 标记节点不可调
uncordon 标记节点可调度
drain 驱逐节点上的应用,准备下线维护
taint 修改节点taint标记
故障诊断和调试命令 describe 显示特定资源或资源组的详细信息
logs 在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的
attach 附加到一个运行的容器
exec 执行命令到容器
port-forward 转发一个或多个本地端口到一个pod
proxy 运行一个proxy到Kubernetes API server
cp 拷贝文件或者目录到容器中
auth 检查授权
高级命令 apply 通过文件名或标准输入对资源应用配置
patch 使用补丁修改,更新资源的字段
replace 通过文件名或标准输入替换一个资源
convert 不同的API版本之间转换配置文件
设置命令 label 更新资源上的标签
annotate 更新资源上的注释
completion 用于实现kubectl工具自动补全
其他命令 api-versions 打印受支持的API 版本
config 修改kubeconfig文件(用于访问API,比如配置认证信息)
help 所有命令帮助
plugin 运行一个命令插件
version 打印客户端和服务版本信息

二、资源清单

1. YAML语法规范

YAML是专注于写配置文件的语言,这个名字的含义是YAML Ain’t Markup Language(YAML不是一种标记语言),但是实际上YAML还是一种标记语言,只不过是更加聚焦于数据的标记语言。参考了YAML官网

YAML的基本语法规则

  • 1.大小写敏感
  • 2.使用缩进表示层级关系(这个和Python很像了,估计是从Python借鉴的)
    缩进时绝对不允许使用Tab键,只允许使用空格键
    缩进的空格数不重要,只要元素左侧能对齐就可以。
    字符串可以不用引号标注

YAML完全兼容Json的语法,可以把Json看做是YAML的一个子集

我们来看一下YAML支持的数据类型

  • 对象:就是键值对的集合,和Json中对象的概念一样
  • 列表:又称为序列,是一组有序排列的值,和Json中列表的概念一样
  • scalars(纯量):不可拆分的数据类型,和Json中的基本数据类型一样

来看一下YAML具体的语法。

  • 在一个yml文件中,使用---来表示一段文档(或者一组配置)的开始,使用...来表示一段文档的结束。如果yml中只有一组配置,则可以省略掉---.

  • 使用#来表示注解

  • 使用-来表示单个的列表项,比如

    - A
    - B
    - C
    

    对应Json中的[ 'A', 'B', 'C' ]

    -
      - A
      - B
      - C
    -
      - D
      - E
      - F
    

    对应于Json的[ [ 'A', 'B', 'C' ], [ 'D', 'E', 'F' ] ]

    尤其是要注意,由于YAML兼容Json的语法,所以我们直接在yml文件中写[ [ A, B, C ], [ D, E, F ] ]也是可以的。

  • 使用:来表示键值对

    name: chico
    age: 18
    

    对应Json的{ name: 'chico', age: 18 }

    -
      name: chico
      age: 18
    -
      name: dong
      age: 19
    

    对应Json中的[ { name: 'chico', age: 18 }, { name: 'dong', age: 19 } ]

    看一个将列表和对象结合起来的

    american:
      - Boston Red Sox
      - Detroit Tigers
      - New York Yankees
    national:
      - New York Mets
      - Chicago Cubs
      - Atlanta Braves
    

    对应Json { american: [ 'Boston Red Sox', 'Detroit Tigers', 'New York Yankees' ], national: [ 'New York Mets', 'Chicago Cubs', 'Atlanta Braves' ] }

  • 与Json不同的是,YAML中键值对的键不要求一定是字符串,可以是一些复杂的类型,但是Json中要求键值对的键必须是字符串。

    当YAML中键值对的键是复杂类型的时候,必须要用?说明,比如

    ?[a,b,c]:color
    #或者
    ?-a
    -b
    -c
    :color
    
  • YAML中null~表示
    比如money:~

  • YAML中段落用|和缩进表示,YAML会保留该段落中的回车换行符,比如

    description: |
    #注意:和 |之间的空格
      这是一篇非常非常长的介绍YAML的文章
      文章是非常有内容的
    
  • YAML中用>和缩进表示把段落连城一句话,YAML会把该段落中的回车换行替换成空格,最终连成一句话

    description: >
      这是一篇介绍YAML的文章,非常长
      但是把他们连成一句话了
    
  • YAML中+表示保留段落末尾的换行,-表示删除文本末尾的换行

    a: |+
      保留了换行符
    
    b: |-
      删除了换行符
    
  • YAML中也会把"双引号和'单引号中的字符串连成一行,引号中可以包含转义字符
    单引号:会转义特殊字符,特殊字符终只是一个普通的字符串数据
    双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

    description:
      "虽然表面上看这是两行,
      但其实是一行"
    #和下面这个是一样的
    description:
      虽然表面上看这是两行,
      但其实是一行
    
  • YAML中使用!!!来做强制类型转换,比如

    #强行把123转换成str
    e:!!str 123
    #强行把boolean型转换为str
    b:!!str true
    
  • YAML中可以通过&来锚点,通过*来引用

    s1:
      name: chico
      favourite: &SS reading
    s2:
      name: dong
      favourite: *SS
    
  • <<表示追加,比如

    default: &default
      host: http
      path:index
    server1:
      name:server1
      <<:*default
    server2:
      name:server2
      <<:*default
    

    等价于

    default: &default
      host: http
      path:index
    server1:
      name:server1
      host: http
      path:index
    server2:
      name:server2
      host: http
      path:index
    
  • YAML还支持set和ordered map
    在YAML中set就是一组值全部为null的键值对,比如

    --- !!set #强行转换为set
    ? hahaha
    ? chico dong
    ? haha lala
    

    对应的json是{ hahaha: null, 'chico dong': null, 'haha lala': null }

    在YAML中ordered map就是一组有序的键值对(可以认为是放在list中的键值对),
    比如

    --- !!omap #强行转换为有序键值对
    - hahaha: haha
    - chico dong: dong
    - lala: "haha lala"
    

    对应的Json为[ { hahaha: 'haha' }, { 'chico dong': 'dong' }, { lala: 'haha lala' } ]
    感觉这个和正常的yaml嵌套写法没什么区别

2. 资源清单

2.1 required

必须存在的属性【创建资源清单的时候没有这些属性的存在它是不允许被执行的】

参数名称 字段类型 说明
version String 这里是指的是K8SAPI的版本,目前基本上是v1,可以用kubectl api-version命令查询
kind String 这里指的是yam文件定义的资源类型和角色,比如:Pod
metadata Object 元数据对象,固定值就写metadata
metadata.name String 元数据对象的名字,这里由我们编写,比如命名Pod的名字
metadata.namespace String 元数据对象的命名空间,由我们自身定义,如果不定义的话则默认是default名称空间
spec Object 详细定义对象,固定值就写Spec
spec.containers[] List 这里是Spec对象的容器列表定义,是个列表
spec.containers[].name String 这里定义容器的名字
spec.containers[].image String 这里定义要用到的镜像名称

2.2 optional

主要属性【这些属性比较重要,如果不指定的话系统会自动补充默认值】

参数名称 字段类型 说明
spec.containers[].name String 这里定义容器的名字
spec.containers[].image String 这里定义要用到的镜像名称
spec.containers[].imagePullPolicy String 定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选
(1)Always:意思是每次都尝试重新拉取镜像
(2)Never:表示仅使用本地镜像
(3)lfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。上面三个值都没设置的话,默认是Always。
spec.containers[].command[] List 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[] List 指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDir String 指定容器的工作目录,进入容器时默认所在的目录
spec.containers[].volumeMounts[] List 指定容器内部的存储卷配置
spec.containers[].volumeMounts[].name String 指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPath String 指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnly String 设置存储卷路经的读写模式,true或者false,默认为读写模式
spec.containers[].ports[] List 指定容器需要用到的端口列表
spec.containers[].ports[].name String 指定端口名称
spec.containers[].ports[].containerPort String 指定容器需要监听的端口号
spec.containers[].ports[].hostPort String 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocol String 指定端口协议,支持TCP和UDP,默认值为 TCP
spec.containers[].env[] List 指定容器运行前需设置的环境变量列表
spec.containers[].env[].name String 指定环境变量名称
spec.containers[].env[].value String 指定环境变量值
spec.containers[].resources Object 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limits Object 指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpu String 指定CPU的限制,单位为core数,将用于docker run --cpu-shares参数这里前面文章 Pod资源限制有讲过)
spec.containers[].resources.limits.memory String 指定MEM内存的限制,单位为MlB、GiB
spec.containers[].resources.requests Object 指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpu String CPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memory String 内存请求,单位为MIB、GiB,容器启动的初始化可用数量

2.3 other

额外的的一些属性。

参数名称 字段类型 说明
spec.restartPolicy String 定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。
1.Always:Pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。
2.OnFailure:只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它。
3.Never:Pod终止后,kubelet将退出码报告给Master,不会重启该Pod。
spec.nodeSelector Object 定义Node的Label过滤标签,以key:value格式指定,选择node节点去运行
spec.imagePullSecrets Object 定义pull镜像时使用secret名称,以name:secretkey格式指定
spec.hostNetwork Boolean 定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker0网桥,同时设置了true将无法在同一台宿主机上启动第二个副本。

查看资源有哪些资源清单属性,使用以下命令

# 查询所有的资源清单资源
kubectl explain pod
# 查看指定属性
kubectl explain pod.apiVersion

3. 资源清单格式

#如果没有给定group名称,那么默认为core,可以使用kubectlapi-versions命令获取当前k8s版本上所有的apiversion版本信息(每个版本可能不同)
apiVersion: group/apiversion
#资源类别,比如:Pod / Service / Deployment
#代表要创建K8S对应的资源类型
kind: Pod
#资源元数据
metadata: 
  name: 
  namespace: 
  lables: 
  annotations: #主要目的是方便用户阅读查找
spec: #期望的状态(disired state),比如副本有多少个...
status: #当前状态,本字段由Kubernetes自身维护,用户不能去定义

4. 常用命令

#获取apiVersion版本信息
kubectl api-versions
#获取资源的apiVersion的版本信息(以pod为例),该命令同时输出属性设置帮助文档
kubectl explain pod

# 字段配置格式说明
apiVersion <string> #表示字符串类型 
metadata <Object> #表示需要嵌套多层字段
1abels <map[string]string> #表示由k:v组成的映射 
finalizers <[]string> #表示字串列表 
ownerReferences <[]Object>#表示对象列表 
hostPID <boolean> #布尔类型 
priority <integer> #整型 
name <string> -required- #如果类型后面接-required-,表示为必填字段

#通过yaml文件创建pod
kubectl create -f xxx.yaml
kubectl apply -f xx.yaml 

#使用 -o 参数 加 yaml,可以将资源的配置以yaml的格式输出出来,也可以使用json,输出为json格式
kubectl get pod {
    
    podName} -o yaml

kubectl run 和kubectl apply -f有什么区别

  • Kubectl run 是创建pod的指令,注意是指令,也就是说是通过命令的方式创建deployment,rs,pod等等其他资源
  • Kubectl apply -f 表示对yaml资源文件的应用创建
  • Kubeclt create -f 和 apply是等同的效果,只不过apply除了创建以外,实际上还有更新动作,当配置文件发生改变时候,需要重新执行yaml文件,可以使用apply

在这里插入图片描述

三、实战演示

1. 指令部署

1.1 镜像部署

部署镜像命令:

kubectl run deploymentName --image=镜像地址 --port=80
# port是暴露容器端口,此处仅仅是暴露端口,不同于docker中的-p,若不暴露,也能访问

记录指令过程:

  • 创建pod(部署服务) : kubectl run myapp --image=ikubernetes/myapp:v1 --port=80
  • 查询pod创建详细信息: kubectl describe pod myapp-554864fdf4-f4gw9
  • 查询pod: kubectl get pod
  • 查询pod详细信息: kubectl get pod -o wide -n kube-system (-n 指定命名空间)

在这里插入图片描述

Myapp镜像里面就是一个nginx,用来测试

在这里插入图片描述
查询pod创建详细信息
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

pod创建成功

查看pod详细信息:
在这里插入图片描述

可以看到pod是运行在node1节点上,我们查看node1节点上的镜像:
在这里插入图片描述

在node1上访问,curl,看到访问成功,此时是局域网访问:
在这里插入图片描述

Kubectl run指令执行后创建的资源对象拓扑图:
在这里插入图片描述

myapp不是pod名称是deployment部署对象名称

Kubectl run 首先创建deployment对象,kubectl run 指令执行后创建了3个资源对象(deployment,rs,pod)
注意: 上面这条指令没有指定副本数量,默认创建了1个pod。

验证是否创建了3个资源对象:

在这里插入图片描述

可以看到他们之间名字的关联性

1.2 扩容

扩容指令:

kubectl scale deployment myapp --replicas=4
kubectl scale deployment/myapp --replicas=4 #写法二,/的方式

在这里插入图片描述

master节点是不会创建pod的,只用来做集群的管理

执行扩容指令后: 发现其中2个pod已经快速Running状态,其他2个一直在ContainerCreating,什么原因???
在这里插入图片描述

Pod创建慢的原因在于:node节点没有镜像,需要下载镜像,下载镜像比较耗时,因此pod创建需要花费更多时间。
在这里插入图片描述

扩容由调度器负责,流程如上图,需要创建4个pod,把2个分配在node1节点,2个分配在node2节点

过一段时间后,镜像下载完毕,pod立马创建成功。
在这里插入图片描述
扩展: 互联网项目瞬时流量增大,可以使用指令进行一键式扩容,非常简单,方便。

1.3 自愈

K8s管理的pod不仅仅可以一键式部署,一键式扩容,同时k8s管理的pod还具有自愈能力。也就是说当pod发生故障,宕机,k8s将会自动对pod件重建,因此k8s的pod的副本永远处于高可用状态。

试验: 删除所有的pod,查看pod是否还存在: kubectl delete pod –all

问题:

  • 1、删除所有的pod后,pod还在否? 存在,k8s会立马的pod进行重建。
  • 2、如果pod还存在,还是不是原来的pod ? 不是原来的pod,这些pod都是k8s重新创建的。

可以发现,重新创建的pod 和 旧的pod 名称、ip都是不一样的,由此可见都是新的pod
在这里插入图片描述

1.4 负载均衡

Pod有多个副本,访问pod副本就需要通过负载均衡的方式访问,而负载均衡访问是通过service来实现的。因此对一组pod副本创建一个service,来实现负载均衡。

对一组pod副本创建service,指令:

#kubectl expose deployment deployment的名字 --port=service的端口 --target-port=目标port端口
kubectl expose deployment myapp --port=30000 --target-port=80
kubectl expose deployment\myapp --port=30000 --target-port=80
# 为什么是80,因为我们pod中的nginx,默认端口就是80

记录:

  • kubectl expose deployment myapp --port=30000 --target-port=80
  • kubectl get svc

在这里插入图片描述

在这里插入图片描述

发现service资源对象已经创建成功,可以通过service访问pod.service作为4个pod副本访问的统一入口,来对pod副本进行负载均衡。
在这里插入图片描述

问题: 此时service访问pod到底采用什么样负载策略??
在这里插入图片描述

通过测试发现,k8s默认使用轮询策略。

Ip地址的映射规则:
  Service IP :
    10.110.75.152:30000
      -> 10.244.2.5:80
      -> 10.244.2.6:80
      -> 10.244.1.5:80
      -> 10.244.1.6:80

Service 通过ip 进行转发请求,然后通过iptables 负载均衡策略,默认使用轮询策略进行负载均衡。

1.5 Dns

构建k8s集群的时候,已经安装了dns组件,dns(域名解析服务器,根据域名解析出真实ip地址,通过dns可以通过服务名进行相互的访问)
在这里插入图片描述

试验: 登录pod内部容器,在容器内部使用服务名称进行连接,查询是否能联通??

登录容器:

# 1、
kubectl exec -it myapp-554864fdf4-6svpw -- sh
# 2、
wget myapp:30000(service名称)  
# 测试通过,说明可以通过服务名称,访问到外部网络,因此dns服务器是ok的。

在这里插入图片描述

在这里插入图片描述

Dns解析域名流程:
在这里插入图片描述

1.先将域名交给dns解析,得到ip地址10.110.75.152
2.通过虚拟网卡发起请求
3.发现该地址和自己ip不在一个网段,转发给本地网段中网桥
4.网桥转发给Service,Service根据映射关系再路由到对应的节点上的pod(底层通过iptables实现)

关于pod地址的分配:

Kubernetes 会为节点分配相应较小的 CIDR 地址块。该地址块始终包含至少两倍于每个节点的最大 Pod 数量的地址数量。下表为 Kubernetes 根据每个节点的最大 Pod 数量分配给每个节点的 CIDR 地址块的大小:

每个节点的最大 Pod 数量 每个节点的 CIDR 范围
8 /28 32-28 = 4 (后4位才作为pod的ip地址,子网划分)
9 至 16 /27
17 至 32 /26
33 至 64 /25
65 至 110 /24

service 和 dns的关系

在kubernetes中,所有的Service和Pod都会被分配一条对应的DNS A记录( 通过域名解析到IP地址的记录 )

  • 1)创建普通service 会以my-svc.my-namespace.svc.cluster.local 的形式指派一个 DNS A(Address) 记录,并解析到该service的Cluster IP。

    登陆到pod内部,service的域名配置:
    在这里插入图片描述
    DNS的域名配置:
    在这里插入图片描述

  • 2)创建“Headless” Service(没有Cluster IP)也会以 my-svc.my-namespace.svc.cluster.local 的形式被指派一个 DNS A 记录,但是并不会解析到的Cluster IP,而是解析到一组被选中的pod 的IP,如果没有backend则不做处理。

    对于ClusterIP模式的Service来说,它代理的Pod被自动分配的A记录的格是:PodIP.mynamespace.pod.cluster.local 这条记录指向Pod的IP地址

    让pod和pod之间通过域名通信:
    在这里插入图片描述

    看到两个网段都可以:
    在这里插入图片描述
    由此可见,DNS不仅给Service进行域名分配,也给pod进行域名分配

    通过pod的name直接访问也可以
    在这里插入图片描述

ipvsadm命令失效问题:

需要做一些配置才能把关系显示出来:Kubernetes 当中启用IPVS模式
kubectl edit configmap kube-proxy -n kube-system 修改configmap资源对象,修改为ipvs模式。
在这里插入图片描述

ipvsadm命令查询serviceIP和podIP映射关系
在这里插入图片描述

1.6 外网访问

Service 和pod 之间的通信都属于局域网通信访问。无法对外网直接提供服务,service是一个虚拟化的概念,是一个虚拟IP地址,没有与之对应的物理硬件资源,无法直接对外网提供服务,必须借助于物理硬件资源进行数据包转发。
在这里插入图片描述

指令:

#编辑service对应资源对象配置文件,通过修改ip类型,来绑定物理端口。
kubectl edit svc myapp

在这里插入图片描述

可以发现30414就是我们所开辟物理端口,此端口可以在配置文件中自定义,也可以默认即可,默认端口范围:30000 – 32767
在这里插入图片描述

此时就可以通过物理ip+物理端口访问pod内部服务
在这里插入图片描述

1.7 滚动更新

项目迭代,不停的发布新的版本,如何实现不停机更新。一键式更新操作
一键式更新:

kubectl set image deployment myapp myapp=新的镜像版本

在这里插入图片描述

在这里插入图片描述

滚动更新,发现访问时候,已经是v2版本的服务。
在这里插入图片描述

2. YAML方式部署

资源清单可以理解为配置属性

2.1 编写yaml文件流程

编写yaml配置文件部署服务包括:

  • 1. deployment配置
    • 资源对象定义区(deployment,statefulset)
    • rs资源对象定义区
    • pod资源对象定义区
  • 2. service配置
    • service对象定义
    • 选择器—和pod进行关联

2.2 Nignx镜像部署:

在这里插入图片描述

记录一个v1以后,就只会使用本地的镜像了

在这里插入图片描述

2.2.1 Deployment配置: 三个部分

1、资源对象定义区(deployment,statefulset)

apiVersion: apps/v1 # 自定义
kind: Deployment
metadata: #用元数据对Deployment做描述
  name: nginx-deployment
  namespace: default # 默认就是default,可以不写

2、rs资源对象定义区

# 紧接上面
spec:
  replicas: 3 # rs控制副本数量,指定副本数量为3
  selector: # 定义选择器
    matchLabels: #匹配的标签,下面定义了3个标签,将会选择有这些标签的pod
      app: mynginx
      release: stable
      env: test

3、pod资源对象定义区

# 紧接上面
  template:
    metadata:
      labels: #定义标签,要和上面selector的matchLabels保持一直,否则关联不起来
        app: mynginx
        release: stable
        env: test
  spec:
    containers: # 定义pod中的容器,一个pod可以运行多个容器
    - name: my-nginx
      image: nginx:v1
      imagePullPolicy: IfNotPresent #镜像拉取策略,从资源清单可以看到这些配置
      ports:
      - name: http
        containerPort: 80 #指定容器运行的端口

deployment资源对象部署:配置文件描述:
在这里插入图片描述

使用yaml部署:
在这里插入图片描述

访问nginx:
在这里插入图片描述

2.2.2 Service配置文件

  • service对象定义
  • 选择器—和pod进行关联

在这里插入图片描述

apiVersion: v1 #所有资源文件一开始都要设置apiVersion
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  type: ClusterIP
  selector:
    app: mynginx
    release: stable
    env: test
  ports:
  - name: http
    port: 80 #service端口
    targetPort: 80 #访问的目标端口

service 定义,service 和pod关联关系。
在这里插入图片描述

创建并通过service访问:
在这里插入图片描述

实际工作中部署方式:

  • 1、可视化界面部署方式(rancher, dashboard)
  • 2、指令方式
  • 3、yaml文件方式

猜你喜欢

转载自blog.csdn.net/weixin_41947378/article/details/111080663