一、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文件方式