基于k8s实现动态弹性伸缩 动态的回滚和滚动更新

K8S:

K8S是一个使用 Docker 容器进行编排的系统,主要围绕 pods 进行工作。 Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。
k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

pod生命周期:创建 —>> 发布 —>> 更新 —>> 回滚 —>> 删除

今天用一个小例子实现一下k8s的动态弹性伸缩 动态的回滚和滚动更新,及负载均衡的功能。

构建 namespace

touch namespase.yaml
vim namespase.yaml
apiVersion: v1 #类型为Namespace
kind: Namespace  #类型为Namespace
metadata:
  name: ssx-nginx-ns  #命名空间名称
  labels:
    name: lb-ssx-nginx-ns  

k8s的创建命令:
kubectl create
如果不存在则创建,如果存在,则报错
kubectl apply
如果不存在则创建,如果存在,则更新

kubectl create -f namespase.yaml

在这里插入图片描述
查看空间:

kubectl get ns

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第1张图片
前四个是系统默认的,最后是一个是我们新增的。

创建pod控制器(deployment)yaml配置文件

kubernetes通过Deployment和ReplicaSet(rs)管理多个Pod。

touch deployment.yaml
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx #为该Deployment设置key为app,value为nginx的标签
  name: ssx-nginx-dm
  namespace: ssx-nginx-ns
spec:
  replicas: 2 #副本数
  selector: #标签选择器,与上面的标签共同作用
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template: #这是选择或创建的Pod的模板
    metadata: #Pod的元数据
      labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec: #期望Pod实现的功能(即在pod中部署)
      containers: #生成container,与docker中的container是同一种
      - name: ssx-nginx-c
        image: nginx:latest #使用镜像nginx: 创建container,该container默认80端口可访问
        ports:
        - containerPort: 80  # 开启本容器的80端口可访问

kubectl create -f deployment.yaml

在这里插入图片描述
如果不指定命名空间就会去查默认的命名空间,所以最好带上命名空间 -n 自己的空间。

查看所有pod

kubectl get pod -n ssx-nginx-ns

在这里插入图片描述
根据配置文件中 replicas: 2 #副本数 参数这里看到我们启动了两个容器。

kubectl describe:查看特定资源或资源组的详细信息

kubectl describe pods ssx-nginx-dm-d9cd6595-6wnz2 -n ssx-nginx-ns

Pod启动成功以后 k8s内部会分配一个ip,只能内部访问,外部无法访问.
基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第2张图片

创建service(ymal方式创建)

默认创建的pod是只能对内访问的,所以需要创建一个对外的访问端口,创建一个service其实就是暴露对外的访问端口

touch service.yaml
vim service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
   app: nginx
  name: ssx-nginx-sv
  namespace: ssx-nginx-ns
spec:
  ports:
  - port: 9000 #我暂时不理解,这个设置 明明没用到?
    name: ssx-nginx-last
    protocol: TCP
    targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了
    nodePort: 31090 #外网访问的端口
  selector:
    app: nginx
  type: NodePort

kubectl create -f service.yaml

在这里插入图片描述
查看:
kubectl get services、 kubectl get svc 都是一样的效果.

kubectl get svc -n ssx-nginx-ns

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第3张图片
访问:

curl  10.108.93.169:9000

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第4张图片

动态弹性伸缩 动态的回滚和滚动更新

对于kubernetes来说Pod是资源调度最小单元,kubernetes主要的功能就是管理多个Pod,Pod中可以包含一个或多个容器,而kubernetes是如可管理多个Pod的呢?对,没错,就是通过控制器,比如Deployment和ReplicaSet(rs)。
基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第5张图片

弹性伸缩pod 自我修复和负载均衡

查看副本数:

kubectl get deployments -n ssx-nginx-ns

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第6张图片
增加副本:
命令语法:
scale [–resource-version=version] [–current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)

kubectl scale deployments/ssx-nginx-dm --replicas=3 -n ssx-nginx-ns

查看deployments 数:

kubectl get deployments -n ssx-nginx-ns

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第7张图片
通过 kubectl get pods -n ssx-nginx-ns 可以看到当前的 Pod 也增加到了 3 个:每次请求发送到不同的 Pod,3 个副本轮训处理,这样就实现了负载均衡。
基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第8张图片
删除一个pod

kubectl delete po ssx-nginx-dm-d9cd6595-s2pv4 -n  ssx-nginx-ns

在这里插入图片描述
因为 Kubernetes 是声明式 API,所以删掉了之后,Pod API 对象就与预期的不一致了,所以会自动重新创建 Pod 保持与预期一致:
基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第9张图片
但是如果ReplicaSet 管理的 Pod 对象很多的话,那么要一个个手动删除,会很麻烦,所以可以使用:
kubectl delete replicaset {rs_name} -n {namespace}

要 scale down 也很方便,下面将删除一个副本(副本数变为 1)

kubectl scale deployments/ssx-nginx-dm --replicas=1  -n ssx-nginx-ns

Rolling Update(灰度发布和回滚)

Rolling Update 会边启动新的 Pod 边停止旧的 Pod,比如 replicas 是 3,然后有一个 Service 连着这三个 Pod,那么在做 Rolling Update 的时候,会先启动一个新版本的 Pod,并且这个 Pod 也会连上 Service,然后停掉其中一个旧的 Pod,再启动新版本的 Pod,再停止旧的 Pod,如此循环,直到 3 个 Pod 都是新版的为止。

更新镜像的语法

可以不用使用yml配置文件, 直接替换镜像版本:
kubectl set image deployment =
去搜一个nginx的版本,其他镜像也是同理,选择你需要的版本。

kubectl set image deployment/ssx-nginx-dm ssx-nginx-c=nginx:1.14.0 -n ssx-nginx-ns

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第10张图片
通过 kubectl get pods 可以观察滚动更新的过程,可以看到 老版本nginx版本 的 Pod 被逐个删除,同时启动了新的 1.14.0版本的 Pod。

基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第11张图片
基于k8s实现动态弹性伸缩 动态的回滚和滚动更新_第12张图片
回滚到上一个版本:

kubectl rollout deployment/ssx-nginx-dm -n ssx-nginx-ns

也可以使用 --revision参数指定某个历史版本:

kubectl rollout undo deployment/ssx-nginx-dm --to-revision=2 -n ssx-nginx-ns

如果想知道历史版本镜像,可以通过这个命令:

kubectl rollout history deployment/ssx-nginx-dm -n ssx-nginx-ns

项目下线,即删除对应deployment与service资源:

kubectl delete deployment nginx
kubectl delete svc nginx

你可能感兴趣的:(docker,k8s,harbor,gitlab,Linux运维,Nginx,kubernetes,docker,运维)