目录
一、服务的生命周期
二、service的类型及之间的区别
1、ClusterIP
2、NodePort
3、 LoadBalancer
4、 externalName
三、发布方式
1、蓝绿发布
①、蓝绿部署概念
②、蓝绿发布步骤
④、蓝绿发布优缺点
2、滚动发布(Rolling Update)
①、滚动发布概念
②、步骤
③、升级数量
3、金丝雀发布
4、实际生产中发布模式
四、Yaml文件详解
1、yaml文件的语法格式要求
2、查看api的资源版本标签
3、手动编写副本控制器nginx-deployment的yaml的文件
4、 创建资源对象
5、创建service服务对外提供访问并测试
五、利用--dry-run=client导出资源配置模板,免除手写
六、K8S中的port
1、port
2、nodePort
3、targetPort
4、containerPort
1、详细版:服务生命周期分为:创建、发布、升级、回滚、删除
简单版:服务从创建到删除过程中,所包含的、经历过的状态
例如:
创建:[root@master ~]# kubectl create deployment nginx --image=nginx:1.15 --port=80 --replicas=3
deployment.apps/nginx created
发布:[root@master ~]# kubectl expose deploy/nginx --port=80 --target-port=80 --name=nginx-servicec --type=NodePor
service/nginx-servicec exposed
升级/更新:[root@master ~]# kubectl set image deploy/nginx nginx=nginx:latest
## 把nginx版本更新到最新版本
回滚:当新版本出现bug时,需要进行回滚,回到之前比较稳定的版本。
回滚的几种执行方式:
### 查看历史版本
[root@master ~]# kubectl rollout history deployment nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
1## 显示的是三个版本
2
3
######################查看当前版本###############[root@master ~]# curl -I 192.168.159.12:32086
HTTP/1.1 200 OK
Server: nginx/1.23.2 ### 版本为1.23.2
Date: Mon, 07 Nov 2022 08:45:49 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 19 Oct 2022 07:56:21 GMT
Connection: keep-alive
ETag: "634fada5-267"
Accept-Ranges: bytes
############################# 执行回滚到上一个版本
[root@master ~]# kubectl rollout undo deployment nginx
deployment.apps/nginx rolled back
[root@master ~]# curl -I 192.168.159.12:32086
HTTP/1.1 200 OK
Server: nginx/1.15.12 #### 版本号:1.15.12
Date: Mon, 07 Nov 2022 08:47:29 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
Connection: keep-alive
ETag: "5cb5d3c3-264"
Accept-Ranges: bytes### 执行回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1
[root@master ~]# kubectl rollout history deployment nginx ### 查看当前的版本历史
deployment.apps/nginx
REVISION CHANGE-CAUSE
1
4
5[root@master ~]# curl -I 192.168.159.12:32086 ## 查看当前版本号
HTTP/1.1 200 OK
Server: nginx/1.23.2
Date: Mon, 07 Nov 2022 08:55:43 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 19 Oct 2022 07:56:21 GMT
Connection: keep-alive
ETag: "634fada5-267"
Accept-Ranges: bytes[root@master ~]# kubectl rollout undo deployment nginx --to-revision=1更新到指定版本
deployment.apps/nginx rolled back
[root@master ~]# curl -I 192.168.159.12:32086 ### 查看版本号
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 07 Nov 2022 08:56:04 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 04 Dec 2018 14:44:49 GMT
Connection: keep-alive
ETag: "5c0692e1-264"
Accept-Ranges: bytes
### 检查回滚状态
kubectl rollout status deployment/nginx
[root@master ~]# kubectl rollout status deployment nginx
deployment "nginx" successfully rolled out ## 显示回滚成功
删除:kubectl delete
### 删除副本控制器
kubectl delete deployment/nginx
### 删除service
kubectl delete svc nginx-service
#######################删除副本控制器及service#################
[root@master ~]# kubectl get svc,pods ### 查询副本集控制器和pods
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.125.0.1443/TCP 2d7h
service/nginx-service NodePort 10.125.171.9980:32086/TCP 18m NAME READY STATUS RESTARTS AGE
pod/nginx-d9d8cf5c7-8p66v 1/1 Running 0 5m42s
pod/nginx-d9d8cf5c7-vlq5x 1/1 Running 0 5m40s
pod/nginx-d9d8cf5c7-wr8fj 1/1 Running 0 5m41s
[root@master ~]# kubectl delete deployment nginx ### 删除副本集控制器
deployment.apps "nginx" deleted
[root@master ~]# kubectl delete svc nginx-service ### 删除service
service "nginx-service" deleted
[root@master ~]# kubectl get svc,pods ## 查询显示已经删除
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.125.0.1443/TCP 2d7h
提供一个集群内部的虚拟IP以供Pod访问(service默认类型)
类似于VIP,通过负载均衡,把请求发送到后端不一样的pod上。
在每个Node上打开一个端口以供外部访问,Kubernetes将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过 NodeIp:NodePort 的方式Kubernetes集群外部的程序可以访问Service。
每个端口只能是一种服务,端口范围只能是 30000-32767。
通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。接收请求后会自己创建一个LB。为后台pod进行业务分法。
这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。
在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。
将service名称映射到一个DNS域名上,相当于DNS服务的CNAME记录,用于让Pod去访问集群外部的资源,它本身没有绑定任何的资源。
蓝绿部署中,一共有两套系统:一套是正在提供服务系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。且两套系统都是功能完善的、正在运行的系统,只是系统版本和对外服务情况不同。
1、首先对蓝组进行新版本的部署。绿组仍然继续提供服务;
2、蓝组上线试运行,完成试运行后,蓝组替换绿组变成绿组,此间二者同存,防止新版本有问题,能够及时回滚,在成熟以后会删除。
优点:更新过程无需停机,用户无感知,平滑过渡
回滚方便速度快
发布策略简单
通过LB来实现流量控制,比如Nginx
缺点:成本较高,需要部署两套环境
需要部署两套机器,费用开销大
先启动一台新服务器运行新版本,加入生产环境。
然后停止一台老版本服务器,将其更新为新版本,然后加入生产环境。
依此类推,直到集群中全部服务器升级为新版本。
先升级1个副本,主要做部署验证;
每次升级副本,自动从LB上摘掉,升级成功后自动加入集群;
事先需要有自动更新策略,分为若干次,每次数量/百分比可配置;
回滚是发布的逆过程,先从LB摘掉新版本,再升级老版本,这个过程一般时间比较长;
自动化要求高。
每次可升级一台,或重新顶一个步长,每次不超过25%
在生产环境上引一部分实际流量对一个新版本进行测试,测试新版本的性能和表现,在保证系统整体稳定运行的前提下,尽早发现新版本在实际环境上的问题。
如果新旧版本没有兼容性问题的话,一版会选择滚动发布
新旧版本兼容性有问题的话,一般选择蓝绿发布,配合金丝雀,提高安全性
①、大小写敏感
②、使用缩进表示层级关系
③、不支持Tab键制表符缩进,只使用空格缩进
④、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
⑤、符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
⑥、“---”表示YAML格式,一个文件的开始,用于分隔文件间
⑦、“#”表示注释
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
[root@master opt]# vim nginx-deployment.yaml
[root@master opt]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
解析:
[root@master opt]# kubectl apply -f nginx-deployment.yaml
[root@master opt]# vim nginx-service.yaml
[root@master opt]# kubectl apply -f nginx-service.yaml ### 创建资源对象
[root@master opt]# kubectl apply -f nginx-service.yaml
service/nginx-service created
验证: 查看svc及pods
[root@master opt]# kubectl get svc,pods -o wide
UI访问
port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service
nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service
targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器
containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort