Day05 deployment operation (rolling update, shrinking and expanding)
One, rolling update
1. Preparations (mirror production)
The following preparatory work is to make two different versions of the mirror, students who don’t want to do it can pull the mirror I made directly without doing it
registry.cn-hangzhou.aliyuncs.com/k8s2me/django:v1
registry.cn-hangzhou.aliyuncs.com/k8s2me/django:v2
1.1 Create a Django project
Modify setting configuration
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'),
# }
# }
Write a view
def index(request):
hostname = socket.gethostname()
return JsonResponse(f'主机名:{hostname}, 版本:V1', safe=False, json_dumps_params={
'ensure_ascii': False})
# 编码和显示
Configure routing
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
]
Check ok
2. Copy one as version two
def index(request):
hostname = socket.gethostname()
return JsonResponse(f'主机名:{hostname}, 版本:V2', safe=False, json_dumps_params={
'ensure_ascii': False})
3. Make a mirror image and upload it to the warehouse
3.1 upload to linux
3.2 Writing 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 build image
docker build -t django01:v1 . # 打开当前目录下的Dockerfield 构建django01:v1镜像
3.4 Run and access
[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 Build a second image as above and verify
Two, dynamic expansion
2.1 Write the controller
# 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 Deploy and view
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 Monitoring and expansion
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"
Expansion
kubectl edit deployments.apps test-django
Modify to three nodes, save and exit
I have seen the result and the address has changed
Three, rolling update
kubectl edit deployments.apps test-django
Save and exit, and redeploy
kubectl apply -f svc.yaml
----------------------------------------------------------------
Fourth, delete deployment
Due to the deployment mechanism, we can only use a shrinking mechanism to exit