应用名称:
dashboard:存放公共
k8s:
- Node:K8s集群计算节点。
- Namespaces:命名空间,用于隔离资源。
- PersistentVolumes(PV):持久卷,存储数据
workload:
- Deployments:无状态应用部署控制器。
- DaemonSets:守护进程控制器,在每个节点启动一个Pod。
- StatefulSets:有状态应用部署控制器。
- Pods:K8s最小部署单元
loadbalancer:
- Services:为Pod提供服务发现和负载均衡。
- Ingresses:集群中应用统一入口,对外暴露应用
storage:
- PersistentVolumeClaims(PVC):持久卷申请,与PV绑定。
- ConfigMaps:存储配置内容,例如应用程序配置文件。
- Secrets:存储应用敏感数据,例如用户名密码
登录认证流程:
- 验证token登录验证逻辑。若输入的token是正确有效的,则会将token写入到数据库中的session保存,方便下次登录。
1.根据布局创建对象的django 应用。
python manage.py startapp dashboard
python manage.py startapp k8s
python manage.py startapp workload
python manage.py startapp loadbalancer
python manage.py startapp storage
2.启用django默认数据库,用于保存session状态。
python manage.py makemigrations
python manage.py migrate
3.验证代码。
##########################################################
##自定义模块。
from kubernetes import client,config
import os
#连接k8s验证输入的token或者kubeconfig是否有效。
def auth_check(auth_type,token):
if auth_type == "token":
configuration = client.Configuration()
configuration.host = "https://192.168.161.120:6443" # APISERVER地址
# ca_file = os.path.join(os.getcwd(), "ca.crt") # K8s集群CA证书(/etc/kubernetes/pki/ca.crt)
# configuration.ssl_ca_cert= ca_file
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + token} ##固定格式。
client.Configuration.set_default(configuration)
apps_api = client.AppsV1Api()
try:
core_api = client.CoreApi()
core_api.get_api_versions() # 查看8s版本,由此验证是否有效的
return True
except Exception as e:
print(e)
return False
elif auth_type == "kubeconfig":
pass
##########################################################
##视图逻辑。
from django.shortcuts import render
from Layui import k8s ##导入自定义模块。
from django.http import JsonResponse
def index(request):
return render(request,'index.html')
def login(request):
if request.method == "GET":
return render(request,'login.html')
elif request.method == "POST":
token =request.POST.get("token")
#处理token登录。
if token:
if k8s.auth_check("token",token): # 如token是有效登录成功
request.session['is login'] = True
request.session['auth_type'] = token # 用于后期前端调用django,django拿这个信息去请k8s api
request.session['token'] = token
code = 0
msg = "登录成功"
else:
code = 1
msg = "Token无效!"
else:
#处理kubeconfig文件登录。
file_obj = request.FILES.get("file")
result = {'code': code,'msg': msg}
return JsonResponse(result)
##########################################################
##子模板文件。
登录
{% csrf_token %}
欢迎访问Kubernetes管理平台
##########################################################
##母版文件。
{% block title %}{% endblock %}
-
仪表盘
-
Kubernetes
-
Workload
- Deployment
- DaemonSet
{# - 超链接
#}
{# #}
{# - click menu item
#}
{# - the links
#}
{% block context%}{% endblock %}
{% block custom_js %}{% endblock %}
4.token验证,查看数据库是否保存了token信息。
5.验证数据库中的session保存的返回信息。
- 验证使用正确的kubeconfig文件登录,则会登录到主页。
1.自定义一个类,在数据库中创建一张表,用于保存kubeconfig文件内容。
#######################################################
##生成一张数据库表,用于保存kubeconfig文件内容。dasshboard/models下定义一个类。
from django.db import models
class User(models.Model):
auth_type = models.CharField(max_length=30)
token = models.CharField(max_length=100)
content = models.TextField()
datetime = models.DateTimeField(auto_now=True)
#######################################################
##同步数据库。settings文件添加如下一行。
INSTALLED_APPS = [
......
'dashboard'
]
python manage.py makemigrations
python manage.py migrate
import requests
from django.shortcuts import render,redirect
from Layui import k8s ##导入自定义模块。
from django.http import JsonResponse
from dashboard.models import User
def login(request):
if request.method == "GET":
return render(request,'login.html')
elif request.method == "POST":
token =request.POST.get("token")
#处理token登录。
if token:
if k8s.auth_check("token",token): # 如token是有效登录成功
request.session['is_login'] = True
request.session['auth_type'] = 'token' # 用于后期前端调用django,django拿这个信息去请k8s api
request.session['token'] = token
code = 0
msg = "登录成功"
else:
code = 1
msg = "Token无效!"
else:
#处理kubeconfig文件登录。
file_obj = request.FILES.get("file")
import random
token_random = str(random.random()).split('.')[1] ##生成一个随机数作为标识。
try:
content = file_obj.read().decode() ##bytes ——> str
User.objects.create(
auth_type="kubeconfig",
token=token_random,
content=content
)
code = 0
msg = "登陆成功"
except Exception:
code = 1
msg = "kubeconfig文件错误!"
if k8s.auth_check('kubeconfig',token_random):
request.session['is_login'] = True
request.session['auth_type'] = 'kubeconfig' # 用于后期前端调用django,django拿这个信息去请k8s api
request.session['token'] = token_random
code = 0
msg = "登陆成功"
else:
User.objects.get(token=token_random).delete()
code = 1
msg = "kubeconfig文件无效!!!"
result = {'code': code,'msg': msg}
return JsonResponse(result)
3.修改自定义模块类。
from kubernetes import client,config
import os
from dashboard.models import User
import yaml
# 连接k8s验证输入的token或者kubeconfig是否有效。
def auth_check(auth_type,token=None):
if auth_type == "token":
configuration = client.Configuration()
configuration.host = "https://192.168.161.120:6443" # APISERVER地址
# ca_file = os.path.join(os.getcwd(), "ca.crt") # K8s集群CA证书(/etc/kubernetes/pki/ca.crt)
# configuration.ssl_ca_cert= ca_file
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + token} ##固定格式。
client.Configuration.set_default(configuration)
apps_api = client.AppsV1Api()
try:
core_api = client.CoreApi()
core_api.get_api_versions() # 查看8s版本,由此验证是否有效的
return True
except Exception as e:
print(e)
return False
elif auth_type == "kubeconfig":
user = User.objects.get(token=token)
content = user.content
yaml_content = yaml.load(content, Loader=yaml.FullLoader) ##yaml文件转为json
print(yaml_content)
try:
config.load_kube_config_from_dict(yaml_content)
core_api = client.CoreApi()
core_api.get_api_versions() # 查看k8s版本,由此验证是否有效的
return True
except Exception as e:
print(e)
return False
4.使用正确的Kubeconfig文件登陆成功,其他文件登陆失败。
- 引用装饰器,使得访问127.0.0.1:8000也是登录页面,而不是首页。
1.在自定义模块文件中添加。
from django.shortcuts import redirect
def self_login_required(func):
def inner(request, *args, **kwargs):
is_login = request.session.get('is_login', True)
if is_login:
return func(request, *args, **kwargs)
else:
return redirect("/login")
return inner
2.首页引用装饰器。
@k8s.self_login_required
def index(request):
return render(request,'index.html')