云原生Kubernetes之浅认知

目录

一、服务的生命周期

二、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.1              443/TCP        2d7h
service/nginx-service   NodePort    10.125.171.99          80: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.1          443/TCP   2d7h

二、service的类型及之间的区别

1、ClusterIP

提供一个集群内部的虚拟IP以供Pod访问(service默认类型)

类似于VIP,通过负载均衡,把请求发送到后端不一样的pod上。

云原生Kubernetes之浅认知_第1张图片

2、NodePort

在每个Node上打开一个端口以供外部访问,Kubernetes将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过 NodeIp:NodePort 的方式Kubernetes集群外部的程序可以访问Service。
每个端口只能是一种服务,端口范围只能是 30000-32767。

云原生Kubernetes之浅认知_第2张图片

3、 LoadBalancer

通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。接收请求后会自己创建一个LB。为后台pod进行业务分法。

这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。
在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

云原生Kubernetes之浅认知_第3张图片

4、externalName

将service名称映射到一个DNS域名上,相当于DNS服务的CNAME记录,用于让Pod去访问集群外部的资源,它本身没有绑定任何的资源。

三、发布方式

1、蓝绿发布

①、蓝绿部署概念

蓝绿部署中,一共有两套系统:一套是正在提供服务系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。且两套系统都是功能完善的、正在运行的系统,只是系统版本和对外服务情况不同。

②、蓝绿发布步骤

1、首先对蓝组进行新版本的部署。绿组仍然继续提供服务;

2、蓝组上线试运行,完成试运行后,蓝组替换绿组变成绿组,此间二者同存,防止新版本有问题,能够及时回滚,在成熟以后会删除。

云原生Kubernetes之浅认知_第4张图片

④、蓝绿发布优缺点

优点:更新过程无需停机,用户无感知,平滑过渡

           回滚方便速度快

           发布策略简单

           通过LB来实现流量控制,比如Nginx

缺点:成本较高,需要部署两套环境

           需要部署两套机器,费用开销大           

2、滚动发布(Rolling Update)

①、滚动发布概念

先启动一台新服务器运行新版本,加入生产环境。

然后停止一台老版本服务器,将其更新为新版本,然后加入生产环境。

依此类推,直到集群中全部服务器升级为新版本。

云原生Kubernetes之浅认知_第5张图片

②、步骤

  1. 先升级1个副本,主要做部署验证;

  2. 每次升级副本,自动从LB上摘掉,升级成功后自动加入集群;

  3. 事先需要有自动更新策略,分为若干次,每次数量/百分比可配置;

  4. 回滚是发布的逆过程,先从LB摘掉新版本,再升级老版本,这个过程一般时间比较长;

  5. 自动化要求高。

③、升级数量

每次可升级一台,或重新顶一个步长,每次不超过25%

3、金丝雀发布

在生产环境上引一部分实际流量对一个新版本进行测试,测试新版本的性能和表现,在保证系统整体稳定运行的前提下,尽早发现新版本在实际环境上的问题。

4、实际生产中发布模式

如果新旧版本没有兼容性问题的话,一版会选择滚动发布

新旧版本兼容性有问题的话,一般选择蓝绿发布,配合金丝雀,提高安全性

四、Yaml文件详解

1、yaml文件的语法格式要求

①、大小写敏感

②、使用缩进表示层级关系

③、不支持Tab键制表符缩进,只使用空格缩进

④、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格

⑤、符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等

⑥、“---”表示YAML格式,一个文件的开始,用于分隔文件间

⑦、“#”表示注释

2、查看api的资源版本标签

[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

3、手动编写副本控制器nginx-deployment的yaml的文件

[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

解析:

云原生Kubernetes之浅认知_第6张图片

4、 创建资源对象

[root@master opt]# kubectl apply -f nginx-deployment.yaml

云原生Kubernetes之浅认知_第7张图片

 5、创建service服务对外提供访问并测试

 [root@master opt]# vim nginx-service.yaml

云原生Kubernetes之浅认知_第8张图片

[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

云原生Kubernetes之浅认知_第9张图片

UI访问

云原生Kubernetes之浅认知_第10张图片

五、利用--dry-run=client导出资源配置模板,免除手写

云原生Kubernetes之浅认知_第11张图片

云原生Kubernetes之浅认知_第12张图片 ps:还可以转译成json格式

六、K8S中的port

1、port

port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service

2、nodePort

nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service

3、targetPort

targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器

4、containerPort

containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort

你可能感兴趣的:(k8s,运维,linux基础,kubernetes,云原生,linux)