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
2.复制一个作为版本二
def index(request):
hostname = socket.gethostname()
return JsonResponse(f'主机名:{hostname}, 版本:V2', safe=False, json_dumps_params={'ensure_ascii': False})
3.制作镜像并上传到仓库
3.1上传到linux
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
3.4 同上构建第二个镜像,并验证
二、动态扩容
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
修改为三个节点,保存并退出
已经看到结果了,地址也发生了变化
三、滚动更新
kubectl edit deployments.apps test-django
保存退出,并重新部署
kubectl apply -f svc.yaml
----------------------------------------------------------------
四、删除deployment
由于deployment的机制,我们只能采取缩容的机制才能退出