Day05 deployment操作(滚动更新,缩容扩容)

一、滚动更新

1.准备工作(镜像制作)

以下准备工作是制作两个版本不同的镜像,不想做的同学可以不做直接拉取我制作好的镜像

registry.cn-hangzhou.aliyuncs.com/k8s2me/django:v1

registry.cn-hangzhou.aliyuncs.com/k8s2me/django:v2

1.1 创建Django项目
修改setting配置
ALLOWED_HOSTS = ['*']

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',  # session 注释掉  不然csrf_token验证
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 不用数据库 注释掉
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }
写一个view
def index(request):
    hostname = socket.gethostname()
    return JsonResponse(f'主机名:{hostname}, 版本:V1', safe=False, json_dumps_params={'ensure_ascii': False})    
# 编码和显示
配置路由
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
]
检查一下ok

image-20201209223045133

2.复制一个作为版本二

def index(request):
    hostname = socket.gethostname()
    return JsonResponse(f'主机名:{hostname}, 版本:V2', safe=False, json_dumps_params={'ensure_ascii': False})   

3.制作镜像并上传到仓库

3.1上传到linux

image-20201209224128176

3.2编写Dockerfile
FROM python:3.6

RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/

ADD DjangoV1 DjangoV1


WORKDIR DjangoV1

CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]
3.3构建镜像
docker build -t django01:v1 .  # 打开当前目录下的Dockerfield 构建django01:v1镜像
3.4运行并访问
[root@o ~]# docker run -d -p80:80 django01:v1
f2e406cb7a8b96ef7c46cf77f02a320c9a8e8d6c16e96c17c738f6d80a712213
[root@o ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f2e406cb7a8b        django01:v1         "/bin/sh -c 'cd Djan…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->8000/tcp   gracious_darwin

image-20201209225746865

3.4 同上构建第二个镜像,并验证

image-20201209230118449

二、动态扩容

2.1 编写控制器

# scv.yaml


# 定义资源类型
kind: Deployment
# 定义api版本号
apiVersion: apps/v1
# 定义基础信息
metadata:
  name: test-django
# 定义容器信息
spec:
  # 最少运行数量
  replicas: 1
  # 定义pod模板
  template:
    metadata:
      labels:
        app: test-django
        env: test
    spec:
      containers:
        # 容器名字
        - name: django
          # 容器的镜像源
          image: registry.cn-hangzhou.aliyuncs.com/k8s2me/django:v1
  # 定义选择器
  selector:
    # 精确匹配
    matchLabels:
      app: test-django
---
# Service 是 Kubernetes 对外访问的窗口,针对不同的场景,kubernetes 为我们设置了四种 Service 的类型
kind: Service
apiVersion: v1
metadata:
  name: my-service
  namespace: default
  labels:
    app: nginx
spec:
# NodePort 是将主机 IP 和端口跟 kubernetes 集群所需要暴露的 IP 和端口进行关联,方便其对外提供服务。内
  #部可以通过 ClusterIP 进行访问,外部用户可以通过 NodeIP:NodePort 的方式单独访问每个 Node 上的实例。
  type: NodePort
  selector:
    app: test-django
  ports:
    - port: 80
      # 监听的端口
      targetPort: 80
      # node暴露给外面的端口
      nodePort: 30080

# 上述配置创建一个名称为 "my-service" 的 Service 对象,它会将请求代理到使用 TCP 端口 30080,
# 并且具有标签 "test-django" 的 Pod 上。
# Kubernetes 为该服务分配一个 IP 地址(有时称为 "集群IP"),该 IP 地址由服务代理使用。

2.2 部署并查看

kubectl apply -f scv.yaml

kubectl get pod -o wide
----------------------------------------------------------
NAME                           READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
test-django-6d96c9ddf4-hcln4   1/1     Running   0          45m   10.244.3.4   k8s-node-02   <none>           <none>
# 这里我们看到已经跑起来一个

# 访问
curl 10.244.3.4
----------------------------------------------------------
[root@k8s-master ~]# curl 10.244.3.4
"主机名:test-django-6d96c9ddf4-hcln4, 版本:V1"  # 返回值

2.3 监测并扩容

while true;do curl 127.0.0.1:30080;echo "";sleep 1;done
----------------------------------------------------------
"主机名:test-django-6d96c9ddf4-hcln4, 版本:V1"  # 这里只有一个pod起来  所以只有一个地址
"主机名:test-django-6d96c9ddf4-hcln4, 版本:V1"
"主机名:test-django-6d96c9ddf4-hcln4, 版本:V1"
"主机名:test-django-6d96c9ddf4-hcln4, 版本:V1"
扩容
kubectl edit deployments.apps test-django 

image-20201210230940417

修改为三个节点,保存并退出

image-20201210231013164

已经看到结果了,地址也发生了变化

image-20201210231156172

三、滚动更新

kubectl edit deployments.apps test-django 

image-20201210231433240

保存退出,并重新部署

kubectl apply -f svc.yaml
----------------------------------------------------------------

image-20201210232030002

四、删除deployment

由于deployment的机制,我们只能采取缩容的机制才能退出

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐